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