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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2010, 17:20   #1
emnm
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 12
По умолчанию Прога без ошибок, но не работает!

Вот условие задачи:
Известна информация о сотрудниках некоторого предприятия:
-Фамилия
-Год рождения
-Должность
-Стаж
-Оклад
Сформировать двоичный файл, записав в него всю известную информацию о каждом сотруднике. Отсортировать файл в алфавитном порядке. Определить количество пенсионеров (старше 60 лет), и количество молодых специалистов (моложе 25 лет).

Я написал вроде как прогу, но она не работает почему то) Может кто знает что исправить нужно, или напишет свой вариант? Потому что у меня оно выбивает окно "Память не может быть read" и всё.
Вот код:
Цитата:
#include<iostream>
#include<string>
using namespace std;
void main()
{
struct sot
{
char name[6];
int data;
char dolj[6];
int staj;
int okl;
};
int n=3,i,j,sump=0,summ=0;
sot t;
sot *a;
FILE *f1;
f1=fopen("D://abc1.dat","wb");
fwrite(&n,sizeof(int),1,f1);
for(i=0;i<n;i++)
{
cin>>a[i].name>>a[i].data>>a[i].dolj>>a[i].staj>>a[i].okl>>"/n";
fwrite(&t,sizeof(sot),1,f1);
}
fclose(f1);
FILE *f;
f=fopen("D://abc.dat","rb");
fread(&n,sizeof(int),1,f);
a=new sot[n];
fread(a,sizeof(sot),n,f);
for(i=0;i<n;i++)
{
cout<<a[i].name<<a[i].data<<a[i].dolj<<a[i].staj<<a[i].okl<<"/n";
if (2010-a[i].data>60)sump++;
if (2010-a[i].data<25)summ++;
}
fclose(f);
//Сортировка
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i;j++)
{
if(strcmp(a[j].name,a[j+1].name)>0)
{
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
}
for(i=0;i<n;i++)
{
cout<<endl<<a[i].name;
for(j=0;j<6;j++)
cout<<a[i].dolj[j]<<"\t";
for(i=0;i<n;i++)cout<<a[i].name<<a[i].data<<a[i].dolj<<a[i].staj<<a[i].okl<<"/n";
cout<<"summ molodej="<<summ<<"summ pensionerov="<<sump<<"\n";
}
}
emnm вне форума Ответить с цитированием
Старый 25.06.2010, 18:32   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
f1=fopen("D://abc1.dat","wb");
в винде обратный слеш разделяет директории.
остальное не смотрел
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 25.06.2010, 18:40   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

В винде тоже можно писать / для разделения директорий, но /n меня смутило )
Вероятно должно было быть \\ и \n

...

да и cin >> "/n" в принципе выглядит очень подозрительно.
netrino вне форума Ответить с цитированием
Старый 25.06.2010, 19:51   #4
emnm
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 12
По умолчанию

Ну вот по исправлял табуляцию, и не хочет все равно работать.

Цитата:
#include<iostream>
#include<string>
using namespace std;
void main()
{
struct sot
{
char name[10];
int data;
char dolj[8];
int staj;
int okl;
};
int n=10,i,j,sump=0,summ=0;
sot t;
sot *a;
FILE *f1;
f1=fopen("D://abc1.dat","wb");
fwrite(&n,sizeof(int),1,f1);
for(i=0;i<n;i++)
{
cin>>a[i].name>>a[i].data>>a[i].dolj>>a[i].staj>>a[i].okl;
fwrite(&t,sizeof(sot),1,f1);
}
fclose(f1);
FILE *f;
f=fopen("D://abc.dat","rb");
fread(&n,sizeof(int),1,f);
a=new sot[n];
fread(a,sizeof(sot),n,f);
for(i=0;i<n;i++)
{
cout<<a[i].name<<a[i].data<<a[i].dolj<<a[i].staj<<a[i].okl<<"\n";
if (2010-a[i].data>60)sump++;
if (2010-a[i].data<25)summ++;
};
fclose(f);
//Сортировка
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i;j++)
{
if(strcmp(a[j].name,a[j+1].name)>0)
{
t=a[j]; a[j]=a[j+1]; a[j+1]=t;
}
}
}
for(i=0;i<n;i++)
{
cout<<endl<<a[i].name;
for(j=0;j<6;j++)
cout<<a[i].dolj[j]<<"\t";
}
for(i=0;i<n;i++)
cout<<a[i].name<<a[i].data<<a[i].dolj<<a[i].staj<<a[i].okl<<"\n";
cout<<"summ molodej="<<summ<<"summ pensionerov="<<sump<<"\n";
}
emnm вне форума Ответить с цитированием
Старый 25.06.2010, 20:12   #5
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

Странный код:
Код:
sot *a;
FILE *f1;
f1=fopen("D://abc1.dat","wb");
fwrite(&n,sizeof(int),1,f1);
for(i=0;i<n;i++)
{
cin>>a[i].name>>a[i].data>>a[i].dolj>>a[i].staj>>a[i].okl;
fwrite(&t,sizeof(sot),1,f1);
}
Вы просто объявили указатель
Код:
sot *a;
а затем начинаете в цикле с ним работать, хотя не выделили память для него размерности n
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶
dxdy вне форума Ответить с цитированием
Старый 25.06.2010, 20:29   #6
emnm
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 12
По умолчанию

Каким образом выделить память? Можете написать в коде?
emnm вне форума Ответить с цитированием
Старый 25.06.2010, 20:40   #7
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

Код:
for(i=0;i<n;i++){
	cin>>t.name>>t.data>>t.dolj>>t.staj>>t.okl;
	fwrite(&t,sizeof(sot),1,f1);
}
затем
Код:
f=fopen("D://abc.dat","rb");
if(!f){ cout << "Error" << endl; return; }
и после работы всей программы
Код:
 delete []a
У вас программа не видит путь где лежит ваш документ "abc.dat"
Может вы хотели по условию задачи открыть документ "abc1.dat"?
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶

Последний раз редактировалось dxdy; 25.06.2010 в 20:50.
dxdy вне форума Ответить с цитированием
Старый 25.06.2010, 20:56   #8
emnm
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 12
По умолчанию

Написал как вы сказали, ошибку выбивать перестало, но теперь когда я ввожу например:
ivanov 1949 injener 22 5000
выводит на экран вместо того что надо, "Error".
Как мне теперь распечатать, чтобы выводило кол-во "пенсионеров" и "молодёжи"? А также сортировало их по алфавиту.
emnm вне форума Ответить с цитированием
Старый 25.06.2010, 21:25   #9
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

Исправил ошибки в вашем коде:
Код:
#include<iostream>
#include<string>
using namespace std;
void main()
{
struct sot{
	char name[10];
	int data;
	char dolj[8];
	int staj;
	int okl;
};
int n=10,i,j,sump=0,summ=0;
sot t;
sot *a;


FILE *f1;
f1=fopen("D://abc1.dat","wb");
fwrite(&n,sizeof(int),1,f1);
for(i=0;i<n;i++){
	cin>>t.name>>t.data>>t.dolj>>t.staj>>t.okl;
	fwrite(&t,sizeof(sot),1,f1);
}
fclose(f1);
FILE *f;
f=fopen("D://abc1.dat","rb");
if(!f){ cout << "Error" << endl; return; }

fread(&n,sizeof(int),1,f);
a=new sot[n];
fread(a,sizeof(sot),n,f);
for(i=0;i<n;i++){
	cout<<a[i].name<<a[i].data<<a[i].dolj<<a[i].staj<<a[i].okl<<"\n";
if ( 2010 - a[i].data > 60 )sump++;
if ( 2010 - a[i].data < 25 )summ++;
};
fclose(f);
//Сортировка
for(i=0;i<n;i++){
	for(j = 0; j < n-1; j++){
		if( (strcmp(a[j].name,a[j+1].name)) > 0 ){
			t=a[j]; a[j]=a[j+1]; a[j+1]=t;
		}
	}
}
for(i=0;i<n;i++){
	cout<< endl << a[i].name;
	cout<<a[i].dolj<<"\t";
}
for(i=0;i<n;i++){
	cout<<a[i].name << a[i].data<<a[i].dolj<<a[i].staj<<a[i].okl<<"\n";
}
cout<<"summ molodej="<<summ<<"summ pensionerov="<<sump<<"\n";
}
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶
dxdy вне форума Ответить с цитированием
Старый 25.06.2010, 21:40   #10
emnm
Пользователь
 
Регистрация: 25.06.2010
Сообщений: 12
По умолчанию

Огромное спасибо Вам ! Всё теперь работает, и правильно подсчитывает...

Еще хотел бы, чтобы данные которые выводит, были как то красиво в рамочке, через пробелы. Умеет может кто нибудь?
emnm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При компиляции программы на си не выдаёт ошибок и предупреждений,но тем не менее программа не работает. AmoSirin Общие вопросы C/C++ 7 12.10.2010 00:11
компилятор ошибок не выдаёт, но прога не делает то что нужно... Chica Bond Общие вопросы C/C++ 5 02.05.2010 22:53
прога работает но с недочетом 1mposs1ble Общие вопросы C/C++ 6 25.03.2010 12:16
Прога не работает RockForr Общие вопросы Delphi 5 18.05.2009 16:56
Прога не пашет без Дельфи Dunpeal Общие вопросы Delphi 5 22.06.2007 13:58