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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2012, 15:07   #1
vanua2
 
Регистрация: 14.12.2011
Сообщений: 3
Сообщение C/C++ програма среда visual studio

//Не очень понимаю как реализовать функцию display? Она должна выводить то, что введено с клавиатуры.Как в эту функцию передать этот динамический массив?"Message* b; b= new Message[a];"?Еще если написать fread_s вместо fread выводит ошибку,они чемто отличаются?
//КОД
Код:
#include <iostream>
#include <stdio.h>
using namespace std;
struct Message{
	int type;
	char service[20];
	char reason[300];
};
Message* input_keyboard(){
	int a;
 cout<<"Input number for add: "<<endl;
cin >>a;
Message* b;
b= new Message[a];
for(int i=0; i<a; i++){
	cout<<"Input type: ";
	cin >>b[i].type;
	cout<<"Input service: ";
	gets(b[i].service);
	cout<<"Input reason: ";
	gets(b[i].reason);
};
return b;
}
Message* input_file()
{ char string[200];
	FILE *f;
do{
	cout<<"Input path to file: ";
	gets(string);
	f=fopen(string,"rb+");
	if(f==NULL)
	{cout<<"Error.Verify file name.";}}
while(f==NULL);
Message*input;
input=new Message;
int k=1;
fread(&input[k-1],sizeof(Message),1,f);
while(!feof(f)){
	k++;
	input=(Message*)realloc(input,(k+1)*sizeof(Message));
	fread(&input[k-1],sizeof(Message),1,f);
	input[k].type=-1;
	return input;
}}
Message*display(){
	Message* b;
	b= new Message[a];
	for (int i=0;i<sizeof(new Message);i++){
	cout<<"Тип повідомлення:"<<b[i].type;
	cout<<"Cервіс повідомлення:"<<b[i].service;
    cout<<"Причина:"<<b[i].reason;	
	}}
	Message* output_file(){

	}

void main (){
	char q;
	do 
	{cout<<"\n1 input from keybord, 2 input from file, e-exit: ";
	cin>> q;
	switch (q) {
	case '1': input_keyboard(); break;
	case '2': input_file (); break;
	case 'e': cout<<"\nexit"; return;
	default: cout<<"\nerror"; }; }
	while (q!='1' && q!='2');
		do 
		{cout<<"\n1 output to display, 2 output to file, e-exit: ";
		cin>> q;
		switch (q) {
		case '1': display();break;
		case '2': output_file (); break;
		case 'e': cout<<"\nexit"; return;
		default: cout<<"\n error"; }; }
		while (q!='1' && q!='2');  }
vanua2 вне форума Ответить с цитированием
Старый 28.01.2012, 18:15   #2
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
.Как в эту функцию передать этот динамический массив?
Про способы передачи параметров почитайте!
А то вы просто оперируете локальными данными и всё!
Можете глобал использовать, но это уж как хотите!
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 29.01.2012, 01:29   #3
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

Поправил, старался ничего не менять в вашем коде.
Единственно переписал ф-ю input_file(). (написал как можно проще)
К сожалению, сейчас нет возможности проверить работоспособность.
Если возникнут проблемы обращайтесь.

Полезная литература:
Полный справочник по C++ Автор: Герберт Шилдт;
Соглашения по оформлению кода команды RSDN

Код:
/*
поправки:
	a				->size 
	input_keyboard	->inputKeyboard
	output_file		->outputFile
	input_file		->inputFile
	q				->team
	функция inputFile упростил в первой строке текстового файла должно быть указано размер массива  
*/

#include <iostream>
#include <fstream>
#include<string>
#include <stdio.h>
using namespace std;

struct Message{
	int type;
	char service[20];
	char reason[300];
};

//тут будут прототипы функций 
Message* inputKeyboard(int &size);//создаем массив и заполняем его с клавиатуры 
Message* inputFile(int &size);//ввод данных с файла 
int display(Message *arrayStruc,int size);//выводим на монитор массив 
int outputFile(Message *arrayStruc,int size);//выводим в текстовый файл
int free(Message*arr);

int main (){
	setlocale(LC_ALL,"Russian");
	
	char team;
	int size=0;// размер масива 
	Message *test=NULL;//наш указатель на массив структур Message
	
	do {
		cout<<" 1 ввод данных с клавиатуры \n 2 ввод данных с файла \n 0-выход"<<endl;
		cin>>team;
		switch (team) {
		case '1': test=inputKeyboard(size);//ф-я возвращает массив структур  Message размером size
			break;
		case '2': test=inputFile(size);//ф-я возвращает массив структур  Message размером size
			break;
		case '0': cout<<"exit"<<endl; 
			return 0;
		default: cout<<"команда не верна "<<endl; 
		}
	}while (team!='1' && team!='2'); 

	do {
		cout<<"\n 1 вывод на монитор \n 2 вывод в текстовый файл \n 0-выход: "<<endl;
		cin>>team;
		switch (team) {
		case '1': display(test,size);
			break;
		case '2': outputFile(test,size); 
			break;
		case '0': cout<<"exit"<<endl; 
			return 0;
		default: cout<<"error"<<endl;
		}
	} while (team!='1' && team!='2'); 
	free(test);//незабываем удалять массив
	system("pause");
	return 0;
}




Message* inputKeyboard(int &size){

	cout<<"введите количество собщений: "<<endl;
	cin >>size;
	/*
	Message* b;
	b= new Message[size];*/
	Message *b= new Message[size];//сделаем проще
	for(int i=0; i<size; i++){
		cout<<"тип сообщения: ";
		cin >>b[i].type;
		cout<<"сервис сообщения: ";
		cin>>b[i].service;
		cout<<"причина: ";
		cin>>b[i].reason;
	}
	return b;
}

Message* inputFile(int &size){//ввод данных с файла 
	string fname;
	cout<<"Введите имя файла "<<endl;
	cin>>fname;

	ifstream in(fname);//in ->поток для ввода
	if(!in){
		cout<<"невозможно открыть файл"<<endl;
		return NULL;
	}

	in>>size;//читаем размер массива
	Message *b= new Message[size];//создаем массив
	for(int i=0; i<size; i++){//от первого до последнего элемента
		in>>b[i].type;
		in>>b[i].service;
		in>>b[i].reason;
	}
	in.close();//закрываем файл
	return b;//возвращаем адрес первого элемента массива структур
}

int display(Message *arrayStruc,int size){// ввод массив, размер

	for (int i=0;i<size;i++){
		cout<<"тип сообщения: "<<arrayStruc[i].type<<endl;
		cout<<"сервис сообщения: "<<arrayStruc[i].service<<endl;
		cout<<"причина: "<<arrayStruc[i].reason<<endl;	
	}
	return 0;
}


int outputFile(Message *arrayStruc,int size){
	string fname;
	cout<<"Введите имя файла "<<endl;
	cin>>fname;

	ofstream out(fname);//out ->поток для вывода
	if(!out){
		cout<<"невозможно открыть файл"<<endl;
		return 1;
	}

	out<<size<<endl;//первой строкой запишем размер массива
	for(int i=0; i<size; i++){//от первого до последнего элемента
		out<<arrayStruc[i].type<<endl;
		out<<arrayStruc[i].service<<endl;
		out<<arrayStruc[i].reason<<endl;
	}
	out.close();//закрываем файл
	return 0;
}

int free(Message*arr){//освобождаем память 
	delete[]arr;
	return 0;
}

Последний раз редактировалось _kilik_; 29.01.2012 в 14:36.
_kilik_ вне форума Ответить с цитированием
Старый 29.01.2012, 02:12   #4
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Rififi, не провоцируйте, пожалуйста, форумчан на неадекватные высказывания в вашу сторону.
vanua2, не поддавайтесь на провокации, ведите себя культурно и не ругайтесь.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C/C++ калькулятор среда visual studio vanua2 Помощь студентам 0 03.01.2012 14:31
Среда разработки Visual C (альтернатива Visual Studio) plyeh Visual C++ 5 25.06.2010 16:27
Visual Studio Standard 2008 против Visual Studio Express 2008. Стоит ли покупать? Casper-SC Софт 4 31.12.2009 11:46
VISUAL STUDIO 2008 defaul language - как переключить в VISUAL STUDIO 2008 язык программирования, использ Эйнж Общие вопросы C/C++ 0 27.12.2009 20:39
среда Visual studio 2008 и vs 6 Roman Visual C++ 2 09.10.2008 10:17