Компилирайте и проверете за "гърмежи" следните кодове:
Приложение на функцията w2d (или как да си пишем собствени ф-ции) да "усеща" числата от тип int - програмата я ползва макар и само на едно място - но така main е по-четивна...
Код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
int w2d(char *w)
{int n; char *ww;
n=atoi(w);
itoa(n,ww,10);
return strcmp(w,ww);
}
void main()
{char *t;
while(1)
{
gets(t);
if(w2d(t))puts("err");
else puts(t);
}
}
Това е програмата, върху която се "борихме" вчера. Реализацията е без собствена функция... Също така и не отчита данните по позиция... Но работи... Идеята за w2d (word to data) се роди в момента, в който се видя, че един и същи код тр. да се използва два пъти в main... (заради двойния начин на употреба на strtok...)
Код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
void main()
{FILE *fpi, *fpo;
int dat;
char rd[1000], *wrd, *wrdd;
fpi=fopen("inpdata.dat","r");
fpo=fopen("outdata.dat","w");
while(!feof(fpi))
{
fgets(rd,1000,fpi);
wrd=strtok(rd," ,;\t\n");
if(wrd)
{
dat=atoi(wrd);
itoa(dat,wrdd,10);
if(strcmp(wrd,wrdd))printf("Data error: %s\n",wrd);
else fprintf(fpo,"%s\n",wrd);
}
for(;wrd;)
{
wrd=strtok(NULL," ,;\t\n");
if(wrd)
{
dat=atoi(wrd);
itoa(dat,wrdd,10);
if(strcmp(wrd,wrdd))printf("Data error: %s\n",wrd);
else fprintf(fpo,"%s\n",wrd);
}
}
}
fclose(fpi);
fclose(fpo);
getch();
}
Ако трябва да се дефинира условие на задачата от вчера, то би изглеждало така:
Да се напише програма, която чете данни от текстов файл. Валидните (от тип int) данни прехвърля в друг текстов файл а за невалидните съобщава в конзолата...
Екстри: Да отчита и поредния номер на невалидните данни...
Ето и реализацията чрез ползване на w2d:
Код:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
int w2d(char *w)
{int n; char ww[10];
n=atoi(w);
itoa(n,ww,10);
return strcmp(w,ww);
}
int main()
{FILE *fpi, *fpo;
char rd[1000], *wrd;
int cnt=1;
fpi=fopen("yyy.txt","r");
fpo=fopen("zzz.txt","w");
while(!feof(fpi))
{fgets(rd,1000,fpi);
wrd=strtok(rd," ,;\t\n");
if(wrd)
{if(w2d(wrd))
{printf("Over Data %d Error: ",cnt); puts(wrd);}
else {fputs(wrd,fpo); fputs("\n",fpo);}
cnt++;}
while(wrd)
{wrd=strtok(NULL," ,;\t\n");
if(wrd)
{if(w2d(wrd))
{printf("Over Data %d Error: ",cnt); puts(wrd);}
else {fputs(wrd,fpo); fputs("\n",fpo);}
cnt++;}
}
}
fclose(fpi);
fclose(fpo);
getch();
return 0;
}
Заради двойния характер на strtok отново има повторение на код, но не е толкова много.
Хайде, нека някой се опита да опише с думи принципът на работа на w2d да видим дали е разбран правилно и изобщо...
Един проблем възникна в последната програма: Във w2d от
char *ww; промених на
char ww[10];Иначе гърмеше здраво, че и със
Send Error, на което давах
Don't Send...