Структуры

Тема в разделе "C/C++/C#", создана пользователем vlada, 5 окт 2014.

  1. vlada

    vlada New Member

    Регистрация:
    5 окт 2014
    Сообщения:
    3
    Симпатии:
    0
    В записной книжке указаны фамилии и номера телефонов 30 человек. Составить программу, которая определяет, есть ли в записной книжке информация о человеке с заданным номером телефона и, если есть, выводит фамилию. В общем написала я кусочек программы, дальше мой моск сломался и я решила попросить помощи у сенсеев. Я просто не понимаю с чего начать писать основное, может какой-нибудь добрый человек просто объяснит мне:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>
    struct adbook{
    char sname[15];
    unsigned numb[3];};
    int main(){ int i,j;
    clrscr(); FILE *f;adbook peop[30];
    if((f=fopen("fam.txt","rt"))==NULL)
    {printf("nichego");
    getch();return 0;}
    else......... ну тут так то вроде правильно...
     
  2. Evgeniy

    Evgeniy Member

    Регистрация:
    23 авг 2014
    Сообщения:
    16
    Симпатии:
    0
    Я так понимаю данные у вас в программе заполняются с текстового файла или как?
    Можно попробовать через связный список сделать. Как то так, навскидку
    Код (C++):
    struct Info_People
    {
    std::string name;
    int nuber;
    Info_People *next;
    };

    void set_struct(const std::string &name, const int &number, Info_People **begin)
    {
    Info_People *first = new Info_People;
    Info_People *end = first;
    end->name = name;
    end->nuber = number;
    end->next = NULL;
    *begin = first;

    for(;;)//условие
    {
    //Тело цикла. Можно дальше инициализировать список
    //хотя 30 раз вписывать номер и имя проблематично будет
    }
    }

    void show(Info_People *first)
    {
    Info_People* ptr = first;
    while (ptr)
    {
    cout << ptr->name << endl << ptr->nuber;
    ptr = ptr->next;
    }
    }

    void main()
    {
    Info_People *first = NULL;
    set_struct("Eugene", 89525, &first);
    show(first);*/
    }
     
  3. vlada

    vlada New Member

    Регистрация:
    5 окт 2014
    Сообщения:
    3
    Симпатии:
    0
    да с текстового :)
    создаем список людей в С и изменяем расширение на .txt
    я просто не пойму это же надо каждое число в списке перебирать с помощью цикла?):
     
  4. Evgeniy

    Evgeniy Member

    Регистрация:
    23 авг 2014
    Сообщения:
    16
    Симпатии:
    0
    Можно попробовать с помощью цикла while, пока не конец файла, сравнивать строки посимвольно. Как это сделать по другому я не нашел.
    Например создать одну строку как образец искомого объекта и поочередно сравнивать её со строками из файла.
    Потом поле структуры заполнить найденной фамилией или вывести сообщение, что такого пользователя в БД нет.

    Что то вроде:
    Открыть файл
    Если файл не открылся - вывести сообщение об этом и завершить программу. Ибо условие не предполагает заполнения файла с программы, файл уже должен быть
    В while запихнуть if который и будет сравнивать. В плюсах это было бы if(fin.getline(buf,18) == str). getline получает строку определенной длины и сравнивает с нашим образцом. fin - это объект класса ifstream, в С так не выйдет :(

    Если в номере не должно быть "-" или чего либо еще, то строка не нужна. Тогда задание немного упрощается. И все, что я написал выше нужно делать не со строками, а с простыми числами.
     
  5. Evgeniy

    Evgeniy Member

    Регистрация:
    23 авг 2014
    Сообщения:
    16
    Симпатии:
    0
    В общем, сделал я вашу задачу в С++. Посмотрите что да как и переделаете на С, может и алгоритм, заодно, поинтересней придумаете.
    Код (C++):
    #include <fstream>
    #include <iostream>

    struct Info_people
    {
    char name[18];
    char number[18];
    };

    void main()
    {
    std::ifstream fin_name("Name.txt"); //Создаем переменную(объект) которую привязываем к файлу.
    std::ifstream fin_number("Number.txt"); //Практически тоже самое FILE в C

    char name_user[18]; //Масив символов для поиска пользователя по имени
    std::cout << "Enter name user: "; //Вывод сообщения на экран(косоль). Аналогично printf() в С.
    std::cin.getline(name_user,18); //Получаем массив name_user длиной 18 элементов. Про getline() можно в инете почитать

    Info_people p; //Экземпляр нашей структуры. Хотя не совсем ясно зачем оно тут, но раз у вас в коде было...

    while(!fin_name.eof() || !fin_number.eof()) //Цикл пока не конец файла name.txt или number.txt
    {
    fin_name.getline(p.name,18); //Считываем строку из файла в наш массив
    fin_number.getline(p.number,18); //Аналогично и для номеров
    if(std::strcmp(p.name,name_user) == 0) //strcmp сверяет строки и если они одинаковы то возращает 0.
    {
    fin_name.close(); //Когда это условие выполнилось, то мы закрываем файл
    fin_number.close();
    break;//И выходим из цикла даже если не конец файла
    }
    }

    std::cout << "User number found: " << p.number << std::endl; //Выводим номер найденного пользователя
    std::cout << "User name found: " << p.name << std::endl; //И его имя


    std::cin.get(); //Для задержки экрана. Для С прийдется переделать
    }
    Если вы пользуетесь MS Visual Studio, то как создать проект по С++, думаю, знаете. Ну, или в интернете поищите.
    Посмотреть вложение Info_People.rar
    Это два файла которые я использовал для отладки проекта. Закиньте их сюда "...\Visual Studio 2012\Projects\Info_People\Info_People" и потестируйте программу. Их я прикрепил для того, что бы вы увидели как я заполнял файлы и полностью поняли работу кода, что бы переделать его на С.

    Ну и если какие то вопросы по коду возникнут, то спрашивайте в этой теме. Буду периодически её мониторить.
     
  6. Evgeniy

    Evgeniy Member

    Регистрация:
    23 авг 2014
    Сообщения:
    16
    Симпатии:
    0
    Странно, что я не могу редактировать свое же сообщение по этому придется писать новое.
    В прикрепленном архиве уберите в имени файлов 1, что бы все работало.
     
  7. vlada

    vlada New Member

    Регистрация:
    5 окт 2014
    Сообщения:
    3
    Симпатии:
    0
    золотой вы человек :) спасибо
     
Загрузка...
Похожие Темы - Структуры
  1. TSoprano
    Ответов:
    1
    Просмотров:
    1.012
  2. Anastasia18
    Ответов:
    1
    Просмотров:
    1.207
  3. b0006
    Ответов:
    0
    Просмотров:
    1.177
  4. dimat
    Ответов:
    0
    Просмотров:
    2.294
  5. ricco
    Ответов:
    3
    Просмотров:
    3.176

Поделиться этой страницей