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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2011, 01:25   #1
Ислам
Форумчанин
 
Регистрация: 22.02.2011
Сообщений: 106
По умолчанию структура на си(си++)

Код:
#include<iostream>
using namespace std;
#include<conio.h>
#include<locale.h>

struct STUDENT
{
	char NAME[20+1];
	char GROUP[10+1];
	int SIS[5];
};

int main()
{
	setlocale(LC_ALL,"Russian");
	int a=0;
	STUDENT *stud=(STUDENT*)calloc(1,sizeof(struct STUDENT));
	for(int i=0;i<1;i++)
	{
		cout<<"Введите Фамилии, Группы (через пробел) : "<<endl;
		cin>>stud[i].NAME>>stud[i].GROUP;
		cout<<endl<<"Введите оценки студента (5 шт) :"<<endl;
		scanf("%d",stud[i].SIS);
	}

	for(int i=0;i<1;i++)
	{
		cout<<endl<<"Вывод"<<" "<<stud[i].NAME<<" "<<stud[i].GROUP<<" ";
	}

	for(int i=0;i<5;i++)
	{
		cout<<stud[i].SIS<<endl;
	}
	free(stud);
	cin.get();
	cin.get();
	getch();
	return 0;
	


}
}

вместо оценок выводит мусор...хоть убейте не пойму почему...

Последний раз редактировалось Stilet; 29.06.2011 в 08:20.
Ислам вне форума Ответить с цитированием
Старый 29.06.2011, 03:42   #2
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

ща что-то посмотрим...
malloc, realloc, calloc, free, scanf() чисто Сишные функции. в С++ есть new, delete, cin
Alkagolik вне форума Ответить с цитированием
Старый 29.06.2011, 03:43   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

У Вас SIS это массив чисел. А выводится, я подозреваю, его адрес.
А Вы еще и с динамической памятью поигрались. stud - динамический массив из одного элемента, а вот в этом куске кода
Код:
for(int i=0;i<5;i++)
{
cout<<stud[i].SIS<<endl;
}
Вы обращаетесь ко второму, третьему (в нумерации с нуля - к первому, второму, ...) и т.д. элементам. Тут либо мусор, либо Segmentation fault.

Для чтения:
Код:
for(int i=0;i<5;++i)
    cin >> stud[k].SIS[i]; // k это номер студента
Для вывода:
Код:
for(int i=0;i<5;++i)
    cout << stud[k].SIS[i] << ' ';
cout << endl;
// Updated

Цитата:
Сообщение от Alkagolik
malloc, realloc, calloc, free, scanf() чисто Сишные функции. в С++ есть new, delete, cin
Да он вообще странно пишет. Еще и stream'ы вперемешку с scanf...
Хотя это не наше дело)
Форматируйте код, будьте людьми.

Последний раз редактировалось Granus; 29.06.2011 в 03:50.
Granus вне форума Ответить с цитированием
Старый 29.06.2011, 04:01   #4
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

ну да, я когда заполнять массив начал въехал что не то что-то тут. Хотя мой g++ на tmp[i]->ocenki[j] ругается благим матом... ах я намудрил)) вот... работает
Код:
#include <iostream>

struct telo{
	char name[20];
	int point[5];
};

int main()
{
	int p=0;
	telo Telo;
	std::cin >> Telo.name;
	for (p=0; p<5; p++)
		std::cin >> Telo.point[p];
	
	std::cout << Telo.name << "  ";
	for (p=0; p<5; p++)
		std::cout << Telo.point[p] <<"  ";
	std::cout << std::endl;
	return 0;
}

Последний раз редактировалось Alkagolik; 29.06.2011 в 05:02.
Alkagolik вне форума Ответить с цитированием
Старый 29.06.2011, 06:14   #5
Ислам
Форумчанин
 
Регистрация: 22.02.2011
Сообщений: 106
По умолчанию

Код:
Да он вообще странно пишет. Еще и stream'ы вперемешку с scanf...
я только-только начал учить с++.... поэтому токая белеберда, но это пока=)
плюс еще на
Цитата:
cin>>stud[i].SIS
комипл ругался...
Код:
for(int i=0;i<5;++i)
    cout << stud[k].SIS[i] << ' ';
cout << endl;
где ее инициализировать? для нее тоже цикл нужен?

Код:
 с динамической памятью поигрались. stud - динамический массив из одного элемента
ну правильно, я выделяю память под массив структур! структура у меня одна! а что и сколько в ней хранится определ уже ее полями...разве не так?

кстати, если сделать
Цитата:
for(int i=0;i<5;++i)
cout << stud[i].SIS[i] << " ";
cout << endl
он выводит 1-ое введенное число, остальное 0-ми заполняет! почему?

Последний раз редактировалось Stilet; 29.06.2011 в 08:20.
Ислам вне форума Ответить с цитированием
Старый 29.06.2011, 07:20   #6
Nedward
Пользователь
 
Регистрация: 26.06.2011
Сообщений: 85
По умолчанию

Код из первого сообщения - ужасен.
Любовь к Искусству требует немедленного вмешательства
Очевидные ошибки - обращение к stud[i].SIS. Если Вы пишете int SIS[5] то в SIS[0] будет лежать первый элемент массива, в SIS[4] - последний (пятый по счету) элемент массива, а в SIS - указатель на массив. А Вы пытаетесь в SIS записать не адрес в памяти, а оценки. Причем все скопом.
Далее. В последнем цикле идет перебор:
Код:
	for(int i=0;i<5;i++)
	{
		cout << stud[i].SIS << endl;
	}
Что значит stud[i].SIS? Значит что вы будете выводить адрес из памяти, по которому лежат оценки первого студента, потом оценки второго, потом... стоп! какого второго ? Из кода выше
Код:
	for(int i=0;i<1;i++)
	{
		cout << "Введите Фамилии, Группы (через пробел) : " << endl;
		cin >> stud[i].NAME >> stud[i].GROUP;
		cout << endl << "Введите оценки студента (5 шт) :" << endl;
		scanf("%d",stud[i].SIS);
	}
предельно ясно, что у нас записан всего один студент! Человек это достаточно быстро понял, а до компа не дойдет. Он честно попытается вывести адрес памяти, где теоретически могли бы лежать оценки несуществующего второго студента.
К тому же зачем переменная a я так и не понял. Как и для чего подключался файл conio.h. Хотя это я уже придираюсь
В общем вот слегка перекроенный код. Он не идеален, но он хотябы работает :
Код:
#include<iostream>
using namespace std;
#include<locale.h>

const unsigned int STUDENTS_NUM=2; //количество студентов
const unsigned int EVALUATION_NUM=5; //количество оценок


struct STUDENT
{
	char NAME[20+1];
	char GROUP[10+1];
	int SIS[EVALUATION_NUM];
};

int main()
{
	setlocale(LC_ALL,"Russian");
	STUDENT *stud=(STUDENT*)calloc(STUDENTS_NUM,sizeof(struct STUDENT));
	for(int i=0; i<STUDENTS_NUM;i++)
	{
		cout << "Введите Фамилии, Группы (через пробел) : " << endl;
		cin >> stud[i].NAME >> stud[i].GROUP;
		cout << "Введите оценки студента (" << EVALUATION_NUM <<" шт.) :";
		for (int j=0;j<EVALUATION_NUM;j++)
			cin >> stud[i].SIS[j];
	}
	for(int i=0;i<STUDENTS_NUM;i++)
	{
		cout << endl << "Вывод" << " " << stud[i].NAME << " " << stud[i].GROUP << " " << endl;
		for(int j=0;j<EVALUATION_NUM;j++)
		{
			cout << stud[i].SIS[j] << " ";
		}
	}
	cout << endl;
	free(stud);
	return 0;
}
На будущее советую использовать константы. Если в коде встречается цифра 5, то не сразу разберешься, чего это там пять - оценок или студентов. Но если в коде написано STUDENTS_NUM, то сразу понятно что идет перебор по студентам.
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. (c) Martin Golding
Nedward вне форума Ответить с цитированием
Старый 29.06.2011, 07:27   #7
Ислам
Форумчанин
 
Регистрация: 22.02.2011
Сообщений: 106
По умолчанию

Код:
На будущее советую использовать константы
глобальные переменные - это зло(с) =))

спасибо за предельно понятное объяснение!!!
Ислам вне форума Ответить с цитированием
Старый 29.06.2011, 17:04   #8
Alkagolik
Пользователь
 
Аватар для Alkagolik
 
Регистрация: 03.08.2009
Сообщений: 77
По умолчанию

Я вот понять не могу Зачем делать на Сишный стиль
Код:
STUDENT *stud=(STUDENT*)calloc(STUDENTS_NUM,sizeof(struct STUDENT))
Когда парень хочет писать в срр, и выглядеть это будет вот как
Код:
STUDENT *stud;
stud = new STUDENT[n];
Сейчас привыкнем писать код Си в программах С++, а завтра возьмут и отменять поддержку Си в компиляторах с++ что тогда делать станем?)) Йа за эстетику и чистоту))
вот рабочий пример
Код:
#include <iostream>

struct l1{
	char L1[20];
	int L2;
};

int main()
{
	l1 *mass;
	mass = new l1[10];
	/*или так
	unsigned short k;
	std::cin >>k;
	mass = new l1[k];*/
		for (int i=0; i<10;i++){
		std::cin >> mass[i].L1;
		std::cin >> mass[i].L2;
	}
	for (int i=0; i<10;i++){
		std::cout << mass[i].L1 << "  ";
		std::cout << mass[i].L2 << std::endl;
	}
	return 0;
}
Рано или поздно от привычки
Код:
using namespace std
прийдется отказаться поэтому лучше сразу привыкайте писать описатели или как они там зовутся, не помню
Код:
std::
И потом локаль... я почти уверен в том что это личный каприз)) на кой она вам в командной строке в виндовс? когда начнете писать win32api то она не понадобится в принципе (если вы уже решились писать для форточек)
Alkagolik вне форума Ответить с цитированием
Старый 29.06.2011, 18:48   #9
Ислам
Форумчанин
 
Регистрация: 22.02.2011
Сообщений: 106
По умолчанию

Код:
Сейчас привыкнем писать код Си в программах С++, а завтра возьмут и отменять поддержку Си в компиляторах с++ что тогда делать
хорошее замечание=)

Цитата:
local.h
вы правы, мой каприз=)) предпочитаю вывод на русском=)

Спасибо за советы!!! мне, как начинающему писать на с++, очень полезно будет=))
Ислам вне форума Ответить с цитированием
Старый 29.06.2011, 18:59   #10
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от Ислам Посмотреть сообщение
Код:
На будущее советую использовать константы
глобальные переменные - это зло(с) =))
Ну это не переменные, а константы. Можно так же через макрос(#define) задавать значение. Это правило хорошего программирования давать константам осмысленные имена. Так же это храние значения константы в одном месте, а это значит, что при модификации программы не будет проблем с изменением этого значения, ведь достаточно поменять значение в одном месте и во всех зависимых местах так же изменится.
An1ka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структура С++ Defender42 Помощь студентам 9 09.04.2011 12:45
Структура Seferus Общие вопросы C/C++ 0 15.11.2010 13:55
C++. Структура. bpystep Помощь студентам 12 24.11.2009 00:28
Структура SL1CK Общие вопросы C/C++ 8 08.06.2009 21:31
Структура IF в С++ lebrosha Помощь студентам 3 22.05.2009 00:09