Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2012, 15:31   #1
Arantir#
Пользователь
 
Регистрация: 24.08.2012
Сообщений: 28
Смущение Структуры, указатели, строки, с++

Здравствуйте!
Вот задание: организовать текст помощи в виде линейного списка, каждая компонента текста помощи(звена структуры видимо) содержит термин(одно слово) и описание этого термина(много слов написанных в 1-5 строк это важно).
Составить программу которая:
1)позволяет формировать текст
2)просматривать весь текст помощи
3)просматривать лишь один термин и описание к нему
Код:
#include "stdafx.h"
#include <iostream>
#include <string>

using namespace::std;

struct text
{
	char term[100];
	char desc[6][100];
	text *next;
	text *prev;
};

void add(text **temp, text **last);
void rev(text **temp, text **first, text **last);
void rev_one_term(text **temp, text **first, text **last);

void add(text **temp, text **last) 
{
	cout << "Input term:" << endl;
	cin >> (*temp)->term;
	cout << "Input desc:" << endl;
	for (int i=0; i<=5; i++)
	{
		cin.getline((*temp)->desc[i], sizeof((*temp)->desc[i]));
	}
	(*temp)->next=new text;
	(*temp)->next->prev=(*temp);
	(*temp)=(*temp)->next;
	(*last)=(*temp);
}

void rev(text **temp, text **first, text **last)
{
	(*temp)=(*first);
	while((*temp)!=(*last))
	{
		cout << "Termin: "<< (*temp)->term << endl;
		cout << "Desc: "<< endl;	
		for (int i=0; i<=5; i++)
		{
			cout << (*temp)->desc[i] << endl;
		}
		cout <<"________________"<< endl;
		(*temp)=(*temp)->next;
	}
}

void rev_one_term(text **temp, text **first, text **last)
{
	char a[1];
	cout << "Input term: ";
	cin >> a;
	(*temp)=(*first);
	while((*temp)!=(*last))
	{
		if((*temp)->term==a)
		{	
			cout <<"Termin: "<< (*temp)->term << endl;
			cout <<"Desc: "<< (*temp)->desc << endl;
			cout <<"________________"<< endl;
		}
		else
		{
			(*temp)=(*temp)->next;
		} 
	}
}

void main()
{
	short n, k;
	text *first, *last, *temp;
	temp=new text;
	first=temp;
	first->prev=NULL;
	while(true)
	{
		cout << "________________" << endl;
		cout << "1-Input term\n2-View all text\n3-View one term\n4-Exit of program" << endl;
		cout << "________________" << endl;
		cin >> n;
		switch(n)
		{
			case 1: add(&temp, &last); break;
			case 2: rev(&temp, &first, &last); break;
			case 3: rev_one_term(&temp, &first, &last); break;
			case 4: exit(0); break;
			default: cout <<"Incorrect data...\n"; break;
		}
		cout << "1-menu\n0-exit of program" << endl;
		cin >> k;
		if(!k) exit(0);
	}
}
Вопросы:
1)Почему не работает реализация поиска термина и его вывод? (3 пункт)
2)Почему ввод\вывод терминов начинается с 1, а не с 0? (пришлось изменить 5 на 6 в массиве desc)
3)Можно ли разыменовать двойной указатель temp для всей функции сразу, чтобы не писать (*temp)-> при каждом обращении, а сразу temp.ololo?
4)Почему в формальных параметрах используется двойной указатель? (потому что мы передаём в функцию переменную с адресом, а двумя звёздочками создаём указатель на эту переменную?)
5)Вообще линейный список реализован до конца?
Arantir# вне форума Ответить с цитированием
Старый 28.10.2012, 20:14   #2
Arantir#
Пользователь
 
Регистрация: 24.08.2012
Сообщений: 28
По умолчанию

Ап! Ап! Ап!
Arantir# вне форума Ответить с цитированием
Старый 28.10.2012, 21:43   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Отладчик.
2) По идее должен работать с 0. Отладчик.
3) Можно. Только не скопируйте ненароком, инструкция должна быть text*& tempValue = *temp;
4) Потому что Вам нужно (? собственно, почему Вы об этом спрашиваете? Ваш же код...), чтобы переменная temp из вызывающего кода меняла своё значение. Следовательно, надо передавать в функцию не её саму, а её адрес. Но сама temp уже указатель, вот и получается в качестве аргумента функции адрес адреса.
5) Что имеется в виду? Под линейным списком, насколько помню, обычно понимается структура данных, поддерживающая операции вставки элемента в начало / в конец (с временной сложностью не хуже O(1)), доступа к элементу по индексу (с временной сложностью не хуже O(N)), удаления элемента по индексу (с временной сложностью не хуже O(N)) и последовательного перечисления элементов (с временной сложностью смещения итератора не хуже O(1)). У Вас реализовано не всё из перечисленного.
Abstraction вне форума Ответить с цитированием
Старый 29.10.2012, 09:15   #4
Arantir#
Пользователь
 
Регистрация: 24.08.2012
Сообщений: 28
По умолчанию

А как сделать чтобы массивы в структуре были динамическими, ведь 101 термин уже не "уместится"?
Arantir# вне форума Ответить с цитированием
Старый 29.10.2012, 10:14   #5
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Вы наверно немного не понимаете, но у вас в одном экземпляре структуры может быть 1 термин и 6 описаний к нему и строки (термин и описание) размером 100 символов.
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 29.10.2012, 13:22   #6
Arantir#
Пользователь
 
Регистрация: 24.08.2012
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Вы наверно немного не понимаете, но у вас в одном экземпляре структуры может быть 1 термин и 6 описаний к нему и строки (термин и описание) размером 100 символов.
Разобрался, спасибо..
Arantir# вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические структуры. указатели. записи. паскаль. Владисла8 Фриланс 2 07.05.2012 04:40
Динамические структуры. указатели. записи. паскаль. Владисла8 Фриланс 2 11.04.2012 17:11
Структуры через указатели ensoleille Помощь студентам 2 21.02.2011 14:10
Структуры и указатели. Geg[C/c++] Помощь студентам 3 30.09.2009 12:13
Структуры и указатели phpcreator Помощь студентам 1 09.09.2009 17:57