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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2012, 23:51   #1
Lost7070
Пользователь
 
Регистрация: 02.03.2012
Сообщений: 25
Сообщение Функции в С++.

Здравствуйте. Написал код программы, которая просто добавляет элементы в структуру. Но мне нужно добавление элементов зделать через функции.
Как создавать и работать с функциями я знаю, но не могу понять как именно и что нужно возвращать из функции, чтобы лементы добавлялись.
Код ниже.
Код:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <ctype.h>
#include <conio.h> 
#include <iostream>	
using namespace std;
struct library
{
	char name[30];
	char author[30];
	int year;
};
library books[300];
int _tmain(int argc, _TCHAR* argv[])
{	int i=0,j=0,num;
:start
		cout<<"Список книг: "<<endl;
		cout<<j;
		for(i=0;i<j;i++)
			cout<<i+1<<". "<<books[i].author<<": "<<books[i].name<<" "<<books[i].year<<endl;
cout<<"Добавить количество книг: "; cin>>num;
		for(i=0;i<num;i++)
		{
			cout<<"Название книги: ";cin.getline(books[j].name,sizeof(books[j].name));cin.getline(books[j].name,sizeof(books[j].name));
			cout<<"Автор книги: "; cin.getline(books[j].author,sizeof(books[j].author));
			cout<<"Год издания: "; cin>>books[j].year;
			system("cls");
			j++;
		}
goto start;
}
подошёл к проблеме с другой строны и получился вот такой код:
Код:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
struct library
{
	string name;
	string author;
	short year;
};
bool add(library *);
int _tmain(int argc, _TCHAR* argv[])
{
	library book;
	if (add(&book))
	{
		cout<<"Yes !\n";
		cout<<endl<<book.name
			<<endl<<book.author
			<<endl<<book.year;
	}
	else
		cout<<"\a Error\n";
	cin.get(); cin.get();
	return 0;
}
bool add(library *ptr)
{
	bool check=true;
	cout<<"Имя: "; getline(cin,ptr->name);
	cout<<"Автор:"; getline(cin,ptr->author);
	cout<<"Год: "; cin>>ptr->year;
	if(ptr->year>2012||ptr->year<1) check=false;
	return check;
}
Тут функция работает отлично, но добавляет только один элемент, а у меня массив структур. нужно чтобы добавлялись новые элементы, не трогая предыдущие. Натолкните пожалуйста на правильный мысли.
Заранее благодарен всем, кто отзовётся.
Lost7070 вне форума Ответить с цитированием
Старый 14.04.2012, 23:58   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Код:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
struct library
{
	string name;
	string author;
	short year;
};
bool add(library *);
int _tmain(int argc, _TCHAR* argv[])
{
	library book[300];
	int pos=0;
	if (add(&(book[pos])))
	{
		pos++;
		cout<<"Yes !\n";
		cout<<endl<<book[pos-1].name
			<<endl<<book[pos-1].author
			<<endl<<book[pos-1].year;
	}
	else
		cout<<"\a Error\n";
	cin.get(); cin.get();
	return 0;
}
bool add(library *ptr)
{
	bool check=true;
	cout<<"Имя: "; getline(cin,ptr->name);
	cout<<"Автор:"; getline(cin,ptr->author);
	cout<<"Год: "; cin>>ptr->year;
	if(ptr->year>2012||ptr->year<1) check=false;
	return check;
}
Вот так, по идее.
pos указывает на первое свободное место в массиве.
Но, по-хорошему, нужно создавать не массив структур, а односвязный список, чтобы можно было добавить любое (почти) количество книг.
Конечно это зависит от ваших целей.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.04.2012, 00:32   #3
Lost7070
Пользователь
 
Регистрация: 02.03.2012
Сообщений: 25
По умолчанию

Исправил свой код на Ваш. Теперь он и вправду дополняет массив, но предыдущие элементы заполняет Новыми введёнными значениями, тоесть при выводе уже нескольких элементов массива выводятся одни и те же, которые были введены в последний раз.
Lost7070 вне форума Ответить с цитированием
Старый 15.04.2012, 00:38   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

А как вы выводите все элементы массива?
Киньте код сюда.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.04.2012, 00:39   #5
Lost7070
Пользователь
 
Регистрация: 02.03.2012
Сообщений: 25
По умолчанию

Думал над тем, что может быть можно указатель направить на сам массив, но как это сделать и можно ли вобще не знаю.
Lost7070 вне форума Ответить с цитированием
Старый 15.04.2012, 00:40   #6
Lost7070
Пользователь
 
Регистрация: 02.03.2012
Сообщений: 25
По умолчанию

Вот что у меня получилось.
Код:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
struct library
{
	string name;
	string author;
	int year;
};
bool add(library *);
int _tmain(int argc, _TCHAR* argv[])
{
	int o=0;
	int pos=0;
	while (o==0)
	{
	library book[300];
	if (add(&(book[pos])))
	{
		int i;
		for(i=0;i<=pos;i++)
		{
		cout<<endl<<book[pos].name
			<<endl<<book[pos].author
			<<endl<<book[pos].year;
		}
		pos++;
	}

	else
		cout<<"\a Error\n";
	cin.get(); cin.get();
	}
	return 0;
}
bool add(library *ptr)
{
	bool check=true;
	cout<<"Имя: "; getline(cin,ptr->name);getline(cin,ptr->name);
	cout<<"Автор:"; getline(cin,ptr->author);
	cout<<"Год: "; cin>>ptr->year;
	if(ptr->year>2012||ptr->year<1) check=false;
	return check;
}
Уффф... Уже второй день ломаю голову над этой проблемой)))
Lost7070 вне форума Ответить с цитированием
Старый 15.04.2012, 00:40   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Указателем на массив является имя массива.
Напишите и текст задачи, чтобы мне было легче думать)

Ошибочка. Нужно вот так:
Код:
int i;
		for(i=0;i<=pos;i++)
		{
		cout<<endl<<book[i].name
			<<endl<<book[i].author
			<<endl<<book[i].year;
		}
		pos++;
Вы просто индекс перепутали, поэтому и печатали все время только последний элемент массива.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 15.04.2012 в 00:43.
BDA вне форума Ответить с цитированием
Старый 15.04.2012, 00:45   #8
Lost7070
Пользователь
 
Регистрация: 02.03.2012
Сообщений: 25
По умолчанию

Ну честно говоря по задаче всё куда сложнее.
нужно написать программу, что-то напоминающее базу данных библиотеки. Там должно быть добавление, удаление, редактирование, поиск книг.
Код есть и он рабочий, но он без использования функций.
Показал его, заставили делать через функции все операции.
Сел делать и завис на первой функции добавления элементов.
Если не отниму много времени у вас, могу отправить и весь код программы, которую нужно переписать с использованием функции.
Lost7070 вне форума Ответить с цитированием
Старый 15.04.2012, 00:46   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

"Кидайте", а там посмотрим, как дело пойдет
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.04.2012, 00:53   #10
Lost7070
Пользователь
 
Регистрация: 02.03.2012
Сообщений: 25
По умолчанию

Ну вобщем вот что у меня получилось, тут и запись и считавание из файла тоже есть, но это не суть важно. Очень Вам признателен, что "возитесь" со мной. Спасибо.
Код:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <fstream>
#include <ctype.h>
#include <conio.h> 
#include <iostream>	
using namespace std;
struct library
{
	char name[30];
	char author[30];
	int year;
};
library books[300];
int _tmain(int argc, _TCHAR* argv[])
{
	char str[30];
	int i=0,j=0,num,temp;
	FILE* l;
	l=fopen("D:\\Library\\Lib.txt","r"); //Открытие файла
	while(feof(l)==0) //Подсчёт строк
	{
		fgets(str,30,l);
		j++;
	}
	fclose(l);
	l=fopen("D:\\Library\\Lib.txt","r");
	if (j==0)
		{
			cout<<"Каталог пуст.\n"; 
		}
	else
	for (i=0;i<j;i++) //Добавление в массив бибилиоткеки данных из файла
	{
		fgets(books[i].name,30,l);
		temp=strlen(books[i].name); //Определяет длину строки
		books[i].name[temp-1]='\0';
		fgets(books[i].author,30,l);
		temp=strlen(books[i].author);
		books[i].author[temp-1]='\0';
		fgets(str,30,l);
		books[i].year=atoi(str);
	}
	j=i/3; 
	fclose(l);
start:
	int choice=6;
	system("cls");
	while(choice>5)
	{
		cout<<"Список книг: "<<endl;
		cout<<j;
		for(i=0;i<j;i++)
			cout<<i+1<<". "<<books[i].author<<": "<<books[i].name<<" "<<books[i].year<<endl;
		cout<<"Действия над каталогом:\n 1.Добавление записей\n 2.Редактирование записей\n 3.Удаление записей\n 4.Поиск\n 5.Завершение работы.\n";
		cin>>choice;
		if(choice>5)
			cout<<"Ошибка ввода ! Повторите попытку.\n";
	}
	if (choice==1)
	{
		j++;
		cout<<"Количество книг: "; cin>>num;
		for(i=0;i<num;i++)
		{
			cout<<"Название книги: ";cin.getline(books[j].name,sizeof(books[j].name));cin.getline(books[j].name,sizeof(books[j].name));
			cout<<"Автор книги: "; cin.getline(books[j].author,sizeof(books[j].author));
			cout<<"Год издания: "; cin>>books[j].year;
			system("cls");
			j++;
		}
		goto start;
	}
	if (choice==2)
	{
		cout<<"Номер редактируемой книги:"; cin>>num;
		cout<<"Новое название книги: "; cin.getline(books[num-1].name,sizeof(books[num-1].name));cin.getline(books[num-1].name,sizeof(books[num-1].name));//cin>>books[num-1].name;
		cout<<"Новый автор: "; cin.getline(books[num-1].author,sizeof(books[num-1].author));
		cout<<"Новый год издания "; cin>>books[num-1].year;
		system("cls");
		goto start;
	}
	int c;
	if (choice==3)
	{
		cout<<"Номер удаляемой записи:"; cin>>num;
		for (i=num-1;i<j;i++)
		{
			for(c=0;c<30;c++)
			{
				books[i].name[c]=books[i+1].name[c];
				books[i].author[c]=books[i+1].author[c];
			}
			books[i].year=books[i+1].year;
		}
		j--;
		system("cls");
		goto start;
	}
	int menu=3;
	char name[30];
	if (choice==4)
	{
search:
		system("cls");
		cout<<"Поиск по :\n 1.Названию.\n 2.Автору\n 3.Году издания. \n"; cin>>num;
		if (num==1)
		{
			c=0;
			cout<<"Введите название книги: "; cin.getline(name,sizeof(name));cin.getline(name,sizeof(name));
			system("cls");
			cout<<"Результаты поиска:\n";
			for (i=0;i<j;i++)
			{
				if (strstr(books[i].name,name)!=NULL)
				{
					c++;
					cout<<c<<". Автор книги: "<<books[i].author<<" Название книги: "<<books[i].name<<" Год издания: "<<books[i].year<<endl;
				}
			}
			if(c==0)
					cout<<"По запросу ничего не найдено."<<endl;
			while(menu>2)
			{
				cout<<" 1.Назад\n 2.В главное меню\n"; cin>>menu;
				if(menu==1)
					goto search;
				if(menu==2)
					goto start;
				if(menu>2)
					cout<<"Ошибка ввода! Повторите попытку.\n";
			}
		}
		if (num==2)
		{
			c=0;
			cout<<"Введите автора книги: "; cin.getline(name,sizeof(name));cin.getline(name,sizeof(name));
			system("cls");
			cout<<"Результаты поиска:\n";
			for (i=0;i<j;i++)
			{
				if (strstr (books[i].author,name)!=NULL)
				{
					c++;
					cout<<c<<". Автор книги: "<<books[i].author<<" Название книги: "<<books[i].name<<" Год издания: "<<books[i].year<<endl;
				}	
			}
			if(c==0)
					cout<<"По запросу ничего не найдено."<<endl;
			menu=3;
			while(menu>2)
			{
				cout<<" 1.Назад\n 2.В главное меню\n"; cin>>menu;
				if(menu==1)
					goto search;
				if(menu==2)
					goto start;
				if(menu>2)
					cout<<"Ошибка ввода! Повторите попытку.\n";
			}
		}
		if (num==3)
		{
			int year;
			c=0;
			cout<<"Введите год издания книги: "; cin>>year;
			system("cls");
			cout<<"Результаты поиска:\n";
			for(i=0;i<j;i++)
			{
				if (books[i].year==year)
				{
					c++;
					cout<<c<<". Автор книги: "<<books[i].author<<" Название книги: "<<books[i].name<<" Год издания: "<<books[i].year<<endl;
				}
			}
			if(c==0)
					cout<<"По запросу ничего не найдено."<<endl;
			menu=3;
			while(menu>2)
			{
				cout<<" 1.Назад\n 2.В главное меню\n"; cin>>menu;
				if(menu==1)
					goto search;
				if(menu==2)
					goto start;
				if(menu>2)
					cout<<"Ошибка ввода! Повторите попытку.\n";
			}
		}
	}
Lost7070 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как подменить адрес возврата функции func на адрес функции f используя переполнение буфера buf и функции gets dmitrii6120 Помощь студентам 6 14.11.2011 20:10
Мини бэйсик:объявление функции, вызов функции , возврат. AL_LORD Помощь студентам 2 14.10.2010 17:48
Программа на СИ++, используя функции работы с файлами и функции <string.h> Аня Popova Фриланс 9 13.09.2010 15:52
Чем отличается описание функции от определения функции в С++? Go6a Помощь студентам 4 18.07.2009 18:07
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57