Оставить в файле только те фразы, которые содержат не менее трех - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток. Нужна ваша помощь. Я написал программу под задачу: Дан файл, содержащий некоторый текст. Оставить в этом файле только те фразы, которые содержат не менее трех. Но она не правильно работает. Подскажите, пожалуйста, в чем проблема? Код программы:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <locale.h>
  5. int poisk(char *);
  6. int main(int argc, char *argv[])
  7. {setlocale(LC_ALL,"Rus");
  8. FILE *f1,*f2;
  9. char str[100],file[30];
  10. int len=0,c;
  11. if(argc==1)
  12. {
  13. printf("Введите путь к файлу:\n");
  14. gets(file);
  15. }
  16. else
  17. strcpy(file,argv[1]);
  18. if(((f1=fopen(file,"r"))==NULL))
  19. {
  20. perror("Ошибка открытия файла");
  21. system("pause");
  22. return 1;
  23. }
  24. if(((f2=fopen("output.txt","w"))==NULL))
  25. {
  26. perror("Ошибка открытия файла");
  27. system("pause");
  28. return 1;
  29. }
  30. do
  31. {
  32. c=fgetc(f1);
  33. if((c=='.')||(c==EOF))
  34. {
  35. *(str+len)= (c=='.')?'.':' ';
  36. *(str+len+1)='\0';
  37. if(poisk(str))
  38. fprintf(f2,"%s",str);
  39. len=0;
  40. }
  41. else
  42. {
  43. *(str+len)=c;
  44. len++;
  45. }
  46. }
  47. while(c!=EOF);
  48. fclose(f1);
  49. fclose(f2);
  50. system("pause");
  51. return 0;
  52. }
  53. int poisk(char *str)
  54. {
  55. char *istr,sep[]=" \n";
  56. int i,a=0;
  57. istr=strtok(str,sep);
  58. while(istr!=NULL)
  59. {
  60. for(i=0;*(istr+i)!=0;i++)
  61. if(*(istr+i)==' ' || *(istr+i)==',' || *(istr+i)==':' || *(istr+i)==';'||*(istr+i)=='-')
  62. a++;
  63. istr=strtok(NULL,sep);
  64. if(istr != NULL)
  65. *(istr-1)=' ';
  66. if(a<3)
  67. return 0;
  68. a=0;
  69. }
  70. return 1;
  71. }

Решение задачи: «Оставить в файле только те фразы, которые содержат не менее трех»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <locale.h>
  5.  
  6. int poisk(char *);
  7.  
  8. int main()
  9. {
  10.     setlocale(LC_ALL,"Rus");
  11.     FILE *f1,*f2;
  12.     char str[100];
  13.     int len=0;
  14.     char c;
  15.     if(((f1=fopen("С:\\file1.txt","r"))==NULL))
  16.     {
  17.         perror("Error opening file");
  18.         return 1;
  19.     }
  20.     if(((f2=fopen("С:\\file2.txt","w"))==NULL))
  21.     {
  22.         perror("Error opening file");
  23.         return 1;
  24.     }
  25.     do
  26.     {
  27.         c = fgetc(f1);
  28.         if((c=='.')||(c==EOF))
  29.         {
  30.             *(str+len) = (c=='.')?'.':' ';
  31.             *(str+len+1)='\0';
  32.             if(poisk(str))
  33.                 fprintf(f2,"%s",str);
  34.             len=0;
  35.         }
  36.         else
  37.         {
  38.             *(str+len)=c;
  39.             len++;
  40.         }
  41.     }
  42.     while(c!=EOF);
  43.     fclose(f1);
  44.     fclose(f2);
  45.     return 0;
  46. }
  47. int poisk(char *str)
  48. {
  49.     int i=0;
  50.     int a=0;
  51.     while(str[i]!='\0')
  52.     {
  53.         if((str[i]==' ')||(str[i]==',')||(str[i]==':')||(str[i]==';')||(str[i]=='-'))
  54.         {
  55.             a++;
  56.         }
  57.         i++;
  58.     }
  59.     if(a<3)
  60.         return 0;
  61.     a=0;
  62.     return 1;
  63. }

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Определяются функции main и poisk
  3. Устанавливается русская локаль
  4. Открываются файлы f1 и f2 для чтения и записи соответственно
  5. Переменная len инициализируется нулем, а переменная c получает значение от fgetc(f1)
  6. Если c - это точка или EOF, то выполняется блок кода:
    • Если c - это точка, то в str добавляется точка, иначе пробел
    • В str добавляется нулевой символ
    • Вызывается функция poisk с аргументом str
    • Если функция poisk вернула 1, то в f2 записывается содержимое str
    • Переменная len обнуляется
  7. Если c - это не точка или EOF, то выполняется блок кода:
    • В str добавляется значение c
    • Переменная len увеличивается на единицу
  8. Цикл do-while выполняется до тех пор, пока c не станет равным EOF
  9. Файлы f1 и f2 закрываются
  10. Функция main возвращает 0, что означает успешное выполнение программы
  11. В функции poisk инициализируется переменная i нулем, а переменная a - нулем
  12. В цикле while выполняется проверка, пока str[i] не станет равным нулю:
    • Если str[i] равен пробелу, запятой, двоеточию, точке с запятой или минусу, то переменная a увеличивается на единицу
    • Переменная i увеличивается на единицу
  13. Если a меньше трех, то функция poisk возвращает 0
  14. Переменная a обнуляется, а функция poisk возвращает 1

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы