Перейти к содержимому

Фото
- - - - -

С, С++, прога со структурами.


  • Вы не можете создать новую тему
  • Please log in to reply
8 ответов в этой теме

#1 Vovil

Vovil
  • Пользователь
  • 169 сообщений

Отправлено 14 Апрель 2006 - 16:35

Люди помогите кто-нибудь сделать в С такую программу... Имеется структура: студент - университет - телефон. В прогу вводятся все элементы. Далее вводится универ, студентов которого надо найти, и на экран выводятся имена всех студентов с их телефонами, кто в этом универе. Пожалуйста, напишите код, кому легко и не влом =) Или хотя бы подскажите как сделать, чтоб он сравнивал строчки (универ, который ввели для поиска, с теми универами, что уже ввели раньше). Заранее спасибо.
  • 0

#2 Warvick

Warvick
  • Пользователь
  • 411 сообщений
  • Откуда:Tallinn

Отправлено 14 Апрель 2006 - 17:05

Ну запоминай введённые данные в массив/коллекцию/очередь записей
При поиске сверяй поочерёдно введённое значение с значением поля "университет" для каждого элемента. Если совпадает - выводи на экран
  • 0
Да, я такой!

#3 Vovil

Vovil
  • Пользователь
  • 169 сообщений

Отправлено 14 Апрель 2006 - 17:54

Спасибо, это-то я понимаю, мне бы поконкретней, в символах :) Никак не получается :)
  • 0

#4 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 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)
  • 0
int main(void)

#5 Digger

Digger
  • Пользователь
  • 380 сообщений
  • Откуда:Tallinn

Отправлено 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);

Сообщение изменено: Digger (15 Апрель 2006 - 02:22 )

  • 0
4x4 Puksiir - Эвакуация застрявших машин 24H - 588 020 48 :)

#6 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 15 Апрель 2006 - 09:21

strcmpi не является функцией стандартной библиотеки C :D
но нетрудно написать самому :)
и в функции 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();
}
...

  • 0
int main(void)

#7 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 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;
}

  • 0
int main(void)

#8 КрЕаТиВ :)

КрЕаТиВ :)
  • Постоялец
  • 350 сообщений
  • Откуда:TALLINN

Отправлено 11 Июнь 2006 - 12:46

хехе... я конечно в этом деле ничего не шарю :D Зайка, прости за грубость! но на вас так смешно смотреть. Ржунимагу :D Сидят тут спорят над какими-то strcmp и strcmpi :D Ребята вам охота вообще ето все творить ?
  • 0
:)

#9 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 16 Июнь 2006 - 10:26

хехе... я конечно в этом деле ничего не шарю :D Зайка, прости за грубость! но на вас так смешно смотреть. Ржунимагу :D Сидят тут спорят над какими-то strcmp и strcmpi :D Ребята вам охота вообще ето все творить ?

если бы не было strcmp и C и C++ и программирования вобше, ты бы не сидел за компом и не читал бы форум и не слушал музыку и не смотрел сайты и дальше в таком духе. большое начинается с маленького
  • 0
int main(void)