Оставить в файле только те фразы, которые содержат не менее трех - C (СИ)
Формулировка задачи:
Всем доброго времени суток. Нужна ваша помощь. Я написал программу под задачу: Дан файл, содержащий некоторый текст. Оставить в этом файле только те фразы, которые содержат не менее трех. Но она не правильно работает. Подскажите, пожалуйста, в чем проблема?
Код программы:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int poisk(char *); int main(int argc, char *argv[]) {setlocale(LC_ALL,"Rus"); FILE *f1,*f2; char str[100],file[30]; int len=0,c; if(argc==1) { printf("Введите путь к файлу:\n"); gets(file); } else strcpy(file,argv[1]); if(((f1=fopen(file,"r"))==NULL)) { perror("Ошибка открытия файла"); system("pause"); return 1; } if(((f2=fopen("output.txt","w"))==NULL)) { perror("Ошибка открытия файла"); system("pause"); return 1; } do { c=fgetc(f1); if((c=='.')||(c==EOF)) { *(str+len)= (c=='.')?'.':' '; *(str+len+1)='\0'; if(poisk(str)) fprintf(f2,"%s",str); len=0; } else { *(str+len)=c; len++; } } while(c!=EOF); fclose(f1); fclose(f2); system("pause"); return 0; } int poisk(char *str) { char *istr,sep[]=" \n"; int i,a=0; istr=strtok(str,sep); while(istr!=NULL) { for(i=0;*(istr+i)!=0;i++) if(*(istr+i)==' ' || *(istr+i)==',' || *(istr+i)==':' || *(istr+i)==';'||*(istr+i)=='-') a++; istr=strtok(NULL,sep); if(istr != NULL) *(istr-1)=' '; if(a<3) return 0; a=0; } return 1; }
Решение задачи: «Оставить в файле только те фразы, которые содержат не менее трех»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int poisk(char *); int main() { setlocale(LC_ALL,"Rus"); FILE *f1,*f2; char str[100]; int len=0; char c; if(((f1=fopen("С:\\file1.txt","r"))==NULL)) { perror("Error opening file"); return 1; } if(((f2=fopen("С:\\file2.txt","w"))==NULL)) { perror("Error opening file"); return 1; } do { c = fgetc(f1); if((c=='.')||(c==EOF)) { *(str+len) = (c=='.')?'.':' '; *(str+len+1)='\0'; if(poisk(str)) fprintf(f2,"%s",str); len=0; } else { *(str+len)=c; len++; } } while(c!=EOF); fclose(f1); fclose(f2); return 0; } int poisk(char *str) { int i=0; int a=0; while(str[i]!='\0') { if((str[i]==' ')||(str[i]==',')||(str[i]==':')||(str[i]==';')||(str[i]=='-')) { a++; } i++; } if(a<3) return 0; a=0; return 1; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяются функции main и poisk
- Устанавливается русская локаль
- Открываются файлы f1 и f2 для чтения и записи соответственно
- Переменная len инициализируется нулем, а переменная c получает значение от fgetc(f1)
- Если c - это точка или EOF, то выполняется блок кода:
- Если c - это точка, то в str добавляется точка, иначе пробел
- В str добавляется нулевой символ
- Вызывается функция poisk с аргументом str
- Если функция poisk вернула 1, то в f2 записывается содержимое str
- Переменная len обнуляется
- Если c - это не точка или EOF, то выполняется блок кода:
- В str добавляется значение c
- Переменная len увеличивается на единицу
- Цикл do-while выполняется до тех пор, пока c не станет равным EOF
- Файлы f1 и f2 закрываются
- Функция main возвращает 0, что означает успешное выполнение программы
- В функции poisk инициализируется переменная i нулем, а переменная a - нулем
- В цикле while выполняется проверка, пока str[i] не станет равным нулю:
- Если str[i] равен пробелу, запятой, двоеточию, точке с запятой или минусу, то переменная a увеличивается на единицу
- Переменная i увеличивается на единицу
- Если a меньше трех, то функция poisk возвращает 0
- Переменная a обнуляется, а функция poisk возвращает 1
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д