Маленький телефонный справочник — добавление данных - C (СИ)
Формулировка задачи:
Доброго вам вечера!
Программка добавляет новые данные в текстовой файл, предварительно считывая имеющиеся данные и переписывает файл с повышение счётчика на +1.
Можно ли по изящнее написать код, без повторного открытия и закрытия?
#include <stdio.h> struct henkilo { char name[20]; char surname[20]; char p_number[20]; } list[50], new; int main() { int i,m; FILE *ru; char *tiedosto = "list.txt"; printf("Введите имя:"); scanf("%s", &new.name[0]); printf("Введите фамилию:"); scanf("%s",&new.surname[0]); printf("Введите т.номер:"); scanf("%s", &new.p_number[0]); if ((ru = fopen(tiedosto, "r")) == NULL) { printf("Ошибка при открытие."); return 0; } else { fscanf(ru, "%d", &m); for(i=0; i<m; i++) { fscanf(ru, "%s %s %s", &list[i].name[0], &list[i].surname[0], &list[i].p_number[0]); } fclose(ru); } if ((ru = fopen(tiedosto, "w")) == NULL) { printf("Ошибка при открытие."); return 0; } else { fprintf(ru, "%d\n", m+1); for(i=0; i<m; i++) { fprintf(ru, "%s %s %s\n", &list[i].name[0], &list[i].surname[0], &list[i].p_number[0]); } fprintf(ru, "%s %s %s\n", new.name, new.surname, new.p_number); } fclose(ru); return 0; }
Решение задачи: «Маленький телефонный справочник — добавление данных»
textual
Листинг программы
int nfound, sfound; nfound = sfound = 0; for (i = 0; i<SIZE; i++) { N[i] = strcmp(list[i].name, list[SIZE].name); S[i] = strcmp(list[i].surname, list[SIZE].surname); if (!nfound && N[i] == 0) nfound = 1; if (!sfound && S[i] == 0) sfound = 1; if (N[i] == S[i] && N[i] == 0 && S[i] == 0) { SIZE--; } }
Объяснение кода листинга программы
В этом коде выполняется поиск дубликатов в списке. Вот пошаговое объяснение:
- Создаются две переменные,
nfound
иsfound
, которые инициализируются нулем. Они используются для отслеживания, было ли найдено совпадение для имени и фамилии соответственно. - Запускается цикл
for
, который проходит по всем элементам списка. - Внутри цикла сравниваются имена и фамилии текущего элемента со следующим элементом. Результаты сравнения сохраняются в массивах
N
иS
соответственно. - Если текущий элемент имеет одинаковое имя с следующим элементом и их имена не были найдены ранее, то переменная
nfound
устанавливается в единицу. Аналогично, если текущий элемент имеет одинаковую фамилию с следующим элементом и их фамилии не были найдены ранее, то переменнаяsfound
устанавливается в единицу. - Если имена текущего и следующего элементов совпадают, а также имена и фамилии текущего элемента не были найдены ранее, то переменная
SIZE
уменьшается на единицу, чтобы удалить дубликат. - Цикл продолжается до тех пор, пока все элементы списка не будут проверены.
- В конце кода
nfound
иsfound
выводятся на экран. Они представляют собой количество элементов, которые имеют одинаковые имена и фамилии соответственно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д