Задача По С++

vladis222

Active member
06.12.2011
31
0
#1
Здравствуйте, прошу помощи по такому вопросу:у нас 1 лабораторная в этом семестре-работа с переходом от си к си++. цель работы состоит в том, что дана таблица из в которой описаны произв-во комбайнов и тракторов за 50-57 годы. и нужно сформировать рез-т в виде макс процента по отношению, записать его в выходной файл. я часть работы сделал,нашел это значение, но с файлами работаю не чоень, не очень понимаю в какой посл-ти нужно выполнять с ними работу. Подскажите пожалуйста.
Вот код:<!--shcode--><pre><code class='"#include<iostream>
using namespace std;
#include<fstream>
#include<iomanip>
const int N= 10;
const int LN= 20;
const int LC= 15;
const int LG_I= 77;
const int LG_V= 52;

/* ========================================== ИСХОДНЫЕ ДАННЫЕ =================================================================== */
struct stricx /* структурный тип и исходная таблица */
{char name[LN+1'>; /* название cтраны */
int tr_50; /* Число тракторов в 50 году */
int tr_57; /* Число тракторов в 75 году */
float komb_50; /* Число комбайнов в 50 году */
float komb_57; /* Число комбайнов в 75 году */
};stricx c[N];
int n /* Реальное количество стран*/
/* ========================================== Результаты =================================================================== */
struct result
{char name[LN+1]; /* название cтраны, в которой процент прироста парка комбайнов в 50 году по сравнению к 57 году-макс. */
float abs_prir; /* абсолютный прирост парка комбайнов найденной страны 50-57 годов . */
}; result c[N];
//==================================================== ПРОМЕЖУТОЧНЫЕ ДАННЫЕ=====================================================
int fl=0; /* признак: файл еще не создан */
ofstream fileout; /* поток (для задания) */
char namevix[13]; /* имя выходного потока */
int pvix; /* есть ли в командной строке имя потока ?*/
char sg_vix[LG_V+1]={"---------------------------------------------------\n"};
/* =====================================================ГЛАВНАЯ ФУНКЦИЯ ===================================================== */
main(int argc,char * argv[])
/* имя выходного - аргумент main */
/* имя входного - пользователь */
// Проверка ограничений: задание в командной строке имени выходного файла
// Проверка ограничений: задание в командной строке имени
// выходного файла
if (argc == 0)
{ cerr<<"При вызове программы укажите имя выходного файла !!!\n";
getch();
pvix=0; exit(-1);
};
strcpy(namevix,argv[1]); // запоминание имени выходного потока
int clrscr();
//================================================ФУНКЦИЯ ДЛЯ ЗАДАНИЯ 1 - СОЗДАНИЕ ИСХОДНОЙ ТАБЛИЦЫ===============================*/
void create_t()
{int pr;
int i;
float r;
char sg_icx[LG_I+1]="--------------------------------------------------------\n";
cout <<"Создание таблицы\n";
if(fl)
{cerr << "ТАБЛИЦА УЖЕ БЫЛА СОЗДАНА !!!\n";
int getch();
exit(-1);
}
else
{fl=1;
do
{cout << "Введите количество стран (не более чем "<<N << "): ";
cin >> n;
if(n<0 || n>N)
{pr=1; cout << "Вы ошиблись!\n";}
else pr=0;
} while(pr);
//============================================================== Ввод табличных данных =========================================//
cout << "Введите данные о странах\n";
cout << sg_icx;
cout << "!NN! Название страны ! Кол-во тракторов в 50 году ! Кол-во тракторов в 57 году";
cout << " Кол-во комбайнов в 50 году ! Кол-во комбайнов в 57 году !\n";
cout << sg_icx;
do /* проверка ограничений */
{for(i=0; i<n; i++)
{cout << "! " << i+1 << " ";
cin >> c.name;
cin >> c.tr_50;
cin >> c.tr_57;
cin >> c.komb_50;
cin >> c.komb_57;

if(c.tr_50<0 || c.tr_57<0||c.komb_50||c.komb_57<0)
{pr=1;
cerr << "Вы ошиблись. Повторите ввод\n"; i--; }
else pr=0;
}
}while(pr);
cout << sg_icx;
cout << "Создана таблица из " << i << " записей\n";
}
}
/*========================================================Выполнение задания=============================================================*/
/*=============Нахождение страны, у которой процент прироста комбайнов в 1957 году по отношению к 1950 году максимальный================*/
void percent_max()
{int pr;
float perc_max;
int n_max;
n_max=-1;perc_max=((c[0].komb_57-c[0].komb_50)*0,01);
for(int i=0;i<n;i++)
{
if(((c.komb_57-c.komb_50)*0,01)>((c[0].komb_57-c[0].komb_50)*0,01))
{perc_max=((c.komb_57-c.komb_50)*0,01); n_max=i;}
}
ifstream f;[/CODE]
 
R

rrrFer

#2
Код:
using namespace std;
#include
#include
сначала include, потом using.
но с файлами работаю не чоень, не очень понимаю в какой посл-ти нужно выполнять с ними работу. Подскажите пожалуйста.
1. создаешь идентификатор файла(файлового потока) в своей программе, например:
Код:
std ::ifstream ifst;
std ::ofstream ofst;
2. открываешь файл, при этом идентификатор связывается с именем файла:
Код:
ifst .open( "in.txt" );
ofst .open( "ofst.txt" );
3. че-то как-то пишешь в файл, или читаешь, например:
Код:
int n;
ifst >> n;
ofst << n;
4. закрываешь файл.
Код:
ifst .close();
ofst .close();
 

vladis222

Active member
06.12.2011
31
0
#3
Код:
using namespace std;
#include
#include
сначала include, потом using.

1. создаешь идентификатор файла(файлового потока) в своей программе, например:
Код:
std ::ifstream ifst;
std ::ofstream ofst;
2. открываешь файл, при этом идентификатор связывается с именем файла:
Код:
ifst .open( "in.txt" );
ofst .open( "ofst.txt" );
3. че-то как-то пишешь в файл, или читаешь, например:
Код:
int n;
ifst >> n;
ofst << n;
4. закрываешь файл.
Код:
ifst .close();
ofst .close();
Ну я доделал программу, вроде должно быть нормально, но прога выдает непонятные ошибки:

вот код

<!--shcode--><pre><code class='"[b'>"]#include<iostream>
using namespace std;
#include<fstream>
#include<iomanip>
#include<conio.h>
#include<Windows.h>
#include<stdlib.h>
const int N= 10;
const int LN=20;
const int LC= 15;
const int LG_I= 77;
const int LG_V= 52;

/* ========================================== ИСХОДНЫЕ ДАННЫЕ =================================================================== */
struct stricx /* структурный тип и исходная таблица */
{char name[LN+1]; /* название cтраны */
int tr_50; /* Число тракторов в 50 году */
int tr_57; /* Число тракторов в 75 году */
float komb_50; /* Число комбайнов в 50 году */
float komb_57; /* Число комбайнов в 75 году */
} c[N];
int n; /* Реальное количество стран*/
/* ========================================== Результаты =================================================================== */
struct
{ char name[LN+1]; /* название cтраны, в которой процент прироста парка комбайнов в 50 году по сравнению к 57 году-макс. */
float abs_prir; /* абсолютный прирост парка комбайнов найденной страны 50-57 годов . */
} c_r[N];
//==================================================== ПРОМЕЖУТОЧНЫЕ ДАННЫЕ=====================================================
int fl=0; /* признак: файл еще не создан */
ofstream fileout; /* поток (для задания) */
char namevix[13]; /* имя выходного потока */
int pvix; /* есть ли в командной строке имя потока ?*/
char sg_vix[LG_V+1]={"---------------------------------------------------\n"};
char sg_icx[LG_I+1]={"---------------------------------------------------\n"};
/*=========================================================Прототипы функций==============================================================*/
void create_t();
void percent_max();
/* =====================================================ГЛАВНАЯ ФУНКЦИЯ ===================================================== */
int main(int argc,char * argv[])
{
/* имя выходного - аргумент main */
/* имя входного - пользователь */
/*=====================================================Прототипы заданных функций===========================================================*/
void percent_max();
// Проверка ограничений: задание в командной строке имени выходного файла
// Проверка ограничений: задание в командной строке имени выходного файла

if (argc == 0)
{ cerr<<"При вызове программы укажите имя выходного файла !!!\n";
getch();
pvix=0; exit(-1);
};
strcpy((namevix),argv[1]); // запоминание имени выходного потока
void clrscr();

//======================================================СОЗДАНИЕ ИСХОДНОЙ ТАБЛИЦЫ===============================//
int pr;/*Проверка на ошибку*/
int i;
float r;
char sg_icx[LG_I+1]={"--------------------------------------------------------\n"};
cout <<"Создание таблицы\n";
if(fl)
{cerr << "ТАБЛИЦА УЖЕ БЫЛА СОЗДАНА !!!\n";
getch();
exit(-1);
}
else
{fl=1;
do
{cout << "Введите количество стран (не более чем "<<N << "): ";
cin >> n;
if(n<0 || n>N)
{pr=1; cout << "Вы ошиблись!\n";}
else pr=0;
} while(pr);


//============================================================== Ввод табличных данных =========================================//
cout << "Введите данные о странах\n";
cout << sg_icx;
cout << "!NN! Название страны ! Кол-во тракторов в 50 году ! Кол-во тракторов в 57 году";
cout << " Кол-во комбайнов в 50 году ! Кол-во комбайнов в 57 году !\n";
cout << sg_icx;
do /* проверка ограничений */
{for(int i=0; i<n; i++)
{cout << "! " << i+1 << " ";
cin >> c.name;
cin >> c.tr_50;
cin >> c.tr_57;
cin >> c.komb_50;
cin >> c.komb_57;

if(c.tr_50<0 || c.tr_57<0||c.komb_50||c.komb_57<0)
{pr=1;
cerr << "Вы ошиблись. Повторите ввод\n"; i--; }
else pr=0;
}
}while(pr);
cout << sg_icx;
cout << "Создана таблица из " << i << " записей\n";
}
}

/*========================================================Выполнение задания=============================================================*/
/*=============Нахождение страны, у которой процент прироста комбайнов в 1957 году по отношению к 1950 году максимальный================*/
/*Создание исходящего и выходного файла*/
ifstream d;
d.open("1.txt");
if (f.fail("1.txt"))
{cerr <<"Файл " << "1.txt" << " не открыт!!!\n";
getch();
exit(-1);
};
int i;

while("1.txt">>c.name>>c[ i].tr_50,c[ i].tr_57,c.komb_50,c.komb_57)
{
cout.setf(ios::left); // выравнивание по левому краю
cout << setw(20) << c[ i].name << '!';
cout << setw(15) << c[ i].tr_50 << '!';
cout<< c[ i].tr_57 <<" ! "<<c[ i].komb_50 <<"!"<<c.komb_57 <<"!"<< endl;
};


void percent_max()
{int pr;
float perc_max;
int n_max;
n_max=-1;perc_max=((c[0].komb_57-c[0].komb_50)*0,01);
for(int i=0;i<n;i++)
{
if(((c.komb_57-c.komb_50)*0,01)>((c[0].komb_57-c[0].komb_50)*0,01))
{perc_max=((c.komb_57-c.komb_50)*0,01); n_max=i;}
}
}
namevix.open("");
namevix<<setw(4)<<c_r.name<<setw(20)<<perc_max<<endl;
namevix.close();/*Закрываем файловый поток*/


}[/CODE]
 
R

rrrFer

#4
Код:
"]#include<iostream>
using namespace std;
#include<fstream>
#include<iomanip>
Вникай, я уже отвечал:
сначала include, потом using.
Код программы максимально мерзок:
тут видим очень информативный комментарий:
Код:
ofstream fileout;				 /* поток (для задания) */
тут видим не менее информативное сообщение об ошибке:
Код:
if(n<0 || n>N)
{pr=1; cout << "Вы ошиблись!\n";}
идеальное имя переменной: (чем не устроило ifst из моего примера?) :
Код:
ifstream d;
Зачем тебе столько глобальных переменных?

скажу честно, я не особо искал, но найти что такое "f" не смог. Даже если он и есть - то коварно спрятан - перепиши нормально. Однако, щитаю что ты накопипастил из разных источников и не обратил внимание что имена переменных используются разные.

Код:
cerr <<"Файл " << "1.txt" << " не открыт!!!\n";
а так не кошерно?:
Код:
cerr <<"Файл 1.txt не открыт!!!\n";
Код:
while("1.txt">>c[i].name>>c[ i].tr_50,c[ i].tr_57,c[i].komb_50,c[i].komb_57)
"1.txt" - это строка const char*, для нее не перегружен оператор >>. Что-то подсказывает, что вы пытаетесь таки считать с файла - читайте мой пост выше - там был пример.

Код:
cout.setf(ios::left);	 // выравнивание по левому краю
cout << setw(20) << c[ i].name << '!';
cout << setw(15) << c[ i].tr_50 << '!'; 
cout<< c[ i].tr_57 <<" ! "<<c[ i].komb_50 <<"!"<<c[i].komb_57 <<"!"<< endl;
и дальше везде только cout, а результат надо писать в файл, имя которого вы требуете у юзера.

ниче страшного что функция main не закончилась, ведь в С++ разрешены вложенные функции

Возвращаясь к:
Ну я доделал программу, вроде должно быть нормально, но прога выдает непонятные ошибки:
1. надо понимать что пишешь;
2. читай ответы на форуме внимательно, некоторые товарищи их старательно и заботливо пишут.
 

vladis222

Active member
06.12.2011
31
0
#5
Вникай, я уже отвечал:

Код программы максимально мерзок:
тут видим очень информативный комментарий:
Код:
ofstream fileout;				 /* поток (для задания) */
тут видим не менее информативное сообщение об ошибке:
Код:
if(n<0 || n>N)
{pr=1; cout << "Вы ошиблись!\n";}
идеальное имя переменной: (чем не устроило ifst из моего примера?) :
Код:
ifstream d;
Зачем тебе столько глобальных переменных?


скажу честно, я не особо искал, но найти что такое "f" не смог. Даже если он и есть - то коварно спрятан - перепиши нормально. Однако, щитаю что ты накопипастил из разных источников и не обратил внимание что имена переменных используются разные.


а так не кошерно?:
Код:
cerr <<"Файл 1.txt не открыт!!!\n";

"1.txt" - это строка const char*, для нее не перегружен оператор >>. Что-то подсказывает, что вы пытаетесь таки считать с файла - читайте мой пост выше - там был пример.


и дальше везде только cout, а результат надо писать в файл, имя которого вы требуете у юзера.


ниче страшного что функция main не закончилась, ведь в С++ разрешены вложенные функции

Возвращаясь к:

1. надо понимать что пишешь;
2. читай ответы на форуме внимательно, некоторые товарищи их старательно и заботливо пишут.
Спасибо)))