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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2010, 23:53   #1
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию Структуры.С++

Здравствуйте господа.

Мне требуется некоторое разъяснение по теме структура.

допустим у меня есть некая структура.

struct Stud
{
char name[15],fname[15],sname[15];
long int group;
long int srbal;
int a[5];
};


объявляется она в последствии
const int z=10;
Stud C[z];
//ну или можно сразу объявить Stud C[10].

Мне,не понятно каким образом сделать объявлении динамическим способом.

То есть,я хочу объявлять количество структур не программно,а чтобы пользователь сам выбирал это значение.В стиле :

cout<<"Введите количество студентов: "<<endl;
cin>>Z;
Stud C[z];
но выдает ошибку,что z- должно быть const;

Далее,я предпринимал попытки сделать это способом подобному динамическому объявлению массива.с помощью указателей,но по скольку я с указателями не очень хорошо обращаюсь,программа то висла,то зацикливалась то ещё что-то,приводить код не стану,а то не дай бог у кого-нибудь будет инфаркт от такого.

есть у кого-нибудь идеи?буду очень благодарен.целый день структуры изучаю.


И ещё вопрос,по скольку у меня количество структур задается константой,а все поля структуры всегда могут быть не использоваться,а циклы делаются под все структуры(ну,то есть заполнение по максимуму),то когда структуры не заполняются полностью то в циклах for(i=0;i<z;i++),где z-константа определяющая количество структур Stud C[z],и прочих компилятор проходит лишние итерации и делает не желательные операции из-за которых потом появляются всякие лишние кракозябры.

а теперь вопрос:как делать проверку на наличие заполненной структуры типа for(i=0;i<z;i++) if(пример на основе структуры выше) break;
За помощь: Нажмите на весы слева от сообщения!

Последний раз редактировалось savva; 11.06.2010 в 01:22.
savva вне форума Ответить с цитированием
Старый 11.06.2010, 01:29   #2
spl1nter
Пользователь
 
Регистрация: 17.11.2009
Сообщений: 14
По умолчанию

а как вы делали с динамическим объявлением?
Код:
cin >> z;
Stud *c=new Stud[z];
...
delete[] c;
spl1nter вне форума Ответить с цитированием
Старый 11.06.2010, 01:33   #3
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию

эм,я делал таким образом

Код:
struct  Stud
{
 char name[15],fname[15],sname[15];
 long int group;
 long int srbal;
 int a[5];
}Stud *c=new Stud[z];
За помощь: Нажмите на весы слева от сообщения!
savva вне форума Ответить с цитированием
Старый 11.06.2010, 01:40   #4
spl1nter
Пользователь
 
Регистрация: 17.11.2009
Сообщений: 14
По умолчанию

Код:
struct  Stud
{
 char name[15],fname[15],sname[15];
 long int group;
 long int srbal;
 int a[5];
};Stud *c=new Stud[z];
spl1nter вне форума Ответить с цитированием
Старый 11.06.2010, 01:51   #5
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию

все,разобрался с этим.благодарю.

теперь как я понимаю я должен обращаться через указатели
то есть вместо

C[i].name будет c->name;

тогда код
Код:
	for (int i=0;i<z;i++)
				{
					for (int j=i+1;j<z;j++)
					{
						if (C[i].group>C[j].group)
						{
						int tmpGroup=C[i].group;
						char tmpName[30];   //буфер обмена имени
						char tmpFName[30];  //буфер обмена фамилии
						char tmpSName[30];  // буфер обмена отчества
						strcpy(tmpName,C[i].name);
						strcpy(tmpFName,C[i].fname);
						strcpy(tmpSName,C[i].sname);
						int tmpA[5];
						for (int k=0;k<5;k++)
							tmpA[k]=C[i].a[k];
							C[i].group=C[j].group;
							strcpy(C[i].name,C[j].name);
							strcpy(C[i].fname,C[j].fname);
							strcpy(C[i].sname,C[j].sname);
								for (int k=0;k<5;k++)
								C[i].a[k]=C[j].a[k];
								C[j].group=tmpGroup;
								strcpy(C[j].name,tmpName);
								strcpy(C[j].fname,tmpFName);
								strcpy(C[j].sname,tmpSName);
									for (int k=0;k<5;k++)
									C[j].a[k]=tmpA[k];
								}
						}
					}
Примет вид:

Код:
	for (int i=0;i<z;i++)
				{
					for (int j=i+1;j<z;j++)
					{
						if (c->group>c->group)
						{
						int tmpGroup=c->group;
						char tmpName[30];   //буфер обмена имени
						char tmpFName[30];  //буфер обмена фамилии
						char tmpSName[30];  // буфер обмена отчества
						strcpy(tmpName,c->name);
						strcpy(tmpFName,c->fname);
						strcpy(tmpSName,c->sname);
						int tmpA[5];
						for (int k=0;k<5;k++)
							tmpA[k]=c->a[k];
							c->group=c->group;
							strcpy(c->name,c->name);
							strcpy(c->fname,c->fname);
							strcpy(c->sname,c->sname);
								for (int k=0;k<5;k++)
								c->a[k]=c->a[k];
								c->group=tmpGroup;
								strcpy(c->name,tmpName);
								strcpy(c->fname,tmpFName);
								strcpy(c->sname,tmpSName);
									for (int k=0;k<5;k++)
									c->a[k]=tmpA[k];
								}
						}
					}
Тогда я не понимаю,как в одной строке обратится к разным полям структуры,с помощью указателей.то бишь:
1-ый вариант у меня
strcpy(C[i].name,C[j].name);
2-ой вариант какой будет?(с помощью указателей)
За помощь: Нажмите на весы слева от сообщения!
savva вне форума Ответить с цитированием
Старый 11.06.2010, 02:06   #6
spl1nter
Пользователь
 
Регистрация: 17.11.2009
Сообщений: 14
По умолчанию

указатели и массивы в с++ это почти одно и то же.
доступ к элементам структуры будет таким:
Код:
c[i]->name;
strcpy(c[i]->name,c[j]->name);
и тд.
Хотя проще перегрузить оператор "=", тема перегрузки гдето на форуме обсуждалась.
spl1nter вне форума Ответить с цитированием
Старый 11.06.2010, 02:10   #7
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию

А вот и нельзя так делать. выдает ошибку

Pointer to structure required on left side of -> or ->*.
За помощь: Нажмите на весы слева от сообщения!
savva вне форума Ответить с цитированием
Старый 11.06.2010, 02:45   #8
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию

Вопрос остаётся открытым.
За помощь: Нажмите на весы слева от сообщения!
savva вне форума Ответить с цитированием
Старый 11.06.2010, 02:49   #9
spl1nter
Пользователь
 
Регистрация: 17.11.2009
Сообщений: 14
По умолчанию

точно, просто через точку =)
spl1nter вне форума Ответить с цитированием
Старый 11.06.2010, 02:56   #10
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию

эм?

ты подразумеваешь:

strcpy(c.[i]->name,c.[j]->name);
тогда вылезает такая ошибка:
Structure required on left side of . or .*


Блин,я пока с этой хернёй не разберусь,заснуть даже не смогу.сволочизм.
За помощь: Нажмите на весы слева от сообщения!
savva вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структуры balalay12 Общие вопросы C/C++ 4 28.04.2010 08:57
Структуры в С++ Shtripling Помощь студентам 7 27.11.2009 13:56
Структуры Wertex Помощь студентам 3 30.10.2009 13:52
Структуры Shadovv13 Общие вопросы C/C++ 18 15.10.2009 23:03