• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Структуры

  • Автор темы vlada
  • Дата начала
V

vlada

В записной книжке указаны фамилии и номера телефонов 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......... ну тут так то вроде правильно...
 
E

Evgeniy

Я так понимаю данные у вас в программе заполняются с текстового файла или как?
Можно попробовать через связный список сделать. Как то так, навскидку
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);*/
}
 
V

vlada

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

Evgeniy

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

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

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

Evgeniy

В общем, сделал я вашу задачу в С++. Посмотрите что да как и переделаете на С, может и алгоритм, заодно, поинтересней придумаете.
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" и потестируйте программу. Их я прикрепил для того, что бы вы увидели как я заполнял файлы и полностью поняли работу кода, что бы переделать его на С.

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

Evgeniy

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!