Маленький телефонный справочник — добавление данных - 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выводятся на экран. Они представляют собой количество элементов, которые имеют одинаковые имена и фамилии соответственно.