Маленький телефонный справочник — добавление данных - 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--;
        }
    }

Объяснение кода листинга программы

В этом коде выполняется поиск дубликатов в списке. Вот пошаговое объяснение:

  1. Создаются две переменные, nfound и sfound, которые инициализируются нулем. Они используются для отслеживания, было ли найдено совпадение для имени и фамилии соответственно.
  2. Запускается цикл for, который проходит по всем элементам списка.
  3. Внутри цикла сравниваются имена и фамилии текущего элемента со следующим элементом. Результаты сравнения сохраняются в массивах N и S соответственно.
  4. Если текущий элемент имеет одинаковое имя с следующим элементом и их имена не были найдены ранее, то переменная nfound устанавливается в единицу. Аналогично, если текущий элемент имеет одинаковую фамилию с следующим элементом и их фамилии не были найдены ранее, то переменная sfound устанавливается в единицу.
  5. Если имена текущего и следующего элементов совпадают, а также имена и фамилии текущего элемента не были найдены ранее, то переменная SIZE уменьшается на единицу, чтобы удалить дубликат.
  6. Цикл продолжается до тех пор, пока все элементы списка не будут проверены.
  7. В конце кода nfound и sfound выводятся на экран. Они представляют собой количество элементов, которые имеют одинаковые имена и фамилии соответственно.

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


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

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

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