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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2010, 12:35   #1
anuta90
 
Регистрация: 06.06.2010
Сообщений: 7
По умолчанию Программа с очередями на Си

Здравствуйте! Мне нужна программа на Си, которая будет включать в себя структуру и функции для работы с очередями. А именно в текстовом файле находится очередь из студентов с такими полями: имя, фамилия, группа, стипендия. Нужны функции добавления и удаления из очереди, а так же функция поиска. Можно еще какие то другие функции. Все действия должны отражаться на текстовом файле так, чтобы при последующем запуске программы мы работали уже с измененным файлом.
Заранее спасибо
anuta90 вне форума Ответить с цитированием
Старый 28.10.2010, 13:06   #2
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

anuta90 покажите ваш код программы, постараемся помочь. Данный пример, если мне память не изменяет, был полностью рассмотрен в книжке
Цитата:
Т. А. Павловская, Ю. А. Щупак
C++. Объектно-ориентированное программирование. Практикум
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶
dxdy вне форума Ответить с цитированием
Старый 28.10.2010, 13:10   #3
anuta90
 
Регистрация: 06.06.2010
Сообщений: 7
По умолчанию

моя программа к сожалению умеет только выводить на экран имена тех студентов, которые получают стипендию, т е у которыф в этом поле стоит число больше 0. мне нужно увеличить функциональность проги. вот собстевнно сам код

Файл VadikL1Head.h
Код:
# ifndef _VADIKL1HEAD_H_
# define _VADIKL1HEAD_H_

struct Student
{
	char name[32],surname[32],group[32];
	int stepa;// стипендия
	Student *next;// указатель на следующий элемент очереди
};

void Push(Student **,Student); // закладывает в очередь новый элемент типа Student
void Del(Student *,Student **);// удаляет из очереди  элемент типа Student
void StudCpy(Student *,Student);//передается 2 студента - перый с помошью указателля, второй - все поля второго копируем в поля первого
void MyStrCpy(char *,char *);
void ReadFile(char *,Student**,Student **);
void PrintAllGoodStud(Student *);
void PrintStud(Student);
int Int(char *);

# endif
Файл VadikL1Head.cpp
Код:
#include "VadikL1Head.h"
#include <iostream>
#include <fstream>
using namespace std;

void Push(Student ** last,Student ref)//функция которая кладет нового студента в очередь
{
	Student *tmp= new Student;// создаем динамическкую память для нового студента
	StudCpy(tmp,ref);//копируем все данные из оддного студента в другого
	tmp->next=0;//последний элемент
	if(*last!=0)//
		(*last)->next=tmp;//
	*last=tmp;
}

void Del(Student *f,Student **l)//удаление всей очереди
{
	if(!f)
		Del(f->next,l);
	delete f;
	*l=f;
}

void StudCpy(Student *s1,Student s2)//копирование данных из одного студента в другого
{
	MyStrCpy(s1->name,s2.name);
	MyStrCpy(s1->surname,s2.surname);
	MyStrCpy(s1->group,s2.group);
	s1->stepa=s2.stepa;
}

void MyStrCpy(char *str1,char *str2)//функция которая копирует строки
{
	int i=0;
	for(i=0;str2[i];i++)
		str1[i]=str2[i];
	str1[i]='\0';
}

void ReadFile(char *filename,Student **first,Student **last)
{
	int i=0;//просто создаем переменную и зануляем
	char tmpstr[256];//создаем массив чаров - будем юзать как временное хранилище строк
	Student tmpstud;//временный студент
	ifstream in(filename);//открываем файл для чтения in - файловый поток из которого считываем построчно информацию
	while(in)
	{
		in.getline(tmpstr,32);
		switch(i%4)
		{
			case 0:
				MyStrCpy(tmpstud.name,tmpstr); //копируем строчку которую мы 
считали в tmpstr в поле имени временого студента
				break;
			case 1:
				MyStrCpy(tmpstud.surname,tmpstr);
				break;
			case 2:
				MyStrCpy(tmpstud.group,tmpstr);
				break;
			case 3:
				tmpstud.stepa=Int(tmpstr);
				Push(last,tmpstud);//кладем временного студента в очередь
		}
		if((*first)==0)//если очередь пустая была то после Push last будет указывать на
 первый элемент очереди а first все еще 0 будет равен
			*first=*last;//приравниваеи first и last чтоб first тоже на 1 элемент указывал 
и потом больше не трогаем, а Last дальше изменяется
		i++;
	}
	in.close();
}

void PrintStud(Student st)//распечатка любого студента
{
	cout << "Name:\t\t" << st.name << endl
	<< "Surname:\t" << st.surname << endl
	<< "Group:\t\t" << st.group << endl
	<< "Stepa:\t\t" << st.stepa << endl << endl;
}

void PrintAllGoodStud(Student *first)
{
	Student *tmp=first; //создаем временный указатель на студента(tmp) и
 приравниваем этот указатель к указателю на  голову  очереди 
	while(tmp)//пока наш указатель(tmp) не станет равным 0
	{
		if(tmp->stepa > 0)//если поле степы у студента на которого указывает
 tmp больше 0 (он ее получает ) то мы его распечатываем
			PrintStud(*tmp);//то мы его распечатываем
		tmp=tmp->next;//припавниваем tmp к указателю на следуюшего студента
 в очереди, который хранится в поле next в студенте на которого указывает tmp 
	}
}
int Int(char *str)//функция превращения строки в число
{
	int i=0,tmp[256],res=0;
	while(str[i])
	{
		if(str[i]>='0' && str[i]<='9')// проверяем, если итый символ находится от 0 до 9
(т.е. символ-представление цифры), tmp[i]=str[i]-'0';
//мы записываем в итую ячейку массива tmp разность между аски кодом символа в str[i] и 
символом нуля ( тем самым мы получаем числовое представление все тойже цифры что в str[i])
		else
			exit(1); //если условие ифа не выполняется ( str[i] не хранит в себе символ цифры) то выходим из программы

		i++;// i на 1 увеличиваемм 
	}
	for(int j=i-1;j>=0;j--)// перебираем все числа из массива tmp с конца
	{
		for(int k=0;k <i-j-1;k++)//мы умножаем цифру на 10 k раз где k - номер ее разряда
			tmp[j]*=10;
		res+=tmp[j];//потом все это складываем
	}

	return res;//возвращаем это число
}

Файл VadikL1Main.cpp

Код:
#include "VadikL1Head.h"

int main()
{
	Student *first=0,*last=0;
	char *filename="1.txt";
	ReadFile(filename,&first,&last);
	PrintAllGoodStud(first);
	Del(first,&last);
	return 0;
}
From Stilet: Что религия правильно код оформить не позволяет, или это проявление злостного неуважения к форумчанам?

Последний раз редактировалось Stilet; 28.10.2010 в 13:48.
anuta90 вне форума Ответить с цитированием
Старый 28.10.2010, 13:25   #4
anuta90
 
Регистрация: 06.06.2010
Сообщений: 7
По умолчанию

а в каком из разделов книги рассмотрен данный пример?
anuta90 вне форума Ответить с цитированием
Старый 28.10.2010, 13:38   #5
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

anuta90 задача "Поиск в массиве структур". Но там больше идет упор на классы. В принципе надо лишь немного поправить ваш код.
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶
dxdy вне форума Ответить с цитированием
Старый 29.10.2010, 07:57   #6
anuta90
 
Регистрация: 06.06.2010
Сообщений: 7
По умолчанию

но там не совсем то, что мне надо...
anuta90 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа открыается если есть другая программа. bookkc Паскаль, Turbo Pascal, PascalABC.NET 12 14.10.2009 20:09
[PASCAL]Программа создания файла, программа обработки файла Виколяшка Фриланс 7 23.09.2009 17:38
Программа создания файла, программа обработки файла [PASCAL] Виколяшка Помощь студентам 1 22.09.2009 22:56