Удаление строки с наибольшим количеством разных символов - 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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д