Удаление строки с наибольшим количеством разных символов - C (СИ)

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

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

Всем привет, многие недели бьюсь над загадкой следующего задания: "Скопировать содержимое текстового файла, удалив строку с наибольшим кол-вом разных символов.". Совместив одну, другую, третью программы, а так же функции из библиотеки string.h я почти смог добиться результата, но не тут-то было. Невиданные ранее ошибки нанесли ответный удар. А потом ещё удар. И ещё. Сил нет, помогите пожалуйста. Логика моей программы: считываем файл, в нём в каждой строке считаем каждое первое появление каждого символа. Сумму этих появлений записываем в переменную. Если разных символов в строке получилось больше, чем в переменной, в которой мы храним это кол-во, значит в другую переменную записываем строчку. И так цикл проходит все строчки в файле, а потом выводит все строки, кроме той, в которой больше всего разных символов. Ну, я хотел бы, чтобы оно так работало. Но не работает.

Спасите.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main( )
{
FILE *f1,*f2,*f3;
int ch;
int st;
int st2;
int stmax = 0;
char maxline[255];
char str[50];
 
if ((f1 = fopen("first.txt","r")) == NULL)
{
 fprintf(stdout, "Error opening file first.txt");
 exit(1);
}
if ((f2 = fopen("second.txt","w")) == NULL)
{
 fprintf(stdout, "Error opening file second.txt");
 exit(1);
}
if ((f3 = fopen("second.txt","r")) == NULL)
{
 fprintf(stdout, "Error opening file second.txt");
 exit(1);
}
 
printf("Before:\n");
while (feof(f1)==0)
   {
      st = fgets(str,sizeof(str),f1);
 
      int i;
      int count1;
      for (i = 0; i <strlen(st); ++i)
      {
      char * pch;
      int count2 = 0;
      pch=strchr(st,st[i]);
      if (pch != NULL)
      {
          if (count2 == 0)
          {
              count1 += 1;
              count2 += 1;
          }
      }
 
      }
      if (stmax < count1)
      {
         maxline = st;
      }
      fputs(st,f2);
      fputs(st,stdout);
   }
fclose(f2);
 
printf("\n");
printf("\n");
printf("After:\n");
while (feof(f3)==0)
   {
      st2 = fgets(str,sizeof(str),f3);
      if (st2 == maxline)
      {
 
      }
      else
      {
         printf ("%s", st2);
      }
   }
 
fclose(f1);
fclose(f3);
}

Решение задачи: «Удаление строки с наибольшим количеством разных символов»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
 
int main()
{
    FILE *fin, *fout;
    int i, j, flag = 0, nc = 0, max = 0, ns = 1, str;//nc - счетчик неповторяющихся символов
    char s[80];                                      //ns - счетчик строк
    fin = fopen("input.txt", "r");
    fout = fopen("output.txt", "w");
    while(fgets(s, 80, fin)){
        for(i = 0; i < strlen(s) - 2; i++){
            for(j = 0; j < strlen(s) - 1; j++){
                if(s[i] == s[j] && i != j)//в цикле проверяем каждый элемент строки на повторяемость
                    flag = 1;
            }
            if(flag == 0)//если символ не повторяется
                nc++;//счетчик увеличивается на 1
            else
                flag = 0;
        }
        if(max < nc){//ищем максимальное кол-во неповторяемых символов
            max = nc;
            str = ns;//записываем в какой строке max
        }
        ns++;
        nc = 0;
    }
    ns = 1;
    fclose(fin);
    fin = fopen("input.txt", "r");
    while(fgets(s, 80, fin)){//повторно считываем исходный файл
        if(ns != str)//и,за исключением строки с max,
            fputs(s, fout);//печатаем его в выходной файл
        ns++;
    }
    fclose(fin);
    fclose(fout);
    return 0;
}

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


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

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

14   голосов , оценка 4.429 из 5
Похожие ответы