Оставить в файле только те фразы, которые содержат не менее трех - 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;
}

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

  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
Похожие ответы