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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2011, 17:05   #1
сенатор
Новичок
Джуниор
 
Регистрация: 15.09.2011
Сообщений: 9
По умолчанию Объясните как работает прога

Добрый день, помогите пожалуйста с программой. Она написана, но понимаю все очень приблизительно, а чувствую мне завтра будет обеспечен расстрел. Объясните пожалуйста как она работает, в каждом блоге и что это за библиотеки.

Программа большая слишком, поэтому разбиваю на два сообщения.
Структура.

Условие:


Описать структуру с именем STUDENT, содержащую следующие поля: номер; фамилия и инициалы; номер группы
(аббревиатура специальности, курс); успеваемость (массив из пяти элементов). Написать программу,
выполняющую следующие действия:
1. Ввод данных в массив (файл, клавиатура на выбор пользователя); записи в массиве должны быть упорядочены по фамилии
и инициалам.
2. Вывод на экран фамилий и номеров групп для всех студентов, имеющих оценки 4 и 5.
3. Вывод на экран фамилий и успеваемости для всех студентов, включенных в массив, если специальность
равна N (char*, string).
Если нет таких студентов, вывести соответствующее сообщение.
Предусмотреть возможность редактирования элементов массива – удаление, добавление, изменение.


Код:
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <locale>
#include <conio.h>
#include <windows.h>
using namespace std;
typedef struct STUDENT{
	int nomer, usp[5];
	char family_i[100], ng_spec[100];
	bool hor;
};
int menu(){
	int k;
	system("cls");
	cout<<"1. Ввод данных с клавиатуры. "<<endl;
	cout<<"2. Ввод данных из файла. "<<endl;
	cout<<"3. Печать на экран"<<endl;
	cout<<"4. Вывод на экран фамилий и номеров групп студентов, имеющих оценки 4 и 5. "<<endl;
	cout<<"5. Поиск по специальности. "<<endl;
	cout<<"6. Добавить запись. "<<endl;
	cout<<"7. Удалить. "<<endl;
	cout<<"8. Изменить. "<<endl;
	cout<<"9. Сохранить данные в файл. "<<endl;
	cout<<"10. Выход. "<<endl;
	cout<<endl<<" Введите номер пункта меню "<<endl;
	cin>>k;
	
	return k;

}
void vvod(istream &c, STUDENT *A,int &n){
	c>>n;

	for(int i=0; i<n; i++){
		c>>A[i].nomer;
		char ch;
		while((ch=c.get())!='"');
		c.getline(A[i].family_i,100,'"');
		c.get();
		while((ch=c.get())!='"');
		c.getline(A[i].ng_spec,100,'"');
		for(int j=0; j<5; j++)
		{
			c>>A[i].usp[j];
			A[i].hor=true;
		}
		for(int j=0; j<5; j++)
		{
			if (A[i].usp[j]<=3)
				A[i].hor=false;
		}
		
	}
}

void vyvod(ostream &out,STUDENT *A,int  n){
for(int i=0; i<n; i++)
	out<<A[i].nomer<<' '<<A[i].family_i<<' '<<A[i].ng_spec<<' '<<A[i].usp[0]<<' '<<A[i].usp[1]<<' '<<A[i].usp[2]<<' '<<A[i].usp[4]<<' '<<A[i].usp[4]<<endl;
}

void poisk( STUDENT *A,int n){
	int k=0;
	for(int i=0; i<n; i++)
		if(A[i].hor==true){
			cout<<A[i].family_i<<' '<<A[i].ng_spec<<' '<<endl;
			k++;
		}
		if (k==0) cout<<"Таких студентов нет =/ Все троишники"<<endl;
}
Продолжение дальше.
сенатор вне форума Ответить с цитированием
Старый 15.09.2011, 17:05   #2
сенатор
Новичок
Джуниор
 
Регистрация: 15.09.2011
Сообщений: 9
По умолчанию

Код:
int poisk3(STUDENT *A,int n, char *theme)
{
	OemToCharA(theme,theme);
	for(int i=0; i<n; i++)
	{
		if(strcmp(A[i].family_i,theme)==0)
		{
			return i;
		}
	}
	return -1;
}

void poisk2( STUDENT *A, int n, char spec_s)
{
	int r=0;
	char ch;
	for(int i=0; i<n; i++)
	{
		ch=A[i].ng_spec[2];
		if(ch==spec_s)
		{
			cout<<A[i].family_i<<' '<<A[i].usp[0]<<' '<<A[i].usp[1]<<' '<<A[i].usp[2]<<' '<<A[i].usp[3]<<' '<<A[i].usp[4]<<endl;
			r++;
		}
	}
	if (r==0) cout<<"Информации о студентах этой специальности нет"<<endl;
	getchar();
}


void udal( STUDENT *A,int &n, int k)
{
	for(int i=k; i<n-1; i++)
	{
		A[i]=A[i+1];
	}
	n=n-1;
}
void addNote(STUDENT *A, int n)
{
	int l;
	l=n+1;
	A[l].nomer=l;
	cout<<"\nВведите Ф.И.О: ";
	cin.getline(A[l].family_i,100);
	cout<<"\nВведите номер группы: ";
	cin.getline(A[l].ng_spec,100);
	for(int q=0; q<5; q++)
	{
		cout<<"Введите оценку №"<<q+1<<": ";
		cin>>A[l].usp[q];
	}
	n=n+1;
}
void sort1(STUDENT *A, int n)
{
   char buffer_string[100];
   int i,j;
   for(i=n-1;i>0;i--)
      for(j=0;j<i;j++)
         if(strcmp(A[j].family_i, A[j+1].family_i) > 0)
		 {
            strcpy(buffer_string, A[j].family_i);
            strcpy(A[j].family_i, A[j+1].family_i);
            strcpy(A[j+1].family_i, buffer_string);
         }
}
void izmen( STUDENT *A,int n, int k)
{
	cout<<"\nВведите фамилию и инициалы: ";
	cin.getline(A[k].family_i,100);
	cout<<"Введите номер группы: ";
	cin.getline(A[k].ng_spec,100);
	for(int q=0; q<5; q++)
	{
		cout<<"Введите оценку №"<<q+1<<": ";
		cin>>A[k].usp[q];
	}
}
int main(){
	int n_p=0, N=0;
	STUDENT A[100];
	

	bool f=false;
	setlocale(LC_ALL,"Russian");
	while (n_p!=10){
	n_p=menu();
	cin.ignore(100,'\n'); 
	switch (n_p){
		case 1:			
			cout<<"Введите количество записей: ";
			cin>>N;
			for(int k=0; k<N; k++)
			{
				cin.ignore(100,'\n'); 
				cout<<"\nВведите номер студента: ";
				cin>>A[k].nomer;
				cout<<"\nВведите Ф.И.О "<<k+1<<"-студента:";
				cin>>A[k].family_i;
				OemToCharA(A[k].family_i,A[k].family_i);
				cout<<"\nВведите номер группы и аббревиатуру специальности: ";
				cin>>A[k].ng_spec;
				OemToCharA(A[k].ng_spec,A[k].ng_spec);
				for(int q=0; q<5; q++)
				{
					cout<<"Введите оценку №"<<q+1<<": ";
					cin>>A[k].usp[q];
				}

			}
				sort1(A,N);
				f=true; 
				break;
		case 2: {ifstream in; 
			in.open("input.txt",ios::in);
			if(in){
				vvod(in,A, N); 
				sort1(A,N);
				f=true;}
			else cout<<"Файл не найден";
				break;}
		case 3: if(f) vyvod(cout,A,N);
					else cout<<"Список пуст";
				break;
		case 4: {
				if(f){
					poisk(A,N);}
				else cout<<"Список пуст";
				break;}
		case 5: {char spec_s;
			    if(f){ 
					cout<<"Введите аббревиатуру специальности - ";
					cin>>spec_s;
					cout<<endl;
					poisk2(A,N,spec_s);}
				else cout<<"Список пуст";
				break;}
		case 6:
			{
				int b=0;
				b=N+1;
				cout<<"\nВведите Ф.И.О: ";
				cin>>A[b].family_i; 
				OemToCharA(A[b].family_i,A[b].family_i);
				cout<<"\nВведите номер группы: ";
				cin>>A[b].ng_spec;
				OemToCharA(A[b].ng_spec,A[b].ng_spec);
				for(int q=0; q<5; q++)
				{
					cout<<"Введите оценку №"<<q+1<<": ";
					cin>>A[b].usp[q];
				}
				N++;
			
			break;	}					
		case 7: {char theme[100];				
				int k=0;
			    if(f){ 
					cout<<"Введите Ф.И.О"<<endl;
					cin.getline(theme,100);
					k=poisk3(A,N,theme);
				    if (k==-1) cout<<"Информация об этом студенте отсутствует"<<endl;
					else {
						udal(A,N,k);
						cout<<"Запись удалена"<<endl;}
					}
				else cout<<"Список пуст";
				break;}
		case 8: {char theme[100];
				int k=0;
			    if(f){ 
					cout<<"Введите Ф.И.О"<<endl;
					cin.getline(theme,100);
					k=poisk3(A,N,theme);
				    if (k==-1) cout<<"Информация об этой теме отсутствует"<<endl;
					else {
						izmen(A,N,k);
						cout<<"Запись изменена"<<endl;}
					}
				else cout<<"Список пуст";
				break;}
		case 9: if(f)
				{ofstream out; 
				out.open("output.txt",ios::out);
				vyvod(out,A, N); 
				out.close();}
				else cout<<"Список пуст";
				break;
		case 10: break;
	default:
			cout<<"Введено недопустимое значение ><";
			break;

	}
	cout<<endl<<"Для продолжения нажмите любую клавишу";
	getchar();

	}

return 0;
}
сенатор вне форума Ответить с цитированием
Старый 15.09.2011, 17:07   #3
сенатор
Новичок
Джуниор
 
Регистрация: 15.09.2011
Сообщений: 9
По умолчанию

вторая программа.
Список.

Описать структуру с именем STUDENT, содержащую следующие поля: номер; фамилия и инициалы; номер группы
(аббревиатура специальности, курс); успеваемость (массив из пяти элементов). Написать программу,
выполняющую следующие действия:
1. Ввод данных в массив (файл, клавиатура на выбор пользователя); записи в массиве должны быть упорядочены по фамилии
и инициалам.
2. Вывод на экран фамилий и номеров групп для всех студентов, имеющих оценки 4 и 5.
3. Вывод на экран фамилий и успеваемости для всех студентов, включенных в массив, если специальность
равна N (char*, string).
Если нет таких студентов, вывести соответствующее сообщение.
Предусмотреть возможность редактирования элементов массива – удаление, добавление, изменение.

Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <locale>
#include <math.h>
#include <conio.h>

using namespace std;
typedef struct Student{
	int nomer, usp[5];
	char famio[100], ngro[100];
	Student *next;
};

int menu(){
	int k;
	system("cls");
	cout<<"1. Ввод данных с клавиатуры"<<endl;
	cout<<"2. Ввод данных из файла"<<endl;
	cout<<"3. Печать на экран"<<endl;
	cout<<"4. Студенты на 4 и 5"<<endl;
	cout<<"5. Поиск по специальности"<<endl;
	cout<<"6. Добавить запись"<<endl;
	cout<<"7. Удалить запись"<<endl;
	cout<<"8. Изменить запись"<<endl;
	cout<<"9. Сохранить данные в файл"<<endl;
	cout<<"10. Выход"<<endl;
	cout<<endl<<" Введите номер пункта меню "<<endl;
	cin>>k;
	
	return k;

}
void addNode(Student **first, int nom,int*us,char*fio,char*ng)
{
	Student *tmp;
	tmp = new Student;
	tmp->nomer = nom;
	strcpy(tmp->famio,fio);
	strcpy(tmp->ngro,ng);
	for (int i=0; i<5; i++) 
		tmp->usp[i] = us[i];
	tmp->next = NULL;
	if(first){
		tmp->next = (*first);
	}
	(*first)=tmp;
}

void sort1(Student **first, int n)
{ 
	Student **A = new Student*[n];
	Student *current;
	current = (*first);
	int i = 0;
	while (current!=NULL)
	{
		A[i]=current;
		i++;
		current = (current->next);
	}
	char pro[100];
	Student *uk;

	for (int a1=0; a1<n; a1++)
	{
		strcpy(pro,A[a1]->famio);
		for (int h1=0; h1<n; h1++)
		{
			if (strcmp(pro,A[h1]->famio)<0) 
			{
				uk=A[h1];
				A[h1] = A[a1];
				A[a1]=uk;
			}
		}
	}

	for (int jk=0; jk<n-1;jk++) 
	{
		A[jk]->next = A[jk+1];
	}
	(*first) = A[0];
	A[n-1]->next = NULL;
}
bool Na4i5 (Student *tmp)
{
	bool flag=true;
	for (int i=0; i<5; i++)
	{
		if(tmp->usp[i]<4)
			flag=false;
	}
	return flag;
}
void vivodn4i5 (ostream &out, Student *first,int n)
{ 
	int pr=0;
	Student *current;
	current = first;
	while (current!=NULL)
	{
		if (Na4i5(current))
			{
				out<<current->famio<<' '<<current->ngro<<endl;
			} 
		else pr++;

	current = (current->next);
	}

	if (pr==n) 
		out<<"Все троечники =/"<<endl;
}
Student *find(Student *first,int nom1)
{
	Student *tmp=first;
	while((tmp!=NULL)&&(tmp->nomer != nom1))
		tmp=tmp->next;
	return tmp;
}
void vvod(istream &c, Student **first,int & n)
{
	Student *tek = new Student;
	c>>n;
	for(int i=0; i<n; i++)
	{
		char ch;
		c>>(tek->nomer);
		cout<<(tek->nomer);
		while((ch=c.get())!='"');
		c.getline((tek->famio),100,'"');
		c.get();
		while((ch=c.get())!='"');
		c.getline((tek->ngro),5,'"');
		for (int j=0; j<5; j++) 
			c>>(tek->usp[j]);
		addNode(first,tek->nomer,tek->usp,tek->famio,tek->ngro);
	}
}

void vyvod(ostream &out,Student *first)
{
	Student *current;
	current = first;
	while (current!=NULL)
	{
		out<<current->nomer<<' '<<current->famio<<' '<<current->ngro<<' ';
		for (int j=0; j<5; j++) 
			out<<current->usp[j]<<' ';
		out<<endl;
		current = (current->next);
	}
}

bool Delete (Student **first, int nom1)
{
	if((*first) -> nomer == nom1)
	{
		Student *tmp=(*first);
		*first=tmp->next;
		delete tmp;
		return true;
	}
	else
	{
		Student *tmp=(*first);
		while((tmp->next != NULL)&&(tmp->next->nomer != nom1))
			tmp=tmp->next;
		if (tmp -> next == NULL)
			return false;
		else
		{
			Student *tmp1=tmp->next;
			tmp->next=tmp1->next;
			delete tmp1;
			return true;
		}
	}

}

void vyvodrn (Student *first, char spec)
{
	int sch=0;
	Student *current;
	current=first;
	while (current!=NULL)
	{
		if (current->ngro[2]==spec)
		{
			cout<<current->famio<<" "; 
			for (int j=0; j<5; j++) 
				cout<<current->usp[j]<<' ';
			cout<<endl;  
			sch++;
		}
		current=current->next;
	}
	if (sch==0)
		cout<<"Студентов с такой специальностью не обнаружено!"<<endl;
}
Продолжение в след сообщении.
сенатор вне форума Ответить с цитированием
Старый 15.09.2011, 17:08   #4
сенатор
Новичок
Джуниор
 
Регистрация: 15.09.2011
Сообщений: 9
По умолчанию

Код:
int main()
{
	setlocale(LC_ALL,"russian");
	Student *first = NULL;
	int N=0;
	ifstream in;
	in.open("input.txt",ios::in);
	int n_p=0;
	while (n_p!=10)
	{
	n_p=menu();
	switch (n_p)
	{
		case 1: 
		{
			cout<<"Введите количество записей: ";
			cin>>N;
			Student *tek = new Student;
			for(int i=0; i<N; i++)
			{
				char ch;
				cout<<"Введите номер студента: ";
				cin>>(tek->nomer);
				cout<<"Введите Ф.И.О: ";
				cin>>(tek->famio);
				cout<<"Введите номер группы и аббревиатуру специальности: ";
				cin>>(tek->ngro);
				for (int j=0; j<5; j++)
				{				
					cout<<"Введите оценку №"<<j+1<<": ";
					cin>>(tek->usp[j]);
				}
				addNode(&first,tek->nomer,tek->usp,tek->famio,tek->ngro);
			}
			sort1(&first, N);
		break;
		}
		case 2: 
		{
			ifstream in; 
			in.open("input.txt",ios::in);
			if(in)
			{
				vvod(in, &first,N);
				sort1(&first, N);
			}
			else cout<<"Файл не найден";
		break;
		}
		case 3:
		{
			if(first!=NULL) 
				vyvod(cout,first);
			else cout<<"Список пуст";
		break;
		}
		case 4: 
		{
			int k;
			if (first!=NULL)
				vivodn4i5(cout,first,N); 
		break;
		}
		case 5:
		{
			if (first!=NULL) 
			{
				char spec;
				cout<<"\n"<<"Введите символ - код специальности!"<<"\n";
				cin>>spec;
				vyvodrn(first,spec);
			}
		break;
		}
		case 6:
		{ 
			N++;
			Student Z;
			int nomer = N;
			Z.nomer = nomer;
			cout<<"Введите Ф.И.О"<<"\n";
			cin.ignore(99,'\n');
			cin.getline(Z.famio, 100);
			cout<<"Введите группу!"<<"\n";
			cin.getline(Z.ngro, 4);
			for (int kr=0; kr<5; kr++)
			{
				cout<<"Введите оценку номер "<<kr<<"\n";
				cin>>Z.usp[kr];
			}
			addNode(&first,Z.nomer,Z.usp,Z.famio,Z.ngro);
			sort1 (&first,N);
		break;
		}
		case 7:
		{
			int nom1;
			cout<<"Введите номер студента.."<<endl;
			cin>>nom1;
			if(Delete(&first,nom1))
				cout<<"Запись удалена"<<endl;
			else
				cout<<"\nИнформация об этом студенте не найдена.. оО"<<endl;
		break;
		}
		case 8: 
		{
			int nomer;
			cout<<"Введите номер студента!"<<"\n";
			cin>> nomer;
			Student Z;
			Z.nomer = nomer;
			Student *tmp1=find(first,nomer);
			if (tmp1!=NULL)
			{
				cout<<"Введите Ф.И.О\n";
				cin.ignore();
				cin.getline(Z.famio, 100);
				cout<<"Введите группу..\n";
				cin.getline(Z.ngro, 4);
				for (int kr=0; kr<5; kr++)
				{
					cout<<"Введите оценку №"<<kr+1<<endl;
					cin>>Z.usp[kr];
				}
				strcpy(tmp1->famio,Z.famio);
				strcpy(tmp1->ngro,Z.ngro);
				for (int sch=0;sch<5;sch++)
					tmp1->usp[sch]=Z.usp[sch];
				sort1 (&first,N);
			}
			else 
				cout<<"\n"<<"Студента с данным номером не найдено"<<"\n";
		break;
		}
		case 9: 
		{
			if(first!=NULL)
			{
				ofstream out; 
				out.open("output.txt",ios::out);
				vyvod(out,first);
				out.close();
			}
			else cout<<"Список пуст";
		break;
		}
		case 10: break;

		default:
			cout<<"Введено недопустимое значение";
			break;
	}
	cout<<endl<<"Для продолжения нажмите любую клавишу...";
	getch();
}
	return 0;
}
сенатор вне форума Ответить с цитированием
Старый 15.09.2011, 17:11   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И как объяснить эту простыню на тыщупицот строк? Скорее всего она выполняет указанное задание.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.09.2011, 17:16   #6
сенатор
Новичок
Джуниор
 
Регистрация: 15.09.2011
Сообщений: 9
По умолчанию

#include <windows.h>
что это значит? зачем она?

А еще не понятно как работают флаги во второй программе.

Последний раз редактировалось сенатор; 15.09.2011 в 17:18.
сенатор вне форума Ответить с цитированием
Старый 15.09.2011, 17:28   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В ней содержатся различные функции из WinAPI.

Какие флаги?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.09.2011, 18:26   #8
сенатор
Новичок
Джуниор
 
Регистрация: 15.09.2011
Сообщений: 9
По умолчанию

спасибо.

Код:
int poisk3(STUDENT *A,int n, char *theme)
{
	OemToCharA(theme,theme);
	for(int i=0; i<n; i++)
	{
		if(strcmp(A[i].family_i,theme)==0)
		{
			return i;
		}
	}
	return -1;
}
не понимаю что значит этот кусок.
сенатор вне форума Ответить с цитированием
Старый 15.09.2011, 18:36   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ищет что-то в вроде массиве структур? Если находит (т.е. family_i поле структуры идентично тому, что содержится в theme), то возвращает ее номер, если нет, то -1.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 15.09.2011, 18:43   #10
сенатор
Новичок
Джуниор
 
Регистрация: 15.09.2011
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ищет что-то в вроде массиве структур? Если находит (т.е. family_i поле структуры идентично тому, что содержится в theme), то возвращает ее номер, если нет, то -1.
OemToCharA(theme,theme)
непонятна вот эта запись.

А еще преподаватель может спросить, чем отличается первая программа от второй, и я не знаю как это объяснить.) Если не сложно.

Последний раз редактировалось сенатор; 15.09.2011 в 19:02.
сенатор вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ объясните пжлста как работает ПРОГРАММА monkey_tree Помощь студентам 0 21.06.2011 01:48
Народ объясните пжл как это работает???????? PRIVIDENIE18 Помощь студентам 5 29.05.2011 13:23
Множества, объясните как работает программа ilyas22 Помощь студентам 4 06.06.2010 12:17
Объясните как работает PaintBox. NIQK Компоненты Delphi 1 11.12.2009 17:46
Объясните, как работает функция strlen() TheWanderer Общие вопросы C/C++ 9 25.11.2008 22:46