С, С++, прога со структурами.
Started By Vovil, апр 14 2006 16:35
8 ответов в этой теме
#1
Отправлено 14 апреля 2006 - 16:35
Люди помогите кто-нибудь сделать в С такую программу... Имеется структура: студент - университет - телефон. В прогу вводятся все элементы. Далее вводится универ, студентов которого надо найти, и на экран выводятся имена всех студентов с их телефонами, кто в этом универе. Пожалуйста, напишите код, кому легко и не влом =) Или хотя бы подскажите как сделать, чтоб он сравнивал строчки (универ, который ввели для поиска, с теми универами, что уже ввели раньше). Заранее спасибо.
#4
Отправлено 14 апреля 2006 - 18:56
struct univer { char uname[64]; char student[64]; char phone[16]; }; ... // dopolnitel'nye struktury dannyh ... // naprimer svaznoj spisok struct node { struct node *next; struct node *prev; struct univer *all; }; ... // vydelenie pamjti, i prochee ... // initialize linked list struct node *list = init_list(); read_in(list); //teper' poisk, samyj prostoj, naprimer ... struct node *t = list; while (t != NULL) { // vmesto UNIVER1 mozhno ispol'zovat' schitannuju stroku. if (!strcmp("UNIVER1", t->all->uname)) { printf("Match found for %s:\n\tName: %s\tPhone: %s\n", "UNIVER1", t->all->student, t->all->phone); } t = t->next; } ... //osvobozhdenie pamjati list_free(list);нечто подобное. можно использовать в качестве структуры данных что угодно, бинарные деревья, например. можно сделать такую структуру данных, где елементом будет связной список для одного универа со всеми студентами. вобше по-всякому можно. а самым быстрым способом будет на мой взгляд хеш таблица (см. std::map)
int main(void)
#5
Отправлено 15 апреля 2006 - 02:20
V^v совершенно прав, оптимальный вариант
только в if (!strcmp("UNIVER1", t->all->uname))
я бы заменил strcmp na strcmpi (case non senstive)
Более подробно
struct univer
{
char uname[64];
char student[64];
char phone[16];
};
... // dopolnitel'nye struktury dannyh
... // naprimer svaznoj spisok
struct node
{
struct node *next;
struct node *prev;
struct univer *all;
};
LPVOID init_list()
{
LPVOID Data = malloc(sizeof(node));
memset(Data, 0, sizeof(node));
return Data;
}
struct node *list = init_data();
LPVOID init_list()
{
LPVOID Data = malloc(sizeof(univer));
memset(Data, 0, sizeof(univer));
return Data;
}
void Add(char *szUniver, char *szName, char *szPhone)
{
if (!szUniver || !szName || !szPhone)
return;
struct node *cnode = list->next = init_list();
cnode->all = init_data();
strncpy(cnode->all->uname, szUniver, sizeof(cnode->all->uname)-1);
strncpy(cnode->all->student, szName, sizeof(cnode->all->student)-1);
strncpy(cnode->all->phone, szPhone, sizeof(cnode->all->phone)-1);
}
void Find(char *szUniver)
{
struct node *t = list;
while (t != NULL)
{
// vmesto UNIVER1 mozhno ispol'zovat' schitannuju stroku.
if (!strcmpi(szUniver, t->all->uname))
{
printf("Match found for %s:\n\tName: %s\tPhone: %s\n", t->all->uname, t->all->student, t->all->phone);
}
t = t->next;
}
}
//osvobozhdenie pamjati
list_free(list);
только в if (!strcmp("UNIVER1", t->all->uname))
я бы заменил strcmp na strcmpi (case non senstive)
Более подробно
struct univer
{
char uname[64];
char student[64];
char phone[16];
};
... // dopolnitel'nye struktury dannyh
... // naprimer svaznoj spisok
struct node
{
struct node *next;
struct node *prev;
struct univer *all;
};
LPVOID init_list()
{
LPVOID Data = malloc(sizeof(node));
memset(Data, 0, sizeof(node));
return Data;
}
struct node *list = init_data();
LPVOID init_list()
{
LPVOID Data = malloc(sizeof(univer));
memset(Data, 0, sizeof(univer));
return Data;
}
void Add(char *szUniver, char *szName, char *szPhone)
{
if (!szUniver || !szName || !szPhone)
return;
struct node *cnode = list->next = init_list();
cnode->all = init_data();
strncpy(cnode->all->uname, szUniver, sizeof(cnode->all->uname)-1);
strncpy(cnode->all->student, szName, sizeof(cnode->all->student)-1);
strncpy(cnode->all->phone, szPhone, sizeof(cnode->all->phone)-1);
}
void Find(char *szUniver)
{
struct node *t = list;
while (t != NULL)
{
// vmesto UNIVER1 mozhno ispol'zovat' schitannuju stroku.
if (!strcmpi(szUniver, t->all->uname))
{
printf("Match found for %s:\n\tName: %s\tPhone: %s\n", t->all->uname, t->all->student, t->all->phone);
}
t = t->next;
}
}
//osvobozhdenie pamjati
list_free(list);
Сообщение изменено: Digger (15 апреля 2006 - 02:22 )
4x4 Puksiir - Эвакуация застрявших машин 24H - 588 020 48
#6
Отправлено 15 апреля 2006 - 09:21
strcmpi не является функцией стандартной библиотеки C
но нетрудно написать самому
и в функции init_list() лучше проверять возврашенное malloc значение
if (!Data) return NULL;
это неправильно:
struct node *cnode = list->next = init_list();
записывая память в list->next, ты теряешь второй елемент + это не позвольяет списку быть длиннее двух елементов.
но нетрудно написать самому
и в функции init_list() лучше проверять возврашенное malloc значение
if (!Data) return NULL;
это неправильно:
struct node *cnode = list->next = init_list();
записывая память в list->next, ты теряешь второй елемент + это не позвольяет списку быть длиннее двух елементов.
if (list != NULL) { struct node *cnode = list; while (cnode->next != NULL) cnode = cnode->next; cnode->next = init_list(); cnode->next->prev = cnode; cnode = cnode->next; cnode->next = NULL; cnode->all = init_data(); } ...
int main(void)
#7
Отправлено 15 апреля 2006 - 11:06
вот с использованием std::map :
#include <iostream> #include <map> #include <vector> #include <string> using std::map; using std::vector; using std::cout; using std::cin; using std::endl; using std::vector; using std::string; struct univer { string student; string phone; }; int main() { map <string, vector<univer> > all; string uni, stu, pho; while (cin >> uni) { if (uni == ".") break; cin >> stu >> pho; univer u; u.student = stu; u.phone = pho; all[uni].push_back(u); } cout << "All Records :" << endl << endl; cout << "---------------------------------------------------------------" << endl; map <string, vector<univer> >::const_iterator itr; for (itr = all.begin(); itr != all.end(); itr++) { cout << "Univer: " << itr->first << endl; vector<univer>::const_iterator vt; for (vt = itr->second.begin(); vt != itr->second.end(); vt++) cout << "\t" << (*vt).student << "\t" << (*vt).phone << endl; cout << "---------------------------------------------------------------" << endl; } cout << "Enter a university name: " << endl; cin >> uni; vector<univer>::const_iterator vt; for (vt = all[uni].begin(); vt != all[uni].end(); vt++) cout << "\t" << (*vt).student << "\t" << (*vt).phone << endl; return 0; }
int main(void)
#9
Отправлено 16 июня 2006 - 10:26
если бы не было strcmp и C и C++ и программирования вобше, ты бы не сидел за компом и не читал бы форум и не слушал музыку и не смотрел сайты и дальше в таком духе. большое начинается с маленькогохехе... я конечно в этом деле ничего не шарю Зайка, прости за грубость! но на вас так смешно смотреть. Ржунимагу Сидят тут спорят над какими-то strcmp и strcmpi Ребята вам охота вообще ето все творить ?
int main(void)