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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2009, 14:45   #1
Kanibal
 
Аватар для Kanibal
 
Регистрация: 30.06.2009
Сообщений: 4
По умолчанию C++. Файлы ввода-вывода, массивы, указатели.

Люди, учусь на инженера... зачем я пошел учится сюда уже не знаю...
Помогите кто чем может, профи просьба сильно не ругаться и не матерится))
На языке Си)

Написать программу, которая позволяет:
- осуществлять запись в новый текстовый файл сведений о студентах в формате:
Ф.И.О. Информатика Физика Математика
Иванов И.И. 4 3 4
Петров П.П. 4 4 5
... ... ... ...

Примечание: заголовок в файл не записывается
- добавлять данные в конец существующего файла;
- выводить на экран все сведения из указанного файла;
- выводить на экран сведения о среднем балле студентов по указанному предмету;
- рассчитывать средний балл по всем предметам и записывать результат в нужный файл.


Обязательно используемые элементы:
Файлы ввода-вывода, массивы, указатели.

Последний раз редактировалось Kanibal; 30.06.2009 в 14:59.
Kanibal вне форума Ответить с цитированием
Старый 30.06.2009, 17:24   #2
goblinyara
Форумчанин
 
Аватар для goblinyara
 
Регистрация: 02.01.2009
Сообщений: 340
По умолчанию

ну а если не знаете, зачем учиться, то зачем тогда продолжаете учитья? точнее, мучиться, и мучать преподавателей....
DelphiWorld 6. Скачай, поставь, и будет тебе счастье=)
Программирование, как и любовь -- одно слово, за которым скрывается бесконечное множество занятий.
goblinyara вне форума Ответить с цитированием
Старый 30.06.2009, 17:27   #3
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вот для затравки.
http://programmersforum.ru/showthread.php?t=43655
http://programmersforum.ru/showthread.php?t=47911
http://programmersforum.ru/showthread.php?t=47701
http://programmersforum.ru/showthread.php?t=44352

Посмотрите, поразбирайтесь.. Пробуйте сделать сами. Как появятся вопросы - спрашивайте.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.06.2009, 17:30   #4
Kanibal
 
Аватар для Kanibal
 
Регистрация: 30.06.2009
Сообщений: 4
По умолчанию

Тем не менее вопрос сейчас поставлен не так.

Код:
#include"fstream"
#include"iostream"
#include"string"
#include"iomanip"
using namespace std;
//открываем глобальные файловые потоки 
ifstream in("input.txt");
ofstream out("output.txt");
struct mas
{
	string F,I,O; //фамилия,имя, отчество
	//int group;
	int ses[3];//оценки по 3 предметам
	mas() { ses[0] = 0; ses[1] = 0;	ses[2] = 0;}
	void print();
};
void mas::print()//вывод данных в выходной поток
{
	out<<setw(12)<<left<<F<<setw(10)<<I<<setw(10)<<O;
	for(int i=0; i<3;i++)
		out<<setw(12)<<ses[i];
	out<<endl;

}

int main()
{
	int n=0;
	mas stud[20];
	if(!in)cout<<"error in the open file input.txt\n";
	else
	{
		while(in.peek()!=EOF)//считываем данные про всех студентов
	
		{
			in>>stud[n].F;
			in>>stud[n].I;
			in>>stud[n].O;
			//in>>stud[n].group;
			in>>stud[n].ses[0];
			in>>stud[n].ses[1];
			in>>stud[n].ses[2];
					
			if(stud[n].ses[0]>=3 && stud[n].ses[1]>=3 && stud[n].ses[2]>=3)
			  stud[n].print();
			n++;
		}
	}
	in.close(); out.close();//закрываем файлы
	return 0;
}
Вот это очень хорошо... но как бы изменить его, здесь происходит считывание из файла, и занесение результатов в другой файл...
А надо бы чтобы данные оценок и фамилий вводились не из файла, а при выполнении программы.

Последний раз редактировалось Stilet; 01.07.2009 в 13:18.
Kanibal вне форума Ответить с цитированием
Старый 30.06.2009, 17:48   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ну тогда читайте не из файла, а из потока ввода - cin (вместо in).
Воспользуйтесь поиском. Подобные задачи уже многократно решались. И с ручным вводом, и из файла..
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 01.07.2009, 11:53   #6
Kanibal
 
Аватар для Kanibal
 
Регистрация: 30.06.2009
Сообщений: 4
По умолчанию

Люди напишите программу для моего первого сообщения.
Как оплату, могу предложить 2 номера ICQ состоящих из 7 знаков...
Kanibal вне форума Ответить с цитированием
Старый 01.07.2009, 13:00   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Ох, и че я такой добрый...
Код:
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

struct Student
{
	char FIO[128];
	int marks[3];

	Student()
	{
		marks[0] = 3;
		marks[1] = 3;
		marks[2] = 3;
		strcpy(FIO, "\0");
	}

	Student(const char *fio_, int math_, int ph_, int inform_)
	{
		marks[0] = inform_;
		marks[1] = ph_;
		marks[2] = math_;
		strcpy(FIO, fio_);
	}
};

void AverageMark(Student *list, int size)	//средний балл по всем оценкам
{
	ofstream out("Average.txt");
	int inf = 0;
	int ph = 0;
	int math_ = 0;

	for(int i = 0; i < size; i++)
	{
		inf += list[i].marks[0];
		ph += list[i].marks[1];
		math_ += list[i].marks[2];
	}
	inf /= size;
	ph /=size;
	math_ /= size;

	out << left << inf << '\t' << ph << '\t' << math_ << '\n';
	out.close();
}

void AverageCourse(Student *list, int course, int size)	//средняя оценка по заданному предмету
{
	if(course >= 3)
	{
		throw "Course number must between 0 and 2";
	}
	else
	{
		int average = 0;
		for(int i = 0; i < size; i++)
		{
			average += list[i].marks[course];
		}
		average /= size;

		char name[12];
		strcpy(name , "\0");	//имя предмета
		switch(course)
		{
		case 0:
			strcpy(name, "Informatics\0");
		break;
		case 1:
			strcpy(name, "Physics\0");
		break;
		case 2:
			strcpy(name, "Math\0");
		break;
		}
		cout << "Average mark of " << name << ": " << average << "\n";
		system("pause");
	}
}

void PrintAll(const char *filename)
{
	char fio1[128];
	char fio2[128];
	int inf = 0;
	int ph = 0;
	int math = 0;
	strcpy(fio1, "\0");
	strcpy(fio2, "\0");
	
	ifstream in(filename);

	while(!in.eof())
	{
		in >> fio1;
		in >> fio2;
		strcat(fio1, " ");
		strcat(fio1, fio2);
		in >> inf;
		in >> ph;
		in >> math;

		cout << endl;
		cout << left << fio1 << '\t' << inf << '\t' << ph << '\t' << math << '\n';
	}
	fflush(stdout);
	system("pause");
	in.close();
}

void InsertStudent(const char *file, Student st)
{
	ofstream out;
	out.open(file, ios_base::app);
	out << left << '\n' << st.FIO << '\t' << st.marks[0] << '\t' << st.marks[1] << '\t' << st.marks[2];
	out.close();
}

Student *ReadBase(const char *file, int &size)	//сервисная функция - считать все из файла в массив структур
{
	Student **st_list = new Student*[50];
	char fio1[128];
	char fio2[128];
	int inf = 0;
	int ph = 0;
	int math = 0;
	int current = 0;
	strcpy(fio1, "\0");
	strcpy(fio2, "\0");

	ifstream in(file);

	while(!in.eof())
	{
		in >> fio1;
		in >> fio2;
		strcat(fio1, " ");
		strcat(fio1, fio2);
		in >> inf;
		in >> ph;
		in >> math;

		st_list[current] = new Student(fio1, inf, ph, math);
		current++;
	}
	in.close();
	size = current;
	return *st_list;
}

int main()
{
	Student *list;
	int size = 0;
	const char *filename = "Base.txt";
	char choice;

	do
	{
		system("cls");

		cout << "Menu\n"
			 << "1. Insert student\n"
			 << "2. Print all students\n"
			 << "3. Average mark by a course\n"
			 << "4. Total average marks\n\n"
			 << "0. Exit\n\n"
			 << "Your choice:  ";
		cin >> choice;

		switch(choice)
		{
		case '1':
			{
				Student *s;
				char sur[128];
				char io[128];
				int inf;
				int ph;
				int m;
				cout << "Enter Surname of student: \n";
				gets(sur);
				gets(sur);
				cout << "Enter initials of student: \n";
				gets(io);
				strcat(sur, " ");
				strcat(sur, io);
				cout << "\nEnter a marks of informatics / physics / math: \n";
				cin >> inf >> ph >> m;
				
				s = new Student(sur, inf, ph, m);
				InsertStudent(filename, *s);
			}	
		break;
		case '2':
			PrintAll(filename);
		break;
		case '3':
			{
				int number = 0;
				cout << "0 - informatics, 1 - physics, 2 - math\n";
				cin >> number;
				list = ReadBase(filename, size);
				AverageCourse(list, number, size);
			}
		break;
		case '4':
			{
				list = ReadBase(filename, size);
				AverageMark(list, size);
			}
		break;
		}
	} 
	while (choice != '0');
	return 0;
}
Ограничения:
Отдельно вводится фамилия, отдельно инициалы.
Лучше не пытаться вывести всю информацию из файла, если он пустой.

Примечание:
Если будете писать в среде от компании Borland, то все system("cls") заменяете на clrscr(), а system("pause") на getch(). При этом не забывайте подключить conio.h

Семизнаки мне в ЛС.

Последний раз редактировалось MaTBeu; 01.07.2009 в 13:08.
MaTBeu вне форума Ответить с цитированием
Старый 01.07.2009, 13:53   #8
Kanibal
 
Аватар для Kanibal
 
Регистрация: 30.06.2009
Сообщений: 4
По умолчанию

Стыдно звучит сколько ищу не могу найти где здесь ЛС
Kanibal вне форума Ответить с цитированием
Старый 01.07.2009, 22:06   #9
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Нажимаете на ник, выпадает список. Нажимаете отправить личное сообщение пользователю и все.
MaTBeu вне форума Ответить с цитированием
Старый 30.06.2010, 17:16   #10
rashsash
Новичок
Джуниор
 
Регистрация: 30.06.2010
Сообщений: 2
По умолчанию

Может быть влезаю не в своё дело, но в программе допущен ряд мелких с точки зрения кода ошибок, и, как следствие, она не совсем правильно работала, кому интересно выкладываю рабочую программку:
Код:
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

struct Student
{
	char FIO[128];
	int marks[3];

	Student()
	{
		marks[0] = 3;
		marks[1] = 3;
		marks[2] = 3;
		strcpy(FIO, "\0");
	}

	Student(const char *fio_, int math_, int ph_, int inform_)
	{
		marks[0] = inform_;
		marks[1] = ph_;
		marks[2] = math_;
		strcpy(FIO, fio_);
	}
};

void AverageMark(Student **list, int size)	//средний балл по всем оценкам
{
	ofstream out("Average.txt");
	float inf = 0;
	float ph = 0;
	float math_ = 0;

	for(int i = 0; i < size; i++)
	{
		inf += list[i]->marks[0];
		ph += list[i]->marks[1];
		math_ += list[i]->marks[2];
	}
	inf /= size;
	ph /=size;
	math_ /= size;

	out << left << inf << '\t' << ph << '\t' << math_ << '\n';
	out.close();
}

void AverageCourse(Student **list, int course, int size)	//средняя оценка по заданному предмету
{
	if(course >= 3)
	{
		throw "Course number must between 0 and 2";
	}
	else
	{
		int average = 0;
		for(int i = 0; i < size; i++)
		{
			average += list[i]->marks[course];
		}
		average /= size;

		char name[12];
		strcpy(name , "\0");	//имя предмета
		switch(course)
		{
		case 0:
			strcpy(name, "Informatics\0");
		break;
		case 1:
			strcpy(name, "Physics\0");
		break;
		case 2:
			strcpy(name, "Math\0");
		break;
		}
		cout << "Average mark of " << name << ": " << average << "\n";
		system("pause");
	}
}

void PrintAll(const char *filename)
{
	char fio1[128];
	char fio2[128];
	int inf = 0;
	int ph = 0;
	int math = 0;
	strcpy(fio1, "\0");
	strcpy(fio2, "\0");

	ifstream in(filename);

	while(!in.eof())
	{
		in >> fio1;
		in >> fio2;
		strcat(fio1, " ");
		strcat(fio1, fio2);
		in >> inf;
		in >> ph;
		in >> math;

		cout << endl;
		cout << left << fio1 << '\t' << inf << '\t' << ph << '\t' << math << '\n';
	}
	fflush(stdout);
	system("pause");
	in.close();
}

void InsertStudent(const char *file, Student st)
{
	ofstream out;
	out.open(file, ios_base::app);
	out << left << '\n' << st.FIO << '\t' << st.marks[0] << '\t' << st.marks[1] << '\t' << st.marks[2];
	out.close();
}

Student **ReadBase(const char *file, int &size)	//сервисная функция - считать все из файла в массив структур
{
	Student **st_list = new Student*[50];
	char fio1[128];
	char fio2[128];
	int inf = 0;
	int ph = 0;
	int math = 0;
	int current = 0;
	strcpy(fio1, "\0");
	strcpy(fio2, "\0");

	ifstream in(file);

	while(!in.eof())
	{
		in >> fio1;
		in >> fio2;
		strcat(fio1, " ");
		strcat(fio1, fio2);
		in >> math;
		in >> ph;
		in >> inf;

		st_list[current] = new Student(fio1, inf, ph, math);
		current++;
	}
	in.close();
	size = current;
	return st_list;
}

int main()
{
	Student **list;
	int size = 0;
	const char *filename = "Base.txt";
	char choice;

	do
	{
		system("cls");

		cout << "Menu\n"
			 << "1. Insert student\n"
			 << "2. Print all students\n"
			 << "3. Average mark by a course\n"
			 << "4. Total average marks\n\n"
			 << "0. Exit\n\n"
			 << "Your choice:  ";
		cin >> choice;

		switch(choice)
		{
		case '1':
			{
				Student *s;
				char sur[128];
				char io[128];
				int inf;
				int ph;
				int m;
				cout << "Enter Surname of student: \n";
				gets(sur);
				gets(sur);
				cout << "Enter initials of student: \n";
				gets(io);
				strcat(sur, " ");
				strcat(sur, io);
				cout << "\nEnter a marks of informatics / physics / math: \n";
				cin >> inf >> ph >> m;
				
				s = new Student(sur, inf, ph, m);
				InsertStudent(filename, *s);
			}	
		break;
		case '2':
			PrintAll(filename);
		break;
		case '3':
			{
				int number = 0;
				cout << "0 - informatics, 1 - physics, 2 - math\n";
				cin >> number;
				list = ReadBase(filename, size);
                AverageCourse(list, number, size);
			}
		break;
		case '4':
			{
				list = ReadBase(filename, size);
                AverageMark(list, size);
                system("pause");
			}
		break;
		}
	}
	while (choice != '0');
	return 0;
}
Собственно заменил *list на **list поскольку после выхода из функции данные в массиве структур, считанные из файла, пропадут и превратятся в "сердечки". Пусть придется потаскать за собой двумерный массив и обращаться к адресам, но будет работать...
rashsash вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JavaScript поля ввода/вывода Doublefaced Помощь студентам 2 03.06.2009 01:36
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
система ввода вывода StudentPolitech Общие вопросы C/C++ 3 02.04.2009 22:22
перехват консольного ввода\вывода Артем5555555 Win Api 14 28.10.2008 23:20