Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 [Все]   Вниз
  Печать  
Автор Тема: [C++] Помогите, ПОЖАЛУЙСТА, решить задачу!!!  (Прочитано 59923 раз)
0 Пользователей и 1 Гость смотрят эту тему.
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« : 28-04-2010 17:48 » 

Написать программу учета продажи мебели .
Каждая запись содержит:
•   Покупатель.
•   Адрес покупателя
•   Наименование мебели
•   Модель мебели
•   Дата оформления договора
•   Дата исполнения договора

Программа должна обеспечивать выбор с помощью меню и выполнение  следующих функций:
─ Ввод информации
─ Удаление информации об исполненных договорах  за все даты, предшествующие заданной.
─ Просмотр информации в базе.
─ Вывод информации о неисполненных договорах. Информация упорядочена по дате оформления договора.
─ Вывод информации о  неисполненных договорах на определенную дату, по запросу. Информация отсортирована по наименованию мебели  и по покупателю.
 Внимание! Говорит и показывает...
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 28-04-2010 18:24 » 

Где?
Где?
Где?
Короче... Что не получается?
Чуть-чуть длиннее... Никто за тебя делать не будет, только направят на путь истинный.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 29-04-2010 05:09 » 

LELECHKA, а можно сразу адрес куда решение отправить? А то тебе ещё напрягаться.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #3 : 29-04-2010 17:11 » 

Вот, что я пока сделала:
Я не понимаю как сделать 2 пункта:
─ Вывод информации о неисполненных договорах. Информация упорядочена по дате оформления договора.
─ Вывод информации о  неисполненных договорах на определенную дату, по запросу. Информация отсортирована по наименованию мебели  и по покупателю.


Код:
#include <fstream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#define MAX 100

struct Furniture
{
char Buyer [30];
char Addres_Buyer[30];
char Furniture_Name[30];
int Furniture_Model;
int Date_Registration;
int Date_Execution;
};// furniture;

int enterChoice();

void newFile (fstream&);
void viewFile (fstream&);
void deleteFile (fstream&);
void runFile  (fstream&);
void outputFile  (fstream&);

void main()
{
fstream My_base ("f:\\base.dat",ios::in | ios::out);
if (!My_base)
{
cerr<<"The file can't be opened!"<<endl;
return; //exit(1);
}

int choice;
while ((choice=enterChoice())!=5)
{
switch (choice)
{
case 1: newFile (My_base);
break;
case 2: viewFile  (My_base);
break;
case 3: deleteFile (My_base);
break;
case 4: runFile (My_base);
break;
case 5: outputFile (My_base);
break;
default:
cerr<<"Incorrect choice"<<endl;
break;
}

My_base.clear();
}
}

int enterChoice()
{
cout<<endl<<"Your choise:"<<endl
<<"1-newFile"<<endl
<<"2-viewFile"<<endl
<<"3-deleteFile"<<endl
<<"4-runFile"<<endl
<<"5-outputFile"<<endl
<<"6-the end of the work"<<endl<<"?";

int menuChoice;
cin>>menuChoice;
return menuChoice;
}

void newFile (ofstream &writeFromFile)
{
Furniture Furnitures[MAX];
int i;

ofstream NewFile("f:\\base.dat", ios::out);
if (!NewFile)
{
cerr<<"The file can't be opened!"<<endl;
return ;//exit(1);
}
cout<<"Buyer, Addres_Buyer,Furniture_Name,Furniture_Model,Date_Registration,Date_execution"<<endl
<<"Input FFF for the end"<<endl<<"?";

while (
cin>>
"Buyer">>Furnitures[i].Buyer>>
"Addres_Buyer">>Furnitures[i].Addres_Buyer>>
"Furniture_Name">>Furnitures[i].Furniture_Name>>
"Furniture_Model">>Furnitures[i].Furniture_Model>>
"Date_Registration">>Furnitures[i].Date_Registration>>
"Date_Execution">>Furnitures[i].Date_Execution
)
{
NewFile<<"Buyer"
<<Furnitures[i].Buyer<<' '<<"Addres_Buyer"
<<Furnitures[i].Addres_Buyer<<' '<<"Furniture_Name"
<<Furnitures[i].Furniture_Name<<' '<<"Furniture_Model"
<<Furnitures[i].Furniture_Model<<' '<<"Date_Registration"
<<Furnitures[i].Date_Registration<<' '<<"Date_Execution"
<<Furnitures[i].Date_Execution<<endl;
cout<<"?";
}

getch();
}

void viewFile (ifstream &readFromFile)
{
ifstream ViewFile ("f:\\furniture.txt", ios::out);
if (!ViewFile)
{
cerr<<"The file cannot be opened"<<endl;
return ;//exit(1);
}


//????
ViewFile<<setiosflags(ios::left)<<setw(6)<<"Buyer"
<<setw(16)<< "Addres_Buyer"<<setw(11)<<"Furniture_Name"
<<setiosflags(ios::right)<<setw(10)<<"Furniture_Model"
<<setw(10)<<"Date_Registration"<<setw(11)<<"Date_Execution"
<<endl;


readFromFile.seekg(0);

Furniture furnitur;
readFromFile.read((char*)&furnitur, sizeof(furnitur));
while (!readFromFile.eof())
{
if (furnitur.Buyer!=0)
outputLine(ViewFile, furnitur);
readFromFile.read((char*)&furnitur, sizeof(furnitur));
}
}

« Последнее редактирование: 29-04-2010 18:04 от Алексей1153++ » Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 29-04-2010 17:19 » 

LELECHKA, cout<<"взрыв мозга"<< Отлично <<"Сорри, не удержался."
Записан

LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #5 : 29-04-2010 17:33 » 

Я девушка и учусь к тому же  не на программиста!!!
У меня от этих задач уже голова пухнет!!!
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 29-04-2010 17:35 » 

LELECHKA, да никто не ругается же, только форматирование нечитабельное
Записан

Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 29-04-2010 17:36 » 

LELECHKA, Погоди, милая, дай почитать твои труды. "Моск кипит"
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #8 : 29-04-2010 17:39 » 

Вам смешно, а мне нет!
Плакать хочется
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 29-04-2010 17:39 » 

LELECHKA, А ты можешь показать, как ты сортируешь?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #10 : 29-04-2010 17:41 » 

Вот в том то и дело, что никак не сортирую
я не понимаю как это сделать!
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 29-04-2010 17:44 » 

LELECHKA, нам не смешно, поверь... Я переворматировал. Щас попробуй скомпилить - у меня подозрение, что это не скомпилируется
Записан

Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 29-04-2010 17:44 » 

Отсортируй пожалуйста по возрастанию

03.12.2009
01.01.2009
02.03.2010

И расскажи как ты это сделала. Только расскажи.
Берем первую дату, сравниваем с.... и так далее.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 29-04-2010 17:47 » 

Лёш, мог бы и причисать заодно. Там кстати с фигурными скобками всё в порядке? А то так получается вложеная ф-я.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 29-04-2010 17:55 » 

Джон, вот пытаюсь )

LELECHKA,
исправление №1      return; //exit(1);

дальше (как Джон уже сказал) у тебя вложенная функция, но как разделить, это неочевидно, вот я сделал так, посмотри свой код вверху снова
Записан

LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #15 : 29-04-2010 17:56 » 

Может вы думаете, что я совсем глупая
я понимаю, как сортировать, я не знаю как это записать!

Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 29-04-2010 17:58 » 

вот тут что имеется в виду ? Это не скомпилируется - у ViewFile нет оператора <<
Код:
	ViewFile<<setiosflags(ios::left)<<setw(6)<<"Buyer"
<<setw(16)<< "Addres_Buyer"<<setw(11)<<"Furniture_Name"
<<setiosflags(ios::right)<<setw(10)<<"Furniture_Model"
<<setw(10)<<"Date_Registration"<<setw(11)<<"Date_Execution"
<<endl;

Записан

LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #17 : 29-04-2010 18:04 » 

просматривает содержимое файла
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 29-04-2010 18:04 » 

LELECHKA,

struct Furniture
{
...
} furniture; - так делать не надо. Потом переменную объявим.



------------------
Furniture furnitur;

if (Furniture.Buyer!=0)

регистр в C++ имеет значение - переменная у тебя начинаеться с маленькой буквы. А с большой - это у тебя класс

---------
нет определения функции outputLine

----------
я снова код в верхнем посте подправил - дальше твой ход Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 29-04-2010 18:06 » 

просматривает содержимое файла

ещё учитывай, что я не знаю, что такое ifstream  (не шучу!)
Записан

Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 29-04-2010 18:12 » 

Может вы думаете, что я совсем глупая
я понимаю, как сортировать, я не знаю как это записать!


Не т, мы так не думаем, но если ты напишешь словами, то напишешь и код.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 29-04-2010 18:16 » 

LELECHKA, давай в чат https://forum.shelek.ru/channels/index.php
а код будем писать в этой теме
Записан

LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #22 : 29-04-2010 18:22 » 

outputLine- должно прописываться как отдельная функция(она входит в меню: void outputLine..., которая выводит строку с информацией о покупателе,
я ее еще не прописывала
уже сил нет и голова не соображает!
ifstream-предназначен для ввода из файла т.е. открывает файл для считывания
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #23 : 29-04-2010 18:48 » 

Цитата
(00:43:37) Sla: тут еще поле непаханое
(00:44:22) Алексей1153++: Sla, завтра пахать будет ))
(00:44:25) Sla: LELECHKA, Информация упорядочена по дате оформления договора.
Если это вынести в отделную функцию
(00:44:35) Sla: то все упроститься
(00:45:18) Sla: и все действия в отдельные функции
(00:45:51) Sla: ─ Ввод информации
─ Удаление информации об исполненных договорах за все даты, предшествующие заданной.
─ Просмотр информации в базе.
─ Вывод информации о неисполненных договорах. Информация упорядочена по дате оформления договора.
─ Вывод информации о неисполненных договорах на определенную дату, по запросу. Информация отсортирована по наименованию мебели и по покупателю.
(00:46:14) Sla: это вес функции
(00:46:24) Sla: Можно поставить заглушки
(00:46:48) Sla: в каждой функции написать - Функция такая-то
(00:46:58) Алексей1153++: Sla, она ушла, щас в тему перекину мессаги
(00:47:03) Sla: Это нужно для твоего "интерфеса"
(00:47:18) Sla: Ух!!!
(00:47:26) Sla: яа я тут напрягаюсь
(00:47:43) Sla: Алексей1153++, надо было чат открывать в теме
(00:47:56) Алексей1153++: Sla, так сохраню )
Записан

LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #24 : 30-04-2010 17:21 » 

Программу надо здать уже в следующую пятницу, у меня паника!
Ничего не получается, мне кажется, что это все полный бред!


Я попробовала кое-что исправить и дописать, посмотрите, пожалуйста!

Код:
#include <fstream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#define MAX 100
#include <stdlib.h>

struct Furniture
{int Num_Buyer;
 char Addres_Buyer[30];
 char Furniture_Name[30];
 int Furniture_Model;
 int Date_Registration;
 int Date_Execution;
 };

 int enterChoice();

 void newFile (fstream&);
 void addFile (fstream&);
 void viewFile (ostream&);
 void deleteFile (fstream&);
 void runFile  (fstream&);
 void outputFile  (fstream&);
 void outputLine(ostream&, Furniture);


void main()
{
fstream My_base ("f:\\base.dat",ios::in | ios::out);
if (!My_base)  { cerr<<"The file can't be opened!"<<endl;
exit(1);
}
int choice;
while ((choice=enterChoice())!=6)
{ switch (choice)
 { case 1: newFile (My_base);
   break;
   case 2: addFile  (My_base);
   break;
   case 3: viewFile (My_base);
   break;
   case 4: deleteFile (My_base);
   break;
   case 5: runFile (My_base);
   case 6: outputFile (My_base);
   break;
   default:
     cerr<<"Incorrect choice"<<endl;
break;
}

My_base.clear();
}}

int enterChoice()
{  cout<<endl<<"Your choise:"<<endl
  <<"1-newFile"<<endl
  <<"2-addFile"<<endl
  <<"3-viewFile"<<endl
  <<"4-deleteFile"<<endl
  <<"5-runFile"<<endl
  <<"6-outputFile"<<endl
       <<"6-the end of the work"<<endl<<"?";
int menuChoice;
cin>>menuChoice;
return menuChoice;
}


void newFile (ofstream &writeFromFile)
{
ofstream My_base("f:\\base.dat", ios::out);
if (!My_base)  {
         cerr<<"The file can't be opened!"<<endl;
exit(1);
}

Furniture blankFurniture={0," "," ",0,0,0};
for( int i=1; i<=100; i++)
My_base.write((char*)&blankFurniture, sizeof(blankFurniture));
}



void addFile (ofstream &writeFromFile)
{
ofstream My_base("f:\\base.dat", ios::ate);
if (!My_base) {
cerr<<"The file can't be opened!"<<endl;
exit(1);
}
cout<<"Input the number of the buyer"
<<"(from 1 to 100, 0 - the end of input)"<<endl<<"?";
Furniture furniture;
cin>>furniture.Num_Buyer;
while(furniture.Num_Buyer>0 && furniture.Num_Buyer<=100)
{
cout<<"Input Addres_Buyer, Furniture_Name, Furniture_Model, Date_Registration, Date_Execution"
<<endl<<"?";
cin>>furniture.Addres_Buyer>>furniture.Furniture_Name
   >>furniture.Furniture_Model>>furniture.Date_Registration
   >>furniture.Date_Execution;

My_base.seekp((furniture.Num_Buyer-1)*sizeof(furniture));

My_base.write((char*)&furniture, sizeof(furniture));
cout<<"Input the number of the buyer"
<<"(from 1 to 100, 0 - the end of input)"<<endl<<"?";
cin>>furniture.Num_Buyer;
}
}



void viewFile (ostream&, Furniture);
void main()
{   ifstream My_base("f:\\base.dat", ios::in);
if (!My_base)
{
cerr<<"The file cannot be opened"<<endl;
exit(1);
}
cout<<setiosflags(ios::left)<<setw(6)<<"Buyer"
        <<setw(16)<< "Addres_Buyer"<<setw(11)<<"Furniture_Name"
        <<setiosflags(ios::right)<<setw(10)<<"Furniture_Model"
        <<setw(10)<<"Date_Registration"<<setw(11)<<"Date_Execution"
        <<endl;

Furniture furniture;

My_base.read((char*)&furniture, sizeof(furniture));

while (!My_base.eof())
{
if (furniture.Num_Buyer!=0)
   outputLine(cout, furniture);
   My_base.read((char*)&furniture, sizeof(furniture));
}
}


void outputLine(ostream &output, Furniture f)
{
output<<setiosflags(ios::left)<<setw(6)<<f.Num_Buyer
      <<setw(16)<<f.Addres_Buyer<<setw(11)<<f.Furniture_Name
      <<setw(10)<<setprecision(5)
      <<setiosflags(ios::showpoint | ios::right)
      <<f.Furniture_Model<<setw(10)<<f.Date_Registration
      <<setw(10)<<f.Date_Execution<<endl;
}


void deleteFile(fstream &deleteFromFile)
{  int d=0;
int i;
int k=0;
int r=0;
cout<<"Input the date:";
cin>>d;

Furniture furniture;

deleteFromFile.seekg((d-1)*sizeof(furniture));

deleteFromFile.read((char*)&furniture, sizeof(furniture));

if (furniture.Num_Buyer!=0)    {
  Furniture blankFurniture={0," "," ",0,0,0};

deleteFromFile.seekp((d-1)*sizeof(furniture));
deleteFromFile.write((char*)&blankFurniture, sizeof(furniture));
}
for (i=0;i<k;i++) {
if (furniture.Date_Execution<d) {
r=r+1;
}}
if   (r==0)
cout<<" Information was delete"<<endl;
}
« Последнее редактирование: 13-05-2010 18:35 от Sla » Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #25 : 30-04-2010 17:31 » 

Алексей1153++, вы здесь?
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #26 : 30-04-2010 17:38 » 

Алексей1153++, с сортировкой я так и не разобралась, хоть убейте меня!!! темный лес
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #27 : 30-04-2010 17:55 » 

Алексей1153++, Программа не компилируется, не понятно, что с этим viewFile?
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 01-05-2010 11:52 » 

Цитата: LELECHKA
Программу надо здать уже в следующую пятницу, у меня паника!
У! Тут были и такие, которые писали "сижу прямо на контрольной" - вот это паника, а у тебя ещё вагон времени на решение задачи, которую можно написать за 1 час.

Заниматься сортировкой тебе ещё рано. По той простой причине, что программа даже не соберётся. Есть одно простое правило: на всякую открывающую скобку должна быть закрывающая скобка. Чтобы не запутаться, программисты обычно их пишут сразу обе, а потом между ними пишут то, что хотят.

Например, если ты пишешь обращение к массиву, ты это делает в 2 этапа:
1) В начале пишешь обе скобки:
Код:
a[]
2) Потом внутри них то, что нужно, например:
Код:
a[i * n + j]

Если ты пишешь вызов функции, то тоже в 2 этапа:
1) Сначала саму функцию со скобками, и сразу же точку с запятой, чтобы не забыть:
Код:
f();
2) Потом добавляешь нужные параметры:
Код:
f(x, y, z, v, w, r, s, t, p, q);

Если ты пишешь любую управляющую конструкцию с фигурными скобками, ты их пишешь сразу, причём выравниваешь в столбик, чтобы одна скобка была под другой - так хорошо видно, какая скобка какой соответствует.
1) Сначала конструкция, например:
Код:
while()
{
}
2) И только потом содержание; если в содержании есть другая конструкция, то с ней поступать точно также, но всё, что находится внутри скобок и занимает много строк, лучше делать с отступом, чтобы не видеть, какой код внутри, а какой снаружи:
Код:
while(choice != 6)
{
   switch(choice)
   {
   }
}
3) Если ты пишешь другие конструкции, в которых в начале и конце что-то должно быть, то пишешь конец сразу:
Код:
while(choice != 6)
{
   switch(choice)
   {
      case 1:
         break;
      default:
         break;
   }
}
4) Так у тебя получается правильный каркас кода, который всегда можно собрать и проверить, что он написан правильно, и только потом пытаться в него что-то добавлять, не портя уже написанное.
Код:
choice = 0;
while(choice != 6)
{
   choice = enterChoice();
   switch(choice)
   {
      case 1:
         newFile();
         break;
      default:
         break;
   }
}
И т.д.

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

Например, работа с файлом.
1) Если написано открытие файла - появляется myFile, то нужно сразу написать и закрытие.
Код:
ofstream myFile("test.dat", ios::out);
myFile.close();
2) Учитывая, что при открытии файла может быть ошибка, нужно сделать так, чтобы всё, что работает с файлом (включая его закрытие), работало лишь тогда, когда он успешно открыт:
Код:
ofstream myFile("test.dat", ios::out);
if(myFile)
{
   // Сюда писать код работы с файлом.
   myFile.close();
}
И только теперь вместо комментария писать код.

Например, работа с памятью. Если выделять память, то тут же её и освобождать:
Код:
Furniture *myRecord = new Furniture();
// Сюда писать код работы с записью.
delete myRecord;
И только потом вместо комментария писать код работы с записью.


Если ты будешь следовать этим простым правилам, то сразу избавишься от кучи ошибок и увидишь свет в конце тоннеля. И не используй exit и return в середине функций. Потому что они завершают работу функции, и ты сама запутаешься разбираться, всё ли правильно отработало внутри функции или нет. Начинающим программистам использование таких вещей крайне не рекомендуется. Без return, конечно, не обойтись, если пишут функцию, но делай так, чтобы return внутри функции был один и находился в самой последней строке функции перед закрывающей скобкой.

Пока что проверь свой код: везде ли для открывающих скобок стоят закрывающие. Чтобы это было удобнее делать - выровняй скобки и сделай отступы, как я выше показал. Результаты выложи сюда.
« Последнее редактирование: 01-05-2010 11:58 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #29 : 01-05-2010 17:16 » 

Dimka, СПАСИБО, просто очень сложно разбираться одной, когда не дают материала и ничего не объясняют!
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 01-05-2010 22:00 » 

Цитата: LELECHKA
просто очень сложно разбираться одной, когда не дают материала и ничего не объясняют!
Вот это ты брось - каждый второй студент тут начинает ныть, что "препод тупой - ничего не объясняет", а на самом деле преподавателя просто не спрашивали, потому что сдавать уже "завтра" (а где до этого болтались - неизвестно) или спрашивали в духе "ничего не понятно" - в этом последнем случае большинство преподавателей посылает подальше с разной степенью вежливости.

На самом деле такое поведение студентов свидетельствует лишь о том, что в них остались школьные привычки, когда всё разжуют и в рот положат и заставят вызубрить - часто встречается на младших курсах. Здесь же требуется самостоятельная работа, которая заключается не в тупом переписывании методички, а постановке целей и разработке плана достижения результата. Самое интересное, что учить этому начинают ещё в школе при написании сочинений: составить план, подобрать материалы и т.д. Но школьники упорно не понимают, зачем это - в результате не умеют разобраться в элементарных вещах.

Я тебе, фактически разжевал, что первая твоя проблема - грубейшие ошибки на уровне синтаксиса языка (пропущенные знаки), и дал методические советы. НО! Об этом же тебе в этой теме сказали сразу (см. выше), даже за тебя сделали форматирование (выравнивание по скобкам и отступам) кода - ты это благополучно пропустила мимо ушей, будто тебя это не касается. И только когда я чуть-чуть разжевал, о чём речь, ты вроде как уловила. Почему так происходит? Вовсе не потому, что "ничего не объясняли", а потому что у тебя в голове нет анализа твоих собственных проблем и вытекающего из этих проблем плана твоих действий. Пока ты не разберёшься с тем, что представляют собой твои проблемы, ты будешь и дальше пропускать мимо ушей любую полезную информацию, которую тебе дают - до тех пор, пока кто-нибудь не напишет методичку получения готового решения.

Итак, первая твоя проблема - форматирование. Остальные сформулируй сама, прикинь, что ты собираешься с ними делать, что тебе нужно узнать, чтобы с ними справиться - и вот только тогда ты вместо бессмысленного "ничего не понятно" сможешь задать осмысленные вопросы, на которые получишь понятные для тебя же самой ответы.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #31 : 02-05-2010 07:34 » 

я не сказала, что препод плохой! и не собиралась этого говорить
Я все задачи делала всегда сама, только сейчас сроки поджимают и нужна помочь, чтобы кто-то направлял
Ведь я могла и заказать эту работу, только хочу сама разобрать, хотя бы попробую это сделать!
Ты не прав, я ною только из-за того, что не получается, я уже говорила, что я учусь не на программиста и мне действительно сложно разобраться в этом
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #32 : 02-05-2010 07:37 » 

P.S.:Я говорила, что материала нет, я ведь не могу с головы это все писать, нужна литература, чтобы разбираться!!!
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #33 : 02-05-2010 11:04 » 

Цитата: LELECHKA
нужна литература, чтобы разбираться
Советую учебники Подбельского, Фомина по C и C++. Всё разжёвано, с примерами, с набором задач для самостоятельной проработки каждой темы.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #34 : 02-05-2010 12:36 » 

Я постаралась исправить, не знаю насколько успешно...
все равно не компилирует!
Код:

#include <fstream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#define MAX 100
#include <stdlib.h>

struct Furniture
{
   int Num_Buyer;
   char Addres_Buyer[30];
   char Furniture_Name[30];
   int Furniture_Model;
   int Date_Registration;
   int Date_Execution;
};

int enterChoice();

 void newFile (fstream&);
 void addFile (fstream&);
 void outputLine (ostream&);
 void deleteFile (fstream&);
 void runFile  (fstream&);
 void outputFile  (fstream&);
 void outputLine(ostream&, Furniture);


void main()
{
   fstream My_base ("f:\\base.dat",ios::in | ios::out);
   if (!My_base)
   {
      cerr<<"The file can't be opened!"<<endl;
      exit(1);
   }

int choice;

while ((choice=enterChoice())!=6)
{
    switch (choice)
    {
        case 1: newFile (My_base);
           break;
        case 2: addFile  (My_base);
           break;
        case 3: outputLine (My_base);
           break;
        case 4: deleteFile (My_base);
           break;
        case 5: runFile (My_base);
           break;
        case 6: outputFile (My_base);
           break;
        default:
        cerr<<"Incorrect choice"<<endl;
           break;
     }
     My_base.clear();
     }
}

int enterChoice()
{
       cout<<endl<<"Your choise:"<<endl
  <<"1-newFile"<<endl
  <<"2-addFile"<<endl
  <<"3-outputLine"<<endl
  <<"4-deleteFile"<<endl
  <<"5-runFile"<<endl
  <<"6-outputFile"<<endl
           <<"6-the end of the work"<<endl<<"?";

int menuChoice;
cin>>menuChoice;
return menuChoice;
}


void newFile (ofstream &writeFromFile)
{
   ofstream My_base("f:\\base.dat", ios::out);
   if (!My_base)
   {
     cerr<<"The file can't be opened!"<<endl;
     My_base.close();
   }

     Furniture blankFurniture={0," "," ",0,0,0};

   for( int i=1; i<=100; i++)
     My_base.write((char*)&blankFurniture, sizeof(blankFurniture));
}



void addFile (ofstream &writeFromFile)
{
   ofstream My_base("f:\\base.dat", ios::ate);
   if (!My_base)
   {
cerr<<"The file can't be opened!"<<endl;
My_base.close();
   }

   cout<<"Input the number of the buyer"
       <<"(from 1 to 100, 0 - the end of input)"<<endl<<"?";

   Furniture furniture;
   cin>>furniture.Num_Buyer;

   while(furniture.Num_Buyer>0 && furniture.Num_Buyer<=100)
   {
       cout<<"Input Addres_Buyer, Furniture_Name, Furniture_Model, Date_Registration, Date_Execution"
           <<endl<<"?";

       cin>>furniture.Addres_Buyer>>furniture.Furniture_Name
          >>furniture.Furniture_Model>>furniture.Date_Registration
          >>furniture.Date_Execution;

       My_base.seekp((furniture.Num_Buyer-1)*sizeof(furniture));

       My_base.write((char*)&furniture, sizeof(furniture));

       cout<<"Input the number of the buyer"
           <<"(from 1 to 100, 0 - the end of input)"<<endl<<"?";
           cin>>furniture.Num_Buyer;
   }
}


void outputLine(int, char, char,int,int,int);

int main ()
{
   ifstream inFurnitureFile("f:\\base.dat", ios::in);
   if (!inFurnitureFile)
   {
      cerr<<"The file cannot be opened"<<endl;
      getch();
      exit (1);
   }
      int Num_Buyer;
      char  Addres_Buyer[30];
      char Furniture_Name[30];
      int Furniture_Model;
      int Date_Registration;
      int Date_Execution;

      cout<<setiosflags(ios::left)<<setw(6)<<"Num_Buyer"
             <<setw(16)<< "Addres_Buyer"<<setw(11)<<"Furniture_Name"
             <<setiosflags(ios::right)<<setw(10)<<"Furniture_Model"
             <<setw(10)<<"Date_Registration"<<setw(11)<<"Date_Execution"
             <<endl;

      while (inFurnitureFile>>Num_Buyer>>Addres_Buyer>>Furniture_Name
                                      >>Furniture_Model>>Date_Registration
                                      >>Date_Execution)
               outputLine (Num_Buyer,Addres_Buyer,Furniture_Name,Furniture_Model,Date_Registration,Date_Execution);
      return 0;
}


void outputLine(int Num_B, char *Addres_B, char *F_Name, int F_Model, int Date_Registr, int Date_Exec)
{
      cout<<setiosflags(ios::left)<<setw(6)<<Num_B
          <<setw(16)<<Addres_B<<setw(11)<<F_Name
          <<setw(10)<<setprecision(5)
          <<setiosflags(ios::showpoint | ios::right)
          <<F_Model<<setw(10)<<Date_Registr
          <<setw(10)<<Date_Exec<<endl;
}


void deleteFile(fstream &deleteFromFile)
{
   int d=0;
   int i;
   int k=0;
   int r=0;

   cout<<"Input the date:";
       cin>>d;

   Furniture furniture;

   if (furniture.Num_Buyer!=0)
   {
      Furniture blankFurniture={0," "," ",0,0,0};

      deleteFromFile.seekp((d-1)*sizeof(furniture));
      deleteFromFile.write((char*)&blankFurniture, sizeof(furniture));
   }

   for (i=0;i<k;i++)
   {
      if (furniture.Date_Execution<d)
        {
           r=r+1;
        }
   }
      if   (r==0)
            cout<<" Information was delete"<<endl;
}
« Последнее редактирование: 03-05-2010 10:11 от Джон » Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 02-05-2010 16:09 » 

Уже лучше, но не совсем:

Цитата: LELECHKA
Код:
void main()
{
   fstream My_base ("f:\\base.dat",ios::in | ios::out);
   if (!My_base)
   {
      cerr<<"The file can't be opened!"<<endl;
      exit(1);
   }

int choice;
Почему переменная choice потеряла отступ? Разве открытая скобка после main закрылась до этой переменной?

И т.д. Внимательнее. Как только выровняешь - сразу найдёшь, где чепуха со скобками.


Затем интересно, почему две функции main. Функция main во всей программе может быть только одна - в ней начинается и заканчивается работа программы, это главная функция (в соответствии со своим названием). Правильная функция main может быть следующих видов:
Код:
int main()
Код:
int main(int argc, char *argv[])
Код:
int main(int argc, char *argv[], char *envv[])
С такими параметрами и с таким типом результата - изменять это по своему произволу программист не может. Программист не должен вызывать эту функцию в своём коде, так как она вызывается автоматически при запуске.
« Последнее редактирование: 02-05-2010 16:20 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #36 : 02-05-2010 18:57 » 

Не получается разобраться со скобками, не вижу!!!!

Код:

#include <fstream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#define MAX 100
#include <stdlib.h>

struct Furniture
{
   int Num_Buyer;
   char Addres_Buyer[30];
   char Furniture_Name[30];
   int Furniture_Model;
   int Date_Registration;
   int Date_Execution;
};

 int enterChoice();

 void newFile (fstream&);
 void addFile (fstream&);
 void viewFile (ostream&);
 void deleteFile (fstream&);
 void runFile  (fstream&);
 void outputFile  (fstream&);
 void outputLine(ostream&, Furniture);


void main()
{
   fstream My_base ("f:\\base.dat",ios::in | ios::out);
   if (!My_base)
     {
        cerr<<"The file can't be opened!"<<endl;
        exit(1);
     }

   int choice;

   while ((choice=enterChoice())!=6)
   {
      switch (choice)
      {
         case 1:
           newFile (My_base);
           break;
         case 2:
           addFile  (My_base);
           break;
         case 3:
           viewFile (My_base);
           break;
         case 4:
           deleteFile (My_base);
           break;
         case 5:
           runFile (My_base);
           break;
         case 6:
           outputFile (My_base);
           break;
         default:
           cerr<<"Incorrect choice"<<endl;
           break;
        }
     My_base.clear();
     }
}

int enterChoice()
{
    cout<<endl<<"Your choise:"<<endl
        <<"1-newFile"<<endl
        <<"2-addFile"<<endl
        <<"3-viewFile"<<endl
        <<"4-deleteFile"<<endl
        <<"5-runFile"<<endl
        <<"6-outputFile"<<endl
        <<"7-the end of the work"<<endl<<"?";

    int menuChoice;
    cin>>menuChoice;
    return menuChoice;
}


void newFile (ofstream &writeFromFile)
{
   ofstream My_base("f:\\base.dat", ios::out);

   if (!My_base)
      {
        cerr<<"The file can't be opened!"<<endl;
        My_base.close();
      }

   Furniture blankFurniture={0," "," ",0,0,0};

   for( int i=1; i<=100; i++)

      My_base.write((char*)&blankFurniture, sizeof(blankFurniture));

}


void addFile (ofstream &writeFromFile)
{
   ofstream My_base("f:\\base.dat", ios::ate);

   if (!My_base)
      {
        cerr<<"The file can't be opened!"<<endl;
        My_base.close();
      }

   cout<<"Input the number of the buyer"
       <<"(from 1 to 100, 0 - the end of input)"<<endl<<"?";

   Furniture furniture;
   cin>>furniture.Num_Buyer;

   while(furniture.Num_Buyer>0 && furniture.Num_Buyer<=100)
   {
         cout<<"Input Addres_Buyer, Furniture_Name, Furniture_Model, Date_Registration, Date_Execution"
             <<endl<<"?";

         cin>>furniture.Addres_Buyer>>furniture.Furniture_Name
            >>furniture.Furniture_Model>>furniture.Date_Registration
            >>furniture.Date_Execution;

         My_base.seekp((furniture.Num_Buyer-1)*sizeof(furniture));

         My_base.write((char*)&furniture, sizeof(furniture));

         cout<<"Input the number of the buyer"
             <<"(from 1 to 100, 0 - the end of input)"<<endl<<"?";
             cin>>furniture.Num_Buyer;
   }
}


void viewFile(int, char, char,int,int,int);
{
   ifstream inFurnitureFile("f:\\base.dat", ios::in);

   if (!inFurnitureFile)
      {
         cerr<<"The file cannot be opened"<<endl;
         getch();
         exit (1);
      }

    int Num_Buyer;
    char Addres_Buyer[30];
    char Furniture_Name[30];
    int Furniture_Model;
    int Date_Registration;
    int Date_Execution;

    cout<<setiosflags(ios::left)<<setw(6)<<"Num_Buyer"
        <<setw(16)<< "Addres_Buyer"<<setw(11)<<"Furniture_Name"
        <<setiosflags(ios::right)<<setw(10)<<"Furniture_Model"
        <<setw(10)<<"Date_Registration"<<setw(11)<<"Date_Execution"
        <<endl;

    while (inFurnitureFile>>Num_Buyer>>Addres_Buyer>>Furniture_Name
                          >>Furniture_Model>>Date_Registration
                          >>Date_Execution)
           outputLine (Num_Buyer,Addres_Buyer,Furniture_Name,Furniture_Model,Date_Registration,Date_Execution);
    return 0;
}


void outputLine(int Num_B, char *Addres_B, char *F_Name, int F_Model, int Date_Registr, int Date_Exec)
{
     cout<<setiosflags(ios::left)<<setw(6)<<Num_B
         <<setw(16)<<Addres_B<<setw(11)<<F_Name
         <<setw(10)<<setprecision(5)
         <<setiosflags(ios::showpoint | ios::right)
         <<F_Model<<setw(10)<<Date_Registr
         <<setw(10)<<Date_Exec<<endl;
}


void deleteFile(fstream &deleteFromFile)
{
   int d=0;
   int i;
   int k=0;
   int r=0;

   cout<<"Input the date:";
       cin>>d;

   Furniture furniture;

   if (furniture.Num_Buyer!=0)
   {
       Furniture blankFurniture={0," "," ",0,0,0};

       deleteFromFile.seekp((d-1)*sizeof(furniture));
       deleteFromFile.write((char*)&blankFurniture, sizeof(furniture));
   }

   for (i=0;i<k;i++)
   {
      if (furniture.Date_Execution<d)
        {
           r=r+1;
        }
   }
      if   (r==0)
            cout<<" Information was delete"<<endl;
}
« Последнее редактирование: 03-05-2010 10:11 от Джон » Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #37 : 02-05-2010 20:22 » 

LELECHKA, в последнем варианте все скобки на месте и main только одна, но, обрати внимание, что main у тебя описана не так, как я показывал. Твой вариант не всякий компилятор переварит - только старые.

Потом заголовочные файлы типа iostream.h - это тоже для старых компиляторов.

Скажи, в какой среде ты собираешь решение? Borland C++ 3.1?

Потом полезно сюда выкладывать сообщения об ошибках, которые ты получаешь при компиляции.


Точно является ошибкой то, что объявление (declaration) функции не соответствует её реализации (definition). Например, в объявлении у тебя стоит:
Код:
void newFile (fstream&);
а в реализации:
Код:
void newFile (ofstream &writeFromFile)

Объявления делаются лишь для того, чтобы в том случае, когда в реализации функции пишутся вызовы других функции, было уже определено (выше по тексту), сколько параметров какого типа и какой тип результата должны быть у вызываемой функции. У тебя в объявлении стоит один тип параметра, а в реализации - другой. Компилятор видит, что функция объявлена, но реализацию функции, соответствующей объявлению, не находит и сообщает об ошибке.
« Последнее редактирование: 02-05-2010 20:44 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #38 : 03-05-2010 04:36 » 

Dimka,
У меня C++Builder 6

Ошибка: Declaration terminated incorrectly ( возле открывающей скобки, после viewFile).

Т.е. объявление и реализация должны совпадать?

А main, как лучше исправить?
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #39 : 03-05-2010 08:43 » 

LELECHKA, Dimka конечно добрый, но даже у него терпение может кончиться
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #40 : 03-05-2010 09:22 » 

Цитата: LELECHKA
Ошибка: Declaration terminated incorrectly ( возле открывающей скобки, после viewFile).
Ну и посмотри что там такое, сравни с другими функциями, на которые компилятор не ругается. Непонятно, что там такое может вызывать у тебя ступор и панику. Нужно внимание и наблюдательность.

Цитата: LELECHKA
А main, как лучше исправить?
Я дал три варианта. Выбери наиболее похожий на твой.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #41 : 03-05-2010 11:00 » 


Я конечно понимаю, что вы возможно программист со стажем или человек, который программированием увлечен, но я таковой не являюсь!!!
Мне всего 21 год,я только учусь, программирование не мой основной предмет, и задачи не такого уровня мы делали до этого!!!!!
Я вчера уже плакала, потому что, не вижу ошибки, хоть убейте меня( это надо понимать) и не потому что я не внимательная!!!!!!!

Я уже каждую строчку знаю наизусь, а по ночам не могу уснуть от того, что снится код и думаю об этих ошибках!!!!!!!!!!!!!!!

Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #42 : 03-05-2010 11:03 » 

Dimka,

Я исправила, как смогла, посмотрите,пожалуйста, если еще не надоело:
Все равно не компилирует!
Код:
#include <fstream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#define MAX 100
#include <stdlib.h>

struct Furniture
{
   int Num_Buyer;
   char Addres_Buyer[30];
   char Furniture_Name[30];
   int Furniture_Model;
   int Date_Registration;
   int Date_Execution;
};

 int enterChoice();

 void newFile (fstream&);
 void addFile (fstream&);
 void viewFile (ostream&);
 void deleteFile (fstream&);
 void runFile  (fstream&);
 void outputFile  (fstream&);
 void outputLine(ostream&, Furniture);


int main()
{
   fstream My_base ("f:\\base.dat",ios::in | ios::out);
   if (!My_base)
     {
        cerr<<"The file can't be opened!"<<endl;
        exit(1);
     }

   int choice;

   while ((choice=enterChoice())!=6)
   {
      switch (choice)
      {
         case 1:
           newFile (My_base);
           break;
         case 2:
           addFile  (My_base);
           break;
         case 3:
           viewFile (My_base);
           break;
         case 4:
           deleteFile (My_base);
           break;
         case 5:
           runFile (My_base);
           break;
         case 6:
           outputFile (My_base);
           break;
         default:
           cerr<<"Incorrect choice"<<endl;
           break;
        }
     My_base.clear();
     }
}

int enterChoice()
{
    cout<<endl<<"Your choise:"<<endl
        <<"1-newFile"<<endl
        <<"2-addFile"<<endl
        <<"3-viewFile"<<endl
        <<"4-deleteFile"<<endl
        <<"5-runFile"<<endl
        <<"6-outputFile"<<endl
        <<"7-the end of the work"<<endl<<"?";

    int menuChoice;
    cin>>menuChoice;
    return menuChoice;
}


void newFile (fstream &writeFromFile)
{
   fstream My_base("f:\\base.dat", ios::out);

   if (!My_base)
      {
        cerr<<"The file can't be opened!"<<endl;
        My_base.close();
      }

   Furniture blankFurniture={0," "," ",0,0,0};

   for( int i=1; i<=100; i++)

      My_base.write((char*)&blankFurniture, sizeof(blankFurniture));

}


void addFile (fstream &writeFromFile)
{
   fstream My_base("f:\\base.dat", ios::ate);

   if (!My_base)
      {
        cerr<<"The file can't be opened!"<<endl;
        My_base.close();
      }

   cout<<"Input the number of the buyer"
       <<"(from 1 to 100, 0 - the end of input)"<<endl<<"?";

   Furniture furniture;
   cin>>furniture.Num_Buyer;

   while(furniture.Num_Buyer>0 && furniture.Num_Buyer<=100)
   {
         cout<<"Input Addres_Buyer, Furniture_Name, Furniture_Model, Date_Registration, Date_Execution"
             <<endl<<"?";

         cin>>furniture.Addres_Buyer>>furniture.Furniture_Name
            >>furniture.Furniture_Model>>furniture.Date_Registration
            >>furniture.Date_Execution;

         My_base.seekp((furniture.Num_Buyer-1)*sizeof(furniture));

         My_base.write((char*)&furniture, sizeof(furniture));

         cout<<"Input the number of the buyer"
             <<"(from 1 to 100, 0 - the end of input)"<<endl<<"?";
             cin>>furniture.Num_Buyer;
   }
}


void viewFile(ostream &inFurnitureFile);
{
   ostream My_base("f:\\base.dat", ios::in);

   if (!My_base)
      {
         cerr<<"The file cannot be opened"<<endl;
         exit (1);
      }

    int Num_Buyer;
    char Addres_Buyer[30];
    char Furniture_Name[30];
    int Furniture_Model;
    int Date_Registration;
    int Date_Execution;

    cout<<setiosflags(ios::left)<<setw(6)<<"Num_Buyer"
        <<setw(16)<< "Addres_Buyer"<<setw(11)<<"Furniture_Name"
        <<setiosflags(ios::right)<<setw(10)<<"Furniture_Model"
        <<setw(10)<<"Date_Registration"<<setw(11)<<"Date_Execution"
        <<endl;

    while (inFurnitureFile>>Num_Buyer>>Addres_Buyer>>Furniture_Name
                          >>Furniture_Model>>Date_Registration
                          >>Date_Execution)
           outputLine (My_base, Furniture);
    return 0;
}


void outputLine(ostream &output, Furniture f)
{
     output<<setiosflags(ios::left)<<setw(6)<<f.Num_Buyer
         <<setw(16)<<f.Addres_Buyer<<setw(11)<<f.Furniture_Name
         <<setw(10)<<setprecision(5)
         <<setiosflags(ios::showpoint | ios::right)
         <<f.Furniture_Model<<setw(10)<<f.Date_Registration
         <<setw(10)<<f.Date_Execution<<endl;
}


void deleteFile(fstream &deleteFromFile)
{
   int d=0;
   int i;
   int k=0;
   int r=0;

   cout<<"Input the date:";
       cin>>d;

   Furniture furniture;

   if (furniture.Num_Buyer!=0)
   {
       Furniture blankFurniture={0," "," ",0,0,0};

       deleteFromFile.seekp((d-1)*sizeof(furniture));
       deleteFromFile.write((char*)&blankFurniture, sizeof(furniture));
   }

   for (i=0;i<k;i++)
   {
      if (furniture.Date_Execution<d)
        {
           r=r+1;
        }
   }
      if   (r==0)
            cout<<" Information was delete"<<endl;
}
« Последнее редактирование: 03-05-2010 11:08 от Джон » Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #43 : 03-05-2010 11:08 » 

LELECHKA, бери код в скобки [ code ] [ /code ], последний раз намекаю. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #44 : 03-05-2010 11:11 » 

LELECHKA, компилятор обычно пишет (в окошке снизу) какие есть ошибки. Два раза кликаешь на ошибку, и попадаешь на строку, в которой ошибка была обнаружена. В любом случае вы если пишите, что "не компилируется и не знаю почему", то вы эти ошибки (полностью, с номерами строк) приводите.

ЗЫ кстати плохо что тут номера строк не показывает, когда в тэги заворачиваешь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #45 : 03-05-2010 11:19 » 

А когда не заворачиваешь, тоже не показывает. Ага Вывод: теги здесь не при чём.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #46 : 03-05-2010 11:36 » 

Определение:
Код:
 void viewFile (ostream&);

в main():
Код:
int main()
{
  fstream My_base ("f:\\base.dat",ios::in | ios::out); //это идентичный тип?
  ...
  switch (choice)
      {...
       case 3:
           viewFile (My_base); //Так и должно вызываться?
           break;
        ...}

Реализация:
Код:
void viewFile(ostream &inFurnitureFile);
{
   ostream My_base("f:\\base.dat", ios::in);
   ...
   exit(1);  //возвращаемое функцией значение в случае ошибки
   ...
   return 0;//возвращаемое функцией значение в случае успешного выполнения
}
а вернуть должны "void", т.е. ничего.

функция int main() должна вернуть целочисленное значение.
Записан

С уважением, Oldy.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #47 : 03-05-2010 12:59 » 

LELECHKA, я не понимаю следующего. Если тебе показали ошибку, например, с newFile, почему ты исправляешь только её? Почему недосуг проверить по аналогии другие функции с точно такой же ошибкой? Я также попросил сравнить реализацию viewFile с другими функциями - твоей реакции почему-то не последовало.

Синтаксис одинаковый во всей программе. Синтаксические правила, относящиеся к ошибкам, я описал - нужно всего лишь аккуратно всё проверить. Тем более, если компилятор сообщает об ошибках и строчках, в которых эти ошибки возникли.

P.S. Я лишь один раз работал с группой студентов, у которых программирование - непрофильный предмет. У них были точно такие же проблемы с синтаксисом (правда, усугубленные их незаинтересованностью). Когда нет интереса - это мне понятно, но когда есть желание разобраться - непонятно, какая религия мешает усвоить правила синтаксиса.

Давай в чат (вверху страницы в меню найдёшь) - так быстрее будет.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #48 : 03-05-2010 20:11 » 

За 2 часа в чате выяснили следующее:

1) Незнание синтаксиса - ну это дело наживное, можно освоить.
2) Код не вполне авторский и написан без особого понимания, хотя по сравнению с прочим контингетом этого раздела форума LELECHKA можно поздравить - действительно разбирается в том, с чем успела разобраться.
3) Представленный код просто довести до собираемого состояния невозможно - по ошибкам возникают циклы (исправляем одну - возникает другая, исправляем вторую - восстанавливается прежняя). Значит придётся сменить стратегию со "снизу вверх" на "сверху вниз", во главу угла поставив понимание.
4) Отсутствие навыка концентрации внимания и удержания в памяти мелких деталей. Это не потому, что у программистов память как-то по-особенному работает и какая-то нечеловеческая, а потому, что нужно уметь отделять главное от второстепенного и запоминать иерархически.
5) Незнание приёмов разработки и отладки - но это тоже дело наживное.

Что обсуждалось.

1) Схемы синтаксических конструкций. Например, объявление переменной: <тип> <название>; Предложено запоминать схемы и научиться проверять правильность записи кода по таким схемам и справляться с чисто синтаксическими ошибками и опечатками.
2) Базовые понятия: значение, тип, переменная, функция, аргументы и результат функции. Проводились параллели с обычной школьной математикой. Использование всего этого дела при анализе семантических ошибок вроде несовместимости типов значения и переменной.
3) Правила работы со списком ошибок от компилятора: разница между error и warning, обработка ошибок строго по порядку. Способ "исправления", когда код меняется с целью сокращения числа ошибок, был отвергнут: всегда нужно добиваться, чтобы исправление устранило (а не сдвинуло вниз) первую по списку ошибку, и не важно, что количество ошибок после этого может даже увеличиться.

Что делать дальше.

1) Было предложено составить алгоритм решения задачи на русском языке или по крайней мере описать код программы на русском языке строчка за строчкой, начиная с функции main.
2) Было предложено завести новый чистый проект и переносить туда код, начиная с main, строчка за строчкой, каждый раз добиваясь, чтобы программа компилировалась без ошибок.

Далее (что не обсуждалось). Пункт 2 лучше отложить и сосредоточиться на пункте 1. После составления алгоритма на кажду строчку русского описания нужно будет составить план её кодирования: какие конструкции языка, какие операции (функции) стандартной библиотеки, какие типы данных и переменные нужны для того, чтобы написать код по данному на русском языке описанию. Чтобы это не заняло много времени, и чтобы обратная связь была интенсивной, лучше это делать по частям. Например, сначала описать и разобрать функцию main и только её.
« Последнее редактирование: 03-05-2010 20:16 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #49 : 04-05-2010 17:23 » 

Привет, теперь я живу программированием! Улыбаюсь


Можно я словами буду прописывать алгоритм, того что программа должна делать.
Как я поняла:
1.   создать файл
2.   открыть файл
3.   ввод информации
4.   вывод информации из файла
5.   удаление…
6.   сортировка…
7.   сортировка….

Первые 3 пункта я объединила в один:

Код:
#include <fstream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#define MAX 100
#include <stdlib.h>
#define STR3 4
#define FNAME "f:\\furniture.txt\0"

struct Furniture
{
   int Num_Buyer;
   char Addres_Buyer[30];
   char Furniture_Name[30];
   char Furniture_Model[30];
   int Date_Registration;
   int Date_Execution;
};


void main()
{
   char fname[40]=FNAME;
   FILE*in;
   int i;

   if ((in=fopen(fname, "wt"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture;

   for (i=0;i<3;i++)
   {
     _flushall();

     printf("\n Num_Buyer: \n");
     scanf("%d",&furniture.Num_Buyer);

     printf ("\n Addres_Buyer: \n");
     gets (furniture.Addres_Buyer);

     printf ("\n Furniture_Name: \n");
     gets(furniture.Furniture_Name);

     printf ("\n Furniture_Model: \n");
     gets(furniture.Furniture_Model);

     printf ("\n Date_Registration: \n");
     scanf("%d",&furniture.Date_Registration);

     printf ("\n Date_Execution: \n");
     scanf("%d",&furniture.Date_Execution);
    }
     printf("\n\n");

    for (i=0;i<3;i++)
    {
      printf("\n Num_Buyer %d \n, Addres_Buyer %s \n, Furniture_Name %s \n, Furniture_Model %s \n,Date_Registration %d \n,Date_Execution %d \n",furniture.Num_Buyer,
      furniture.Addres_Buyer,furniture.Furniture_Name,furniture.Furniture_Model, furniture.Date_Registration,furniture.Date_Execution );
      

    }
    fclose(in);
  getch();
}

Программа не дописана. Я не знаю как вывести информацию в файл?
Нашла пример из книги, там после scanf пишут fprinf (in, «……»,…..),. Мне можно так писать?(только не знаю куда это вставить  и что вместо многоточия добавить).


У меня еще есть вопросы:
1. E меня не вводит Num_Buyer (пропускает), не могу понять почему?
2. Как правильно вывести дату, например, 12.12.12 ( с помощью scanf), не смогла найти, а вообще оно может так выводить ?
В программе  вводит дату просто как числа 1,2 и т.д.
3. Можно ли то Меню оставить прежним, изменив только функции, которые в него входят?


« Последнее редактирование: 04-05-2010 17:41 от Sla » Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #50 : 04-05-2010 21:00 » 

LELECHKA, в задании в самом начале говорилось о меню. Если в конце концов нужно будет меню, то ты неудачно начала с объединения функций и записи последовательностей.

Удачное начало - это описать меню и сделать "заглушки" функций, которые выполняют действия. "Заглушка" - означает функцию, которая ничего не делает (т.е. внутри неё ничего не написано), тем не менее, сама функция уже есть, её вызовы можно вставить в нужные места, и программа будет компилироваться. Написав основную функцию, потом по очереди начинаешь каждую "заглушку" превращать в полезную функцию. В принципе, у тебя в предыдущей версии меню было нормально описано, только там была допущена невнимательность - функция enterChoice позволяла вводить 7 вариантов, и выход из программы был 7, а меню считало, что выход - это число 6. Если что-то меняешь в одном месте - нужно проверять все остальные места, не оказало ли на них влияние твоё новое изменение.

По поводу открытия файла в главной функции у меня есть большие сомнения. В принципе, если файл открывается в режиме произвольного доступа, можно в него писать и из него читать одновременно. Но если файл открывается в режиме последовательного доступа (как поток - так обычно открывают текстовые файлы), то его можно открыть либо на чтение, либо на запись, и переключить режим можно, лишь закрыв файл и открыв в другом режиме. С этой точки зрения открывать файл до того, как пользователь определился, что же он хочет делать - занятие рискованное, поскольку можно открыть файл не в том режиме, который нужен.

Предлагаю не писать сразу открытие/закрытие файлов, а сделать логический каркас программы. Часто предлагается такой метод: в начале внутри функции в комментариях описывается алгоритм действий, потом строчка за строчкой под каждым действием в комментарии пишется код, который это действие выполняет. А управляющие конструкции (циклы, условия и т.п.) пишутся сразу - они и образуют логический каркас.

Что ещё. В предыдущей версии ты использовала стандартную библиотеку STL языка C++ - там для операций ввода/вывода использовались такие штуки, как cin, cout, ofstream, ifstream, операторы << и >> и т.п. Теперь ты стала использовать стандартную библиотеку языка C - в ней для операций ввода/вывода используются printf, scanf, fprintf, fopen, fclose, feof, тип FILE и т.п. При этом обе эти библиотеки делают одно и то же, просто код по-разному записывается. Ты уж определись, какой тебе пользоваться удобнее. По-моему для работы с потоками удобнее первое, а для работы с файлами произвольного доступа - второе.

Функция scanf не выводит, она вводит. И дату как дату она вводить не умеет - только как строчку с последующим написанием кода разбора этой строки.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #51 : 05-05-2010 17:14 » 

Вот, что я сделала. Программа компилируется.
Осталось теперь удаление и сортировка.
Не получается удалить исполненные договора, предшествующие заданной дате. Оно у меня удаляет абсолютно все данные( я этот кусок на вставляла).
С сортировкой я попробую разобраться, есть ведь различные виды сортировки, какой мне лучше использовать или это не имеет значения?

Код:
#include <fstream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
#define MAX 100
#include <stdlib.h>
#define STR2 3
#define FNAME "f:\\furniture.txt\0"

struct Furniture
{
   int Num_Buyer;
   char Addres_Buyer[30];
   char Furniture_Name[30];
   char Furniture_Model[30];
   int Date_Registration;
   int Date_Execution;
};

 int enterChoice();

 void newFile (fstream&);
 void viewFile (fstream&);
 void deleteFile (fstream&);
 void runFile  (fstream&);
 void outputFile  (fstream&);



int main()
{
   fstream My_base ("f:\\furniture.txt",ios::in | ios::out);
   if (!My_base)
     {
        cerr<<"The file can't be opened!"<<endl;
        exit(1);
      }

   int choice;

   while ((choice=enterChoice())!=5)
   {
      switch (choice)
      {
         case 1:
           newFile (My_base);
           break;
         case 2:
           viewFile (My_base);
           break;
         case 3:
           deleteFile (My_base);
           break;
         case 4:
           runFile (My_base);
           break;
         case 5:
           outputFile (My_base);
           break;
         default:
           cerr<<"Incorrect choice"<<endl;
           break;
        }
     My_base.clear();
     }
}

int enterChoice()
{
    cout<<endl<<"Your choise:"<<endl
        <<"1-newFile"<<endl
        <<"2-viewFile"<<endl
        <<"3-deleteFile"<<endl
        <<"4-runFile"<<endl
        <<"5-outputFile"<<endl
        <<"6-the end of the work"<<endl<<"?";

    int menuChoice;
    cin>>menuChoice;
    return menuChoice;
}
void newFile(fstream &writeFromFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i, j;

   if ((in=fopen(fname, "wt"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
    }

   Furniture furniture;

   for (i=0;i<2;i++)
   {
     _flushall();

     printf("\n Num_Buyer: \n");
     scanf("%d",&furniture.Num_Buyer);

     printf ("\n Addres_Buyer: \n");
     scanf ("%s", &furniture.Addres_Buyer);

     printf ("\n Furniture_Name: \n");
     scanf("%s", &furniture.Furniture_Name);

     printf ("\n Furniture_Model: \n");
     scanf("%s", &furniture.Furniture_Model);

     printf ("\n Date_Registration: \n");
     scanf("%d",&furniture.Date_Registration);

     printf ("\n Date_Execution: \n");
     scanf("%d",&furniture.Date_Execution);

     fprintf(in,"\n Num_Buyer: %d\n Addres_Buyer: %s \n Furniture_Name: %s \n Furniture_Model: %s \n Date_Registration: %d \n Date_Execution: %d \n" , furniture.Num_Buyer, furniture.Addres_Buyer, furniture.Furniture_Name,
     furniture.Furniture_Model, furniture.Date_Registration,furniture.Date_Execution);
    }
     printf("\n\n");

   fclose(in);
   getch();
}


void viewFile(fstream &inFurnitureFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i, j;

   if ((in=fopen(fname, "rt"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture;

   while (!feof(in))
   {
     fscanf(in,"\n Num_Buyer: %d\n Addres_Buyer: %s \n Furniture_Name: %s \n            Furniture_Model: %s \n Date_Registration: %d \n Date_Execution: %d \n" , &furniture.Num_Buyer, &furniture.Addres_Buyer, &furniture.Furniture_Name,&furniture.Furniture_Model, &furniture.Date_Registration,&furniture.Date_Execution);
     printf("\n Num_Buyer: %d\n Addres_Buyer: %s \n Furniture_Name: %s \n Furniture_Model: %s \n Date_Registration: %d \n Date_Execution: %d \n", furniture.Num_Buyer, furniture.Addres_Buyer, furniture.Furniture_Name,furniture.Furniture_Model, furniture.Date_Registration,furniture.Date_Execution);
   }
   fclose(in);
   getch();

}

void deleteFile (fstream &deleteFromFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i, j;
   int d=0;
   int r=0;

   if ((in=fopen(fname, "wt"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture;

   cout<<"Input the date:\n";
   cin>>d;
}


void runFile  (fstream &outputFromFile)
{

}

void outputFile  (fstream &outputFromFile)
{
}
« Последнее редактирование: 05-05-2010 17:16 от Sla » Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #52 : 05-05-2010 17:17 » 

LELECHKA, мне не сложно, но на будущее
оформляй код тегами
[code]   КОД  [/code]


Алгоритм сортировки не имеет значения.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #53 : 05-05-2010 17:19 » 

LELECHKA, ты бы показала как удаляешь из файла
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #54 : 05-05-2010 17:30 » 

при удалении for нужен?
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #55 : 05-05-2010 17:34 » 

LELECHKA, для чего используется for?

Покажи что у тебя получилось (неполучилось) чтоб понять как ты мыслишь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #56 : 05-05-2010 17:38 » 

Dimka, исполненный договор, насколько я поняла,это  когда дата исполнения=дате оформления, потом я сравниваю дату исполнения с введенной датой, и если дата исполнения< введенной, то небходимо удалить исполненные договора

я прописываю так удаление
deleteFromFile.seekp((....)*sizeof(furniture));
я понимаю, что это не правильно,не знаю как прописать
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #57 : 05-05-2010 17:39 » 

Sla, я писала с if ()
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #58 : 05-05-2010 17:41 » 

Sla, for - цикл, грубо говоря для того чтобы перебрать все значения (не могу объяснить своими словами)
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #59 : 05-05-2010 21:21 » 

fstream внутри main меня уже утомил - что ни говорю, всё мимо ушей, код только усложняется. Аналогично с меню.

Подробный разбор сортировки есть, например, тут:
http://ru.wikibooks.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8

Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #60 : 06-05-2010 18:23 » 

Dimka, не получается ни с сортировкой, ни с удалением!
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #61 : 06-05-2010 18:59 » 

Возвращаясь от приватной переписки.

LELECHKA, представленный код близок к тому, чтобы быть правильным, но он настолько сумбурный, что мне достаточно сложно представить, как таким способом можно будет безошибочно реализовать алгоритм сортировки. Пока что написанное близко к правильному именно за счёт того, что тут нет ничего более-менее алгоритмически сложного.

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

Добавлено: о! как в воду глядел.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #62 : 06-05-2010 19:09 » 

LELECHKA, опиши алгоритмы удаления и сортировки на русском языке. Алгоритм всегда пишется для исполнителя, который умеет понимать отдельные инструкции. Считай, что твой исполнитель умеет следующее:
- открыть файл для работы,
- закрыть файл по окончании работы,
- двигать текущую позицию (курсор) внутри файла между разными записями, в том числе на самую первую и на самый конец файла,
- прочитать в память (в переменную) из файла запись в текущей позиции курсора и сдвинуть курсор к следующей записи,
- записать из памяти (из переменной) запись в файл в текущей позиции курсора и сдвинуть курсор к следующей записи,
- узнавать, номер позции, где находится курсор,
- узнавать, достигнут ли конец файла,
- сравнить две записи (в двух переменных) по указанным полям и сказать: меньше ли первая запись, нежели вторая, или нет.
Ещё исполнитель знает, что такое переменные, присваивание, ветвления, циклы и подпрограммы/функции, их аргументы и результат.

Используй только перечисленные мной понятия - никакой "художественной литературы", никакой отсебятины.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #63 : 07-05-2010 09:06 » 

Dimka, Объясни, пожалуйста, еще раз, какие изменения должны быть в части fstream( там не соответсвие или запись должна быть другая), честно, не понимаю?

Как прописывать движение по записям?  Я нашла seekg(), fseek().

Как записывать из памяти запись в файл?

Как узнать на какой позиции находится нужная мне запись?

В тех функциях, в которых нужно удалять, сортировать какой должен быть режим файла? (я ставила r+t)
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #64 : 07-05-2010 12:26 » 

LELECHKA, я писал, что работа с файлам и потоками может осуществляться с помощью двух библиотек. fstream, cin, cout относятся к стандартной библиотеке STL из языка C++, fopen, fclose, fprintf, fscanf относятся к стандартной библиотеке языка C.

Но дело не в том, что ты используешь сразу две библиотеки, а в том, что ты их используешь непоследовательно. Зачем у тебя в main находится fstream, который ты передаёшь как аргумент в другие функции, если ты в других функциях его не используешь, а используешь fopen? Это не только не нужно, это ещё и опасно: у тебя один и тот же файл открывается двумя разными способами. Каждый открытый файл в программе имеет свой дескриптор и свою текущую позицию (курсор). В твоём случае получается два дескриптора и два курсора на один и тот же файл. Если, к примеру, будешь позиционировать курсор одним способом, а записывать другим, то запись пойдёт не в то место, что может вызвать порчу данных или неожиданное для тебя самой поведение.

Это точно та же проблема, что и раньше мы разбирали с форматированием. Пока не будет порядка, будут ошибки. Выбери одну библиотеку и используй только её.

В стандартной библиотеке C движение по записям осуществляет функция fseek.

По поводу записи в файл и чтения из файла.

Если с файлом работают как с текстовым: записывать функцией fprintf, читать функцией fscanf - с ним работают только в последовательном режиме. Что ты и делаешь. В результате внутри файла окажется текст, файл можно открыть в Блокноте и посмотреть его содержимое. Но этот способ работы не годится для простой реализации алгоритма сортировки. Проблема здесь в том, что отдельные записи имеют разную длину (из-за того, что строки и строковые представления чисел имеют разное количество символов в разных записях). Это значит, что нет никакой возможности вычислить, с какого байта от начала файла начинается нужная запись. Для реализации сортировки в таком случае нужно читать исходный файл, например, по 2 соседние записи, обменивать их в памяти, если нарушен порядок, и записывать результат в другой временный файл, а затем, наоборот, временный файл перезаписывать в исходный - и так много раз, пока не будет достигнут порядок. Есть и специальные алгоритмы сортировки для последовательных файлов, но они работают по тому же принципу многократного презаписывания.

Но с файлом можно работать как с двоичным: записывать функцией fwrite и читать функцией fread - с ними работают в режиме произвольного доступа. В результате внутри файла окажется нечитаемый в текстовом редакторе набор двоичных данных, байтов, и записи будут храниться в точности в том виде, в каком они хранятся в памяти программы при работе. Записи всегда будут иметь одинаковую длину, равную размеру структуры данных. Эту длину можно получить при помощи оператора sizeof. Это позволяет свободно перемещать курсор к любой записи: нужно позицию записи умножить на размер записи - и получится номер байта, с которого начинается запись внутри файла. Функция fseek это делает сама - ей достаточно сказать номер позиции и размер структуры. В этом случае с файлом можно работать почти так же, как с массивом, и поэтому можно написать многие алгоритмы сортировки. Для функций fread и fwrite не надо перечислять поля записи, нужно передавать всю запись целиком.

Для выяснения текущей позиции в файле (на каком байте стоит курсор) служит функция ftell.

Удаление записей из файла, так чтобы файл "ужался" посередине, невозможно. Можно только подтянуть записи из конца файла вперёд на 1, чтобы затереть удаляемую запись и не оставлять "дырку". Сжатие файла, чтобы ликвидировать пустые позиции, возможно только через его копирование запись за записью в новый файл, пропуская "дырки".

Для работы с файлом в режиме произвольного доступа удобнее всего использовать режим w+ - он открывает файл на чтение и запись, и, при этом, если файла ещё нет, создаёт его. Курсор при этом будет стоять на первой (с номером 0) записи. Для перемещения в конец файла и добавления новых записей используется fseek со специальной константой (аналогично для перемещения в самое начало). Если с помощью fseek переместить курсор на конец файла и с помощью ftell узнать текущую позицию - эта позиция будет равна размеру файла (в байтах), если её поделить на размер записи (в байтах), то полученное число будет количеством записей в файле.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #65 : 07-05-2010 19:08 » 

Вместо My_base у меня должно теперь стоять fname?

У меня раньше стояло :
My_base.clear();
Я заменила на fname.clear(); выдает ошибку: [C++ Error] Unit1.cpp(72): E2294 Structure required on left side of . or .*
Как правильно написать?

Вот, что в общем получилось, так должно быть или бред?
Код:
#include <fstream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <iomanip.h>
#define MAX 100
#include <stdlib.h>
#define STR2 3
#define FNAME "f:\\furniture.txt\0"

struct Furniture
{
   int Num_Buyer;
   char Addres_Buyer[30];
   char Furniture_Name[30];
   char Furniture_Model[30];
   int Date_Registration;
   int Date_Execution;
};

 int enterChoice();

 void newFile (const char*newFile);
 void viewFile (const char*viewFile);
 void deleteFile (const char*deleteFile);
 void runFile  (const char*runFile);
 void outputFile  (const char*outputFile);



int main(int argc, char* argv[])
{

   char fname[40]=FNAME;
   FILE*in;


   if ((in=fopen(fname, "wt"))==NULL)
   {
      printf("The file cannot be opened");
      getch();

   }

   int choice;

   while ((choice=enterChoice())!=5)
   {
      switch (choice)
      {
         case 1:
           newFile (fname);
           break;
         case 2:
           viewFile (fname);
           break;
         case 3:
           deleteFile (fname);
           break;
         case 4:
           runFile (fname);
           break;
         case 5:
           outputFile (fname);
           break;
         default:
           cerr<<"Incorrect choice"<<endl;
           break;
        }
     fname.clear();
     }

   fclose(in);
   getch();
}

int enterChoice()
{
    cout<<endl<<"Your choise:"<<endl
        <<"1-newFile"<<endl
        <<"2-viewFile"<<endl
        <<"3-deleteFile"<<endl
        <<"4-runFile"<<endl
        <<"5-outputFile"<<endl
        <<"6-the end of the work"<<endl<<"?";

    int menuChoice;
    cin>>menuChoice;
    return menuChoice;
}
void newFile(fstream &writeFromFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i, j;

   if ((in=fopen(fname, "wt"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture[MAX];

   for (i=0;i<2;i++)
   {
     _flushall();

     printf("\n Num_Buyer: \n");
     scanf("%d",&furniture[i].Num_Buyer);

     printf ("\n Addres_Buyer: \n");
     scanf ("%s", &furniture[i].Addres_Buyer);

     printf ("\n Furniture_Name: \n");
     scanf("%s", &furniture[i].Furniture_Name);

     printf ("\n Furniture_Model: \n");
     scanf("%s", &furniture[i].Furniture_Model);

     printf ("\n Date_Registration: \n");
     scanf("%d",&furniture[i].Date_Registration);

     printf ("\n Date_Execution: \n");
     scanf("%d",&furniture[i].Date_Execution);

     fprintf(in,"\n Num_Buyer: %d\n Addres_Buyer: %s \n Furniture_Name: %s \n Furniture_Model: %s \n Date_Registration: %d \n Date_Execution: %d \n" , furniture[i].Num_Buyer, furniture[i].Addres_Buyer, furniture[i].Furniture_Name,
     furniture[i].Furniture_Model, furniture[i].Date_Registration,furniture[i].Date_Execution);
    }
     printf("\n\n");

   fclose(in);
   getch();
}


void viewFile(fstream &inFurnitureFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i, j;

   if ((in=fopen(fname, "rt"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture;

   while (!feof(in))
   {
     fscanf(in,"\n Num_Buyer: %d\n Addres_Buyer: %s \n Furniture_Name: %s \n Furniture_Model: %s \n Date_Registration: %d \n Date_Execution: %d \n" , &furniture.Num_Buyer, &furniture.Addres_Buyer, &furniture.Furniture_Name,&furniture.Furniture_Model, &furniture.Date_Registration,&furniture.Date_Execution);
     printf("\n Num_Buyer: %d\n Addres_Buyer: %s \n Furniture_Name: %s \n Furniture_Model: %s \n Date_Registration: %d \n Date_Execution: %d \n", furniture.Num_Buyer, furniture.Addres_Buyer, furniture.Furniture_Name,furniture.Furniture_Model, furniture.Date_Registration,furniture.Date_Execution);
   }
   fclose(in);
   getch();

}

void deleteFile(fstream &deleteFromFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i, d;

   if ((in=fopen(fname, "w+t"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture[MAX];

   cout<<"Input the date:\n";
   cin>>d;

   fclose(in);
   getch();

}

[ /code ]
void runFile  (fstream &outputFromFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i;

   if ((in=fopen(fname, "w+t"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture[MAX];

   fclose(in);
   getch();
}


void outputFile  (fstream &outputFromFile)
{
}
« Последнее редактирование: 07-05-2010 19:12 от Джон » Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #66 : 07-05-2010 21:21 » 

Конечно бред. Я ведь говорил: ответь на вопрос зачем? Ну вот, допустим, строчка fname.clear() - что по-твоему она делает и зачем в этом месте написана? Ты не делаешь описаний на русском языке, о которых я уже не один раз сказал, ты постоянно показываешь код. В данном случае, поскольку прогресс по коду очень слабый (хотя и есть), это выглядит как попытка избежать необходимости тщательно разобраться.

Не надо методом тыка менять код, не надо метаться, нужно сосредоточиться. Сосредоточься на содержании функции main и ответь, зачем там у тебя написано fname.clear() что это означает, каким образом это связано с решаемой тобой общей задачей. Нужно обосновать необходимость и достаточность каждой строчки. В идеале - математически, но в твоём случае достаточно зравого смысла.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #67 : 08-05-2010 11:56 » 

Dimka, С main я попробую сегодня разобраться,а эту часть можно так оставить( именно то, что в скобках)?

 void newFile (const char*newFile);
 void viewFile (const char*viewFile);
 void deleteFile (const char*deleteFile);
 void runFile  (const char*runFile);
 void outputFile  (const char*outputFile);
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #68 : 08-05-2010 15:45 » 

LELECHKA, вопрос неправильный. Именно ты сама знаешь, можно или нельзя так оставлять, если имеешь объяснение, зачем это там написано - это твоя программа, твой творческий замысел. С тем же успехом Вера Мухина могла бы спрашивать: можно ли поместить в руки рабочего и колхозницы серп и молот? Улыбаюсь Иначе опять получается метод тыка, преобразованный в попытку угадать моё мнение.

Каждая часть, каждая строчка должна быть подчинена общему замыслу.

Я не против тех или иных решений в работающей программе - можно обсуждать достоинства и недостатки, можно говорить, что одно решение лучше другого, можно иметь разные мнения, спорить и не соглашаться, когда все эти решения являются корректными решениями задачи - это всё будет нормальной ситуацией.

Но против чего я категорически возражаю, так это против бездумности, написания такого кода, который непонятен автору. Не должно быть ни одной непонятной строчки! Пустая программа на C/C++ выглядит так:
Код: (C)
int main()
{
    return 0;
]
Это можно принять как данность и не объяснять - так надо, чтобы программа работала. Но всё остальное, написанное помимо этих 4 строчек, пишется программистом в соответствии с поставленной задачей и потому должно иметь объяснение, ответы на те вопросы, о которых я писал выше. Поэтому я и говорю: начни с main.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #69 : 08-05-2010 17:18 » 

Dimka, Можно я оставлю пока так:

Код:
#include <fstream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <iomanip.h>
#define MAX 100
#include <stdlib.h>
#define STR2 3
#define FNAME "f:\\furniture.txt\0"

struct Furniture
{
   int Num_Buyer;
   char Addres_Buyer[30];
   char Furniture_Name[30];
   char Furniture_Model[30];
   int Date_Registration;
   int Date_Execution;
};

 int enterChoice();

 void newFile (fstream&);
 void viewFile (fstream&);
 void deleteFile (fstream&);
 void runFile  (fstream&);
 void outputFile  (fstream&);



int main()
{
   fstream My_base;

   char fname[40]=FNAME;
   FILE*in;


   if ((in=fopen(fname, "w+t"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
   }

   int choice;

   while ((choice=enterChoice())!=5)
   {
      switch (choice)
      {
         case 1:
           newFile (My_base);
           break;
         case 2:
           viewFile (My_base);
           break;
         case 3:
           deleteFile (My_base);
           break;
         case 4:
           runFile (My_base);
           break;
         case 5:
           outputFile (My_base);
           break;
         default:
           cerr<<"Incorrect choice"<<endl;
           break;
        }
     My_base.clear();
     }
}

int enterChoice()
{
    cout<<endl<<"Your choise:"<<endl
        <<"1-newFile"<<endl
        <<"2-viewFile"<<endl
        <<"3-deleteFile"<<endl
        <<"4-runFile"<<endl
        <<"5-outputFile"<<endl
        <<"6-the end of the work"<<endl<<"?";

    int menuChoice;
    cin>>menuChoice;
    return menuChoice;
}
void newFile(fstream &writeFromFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i, j;

   if ((in=fopen(fname, "wt"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture[MAX];

   for (i=0;i<2;i++)
   {
     _flushall();

     printf("\n Num_Buyer: \n");
     scanf("%d",&furniture[i].Num_Buyer);

     printf ("\n Addres_Buyer: \n");
     scanf ("%s", &furniture[i].Addres_Buyer);

     printf ("\n Furniture_Name: \n");
     scanf("%s", &furniture[i].Furniture_Name);

     printf ("\n Furniture_Model: \n");
     scanf("%s", &furniture[i].Furniture_Model);

     printf ("\n Date_Registration: \n");
     scanf("%d",&furniture[i].Date_Registration);

     printf ("\n Date_Execution: \n");
     scanf("%d",&furniture[i].Date_Execution);

     fprintf(in,"\n Num_Buyer: %d\n Addres_Buyer: %s \n Furniture_Name: %s \n Furniture_Model: %s \n Date_Registration: %d \n Date_Execution: %d \n" , furniture[i].Num_Buyer, furniture[i].Addres_Buyer, furniture[i].Furniture_Name,
     furniture[i].Furniture_Model, furniture[i].Date_Registration,furniture[i].Date_Execution);
    }
     printf("\n\n");

   fclose(in);
   getch();
}


void viewFile(fstream &inFurnitureFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i, j;

   if ((in=fopen(fname, "rt"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture;

   while (!feof(in))
   {
     fscanf(in,"\n Num_Buyer: %d\n Addres_Buyer: %s \n Furniture_Name: %s \n Furniture_Model: %s \n Date_Registration: %d \n Date_Execution: %d \n" , &furniture.Num_Buyer, &furniture.Addres_Buyer, &furniture.Furniture_Name,&furniture.Furniture_Model, &furniture.Date_Registration,&furniture.Date_Execution);
     printf("\n Num_Buyer: %d\n Addres_Buyer: %s \n Furniture_Name: %s \n Furniture_Model: %s \n Date_Registration: %d \n Date_Execution: %d \n", furniture.Num_Buyer, furniture.Addres_Buyer, furniture.Furniture_Name,furniture.Furniture_Model, furniture.Date_Registration,furniture.Date_Execution);
   }
   fclose(in);
   getch();

}

void deleteFile(fstream &deleteFromFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i,d;


   if ((in=fopen(fname, "w+t"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture[MAX];

   cout<<"Input the date:\n";
   cin>>d;

   fclose(in);
   getch();
}


void runFile  (fstream &outputFromFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i;



   if ((in=fopen(fname, "w+t"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture[MAX];

   fclose(in);
   getch();
}


void outputFile  (fstream &outputFromFile)
{
   char fname[40]=FNAME;
   FILE*in;
   int i;



   if ((in=fopen(fname, "w+t"))==NULL)
   {
      printf("The file cannot be opened");
      getch();
      return;
   }

   Furniture furniture[MAX];

   fclose(in);
   getch();


}[\code]

« Последнее редактирование: 08-05-2010 17:21 от LELECHKA » Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #70 : 08-05-2010 17:21 » 

Dimka,

Ты говорил, что пользоваться нужно только одной библиотекой, точнее желательно. Получается, что на каждый мой, например,  void newFile (fstream&) в скобках должна быть другая запись с fopen( плюс в каком режиме должен быть открыт файл)? Если да, то я не знаю как это правильно записать.

И по поводу, fseek(), я что-то запуталась. Эту функцию используют, когда работают с двоичным файлом, а у меня текстовый, т.е. мне необходимо изменить мое File*in на File*b и заменить fscanf/fprinf  на  fwrite/fread?
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #71 : 08-05-2010 20:34 » 

Цитата: LELECHKA
Ты говорил, что пользоваться нужно только одной библиотекой, точнее желательно. Получается, что на каждый мой, например,  void newFile (fstream&) в скобках должна быть другая запись с fopen( плюс в каком режиме должен быть открыт файл)? Если да, то я не знаю как это правильно записать.
Что именно записать? Не кодом, русским языком скажи, что это такое - то, что ты хочешь записать. То, что ты считаешь проблемой, проблемой не является, потому что в том, о чём ты спрашиваешь, нет никакого смысла в твоей задаче. И всё, что нужно, это увидеть, где смысл есть, а где его нет.

Цитата: LELECHKA
И по поводу, fseek(), я что-то запуталась. Эту функцию используют, когда работают с двоичным файлом, а у меня текстовый, т.е. мне необходимо изменить мое File*in на File*b и заменить fscanf/fprinf  на  fwrite/fread?
Я не сказал "необходимо", я сказал, что двоичный формат более удобен для реализации сортировки, нежели текстовый, и объяснил почему - выбор за тобой. В части замены fscanf/fprintf на fwrite/fread - про такое я говорил, если переходить к двоичному формату. Но вот откуда ты взяла File*in и File*b - это загадка. Что это такое по-твоему? (опять же, русским языком, а не кодом)

P.S. Ситуация патовая - русским языком ты говорить не хочешь, а твой код хочется прокомментировать цитатой из х/ф "Кин-дза-дза": "Очень трудно в язык проникать, когда сразу на двух языках думаете. А этот пацак всё время говорит на языках, продолжения которых не знает!"
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #72 : 09-05-2010 06:40 » 

Dimka,
Попытаюсь объяснить на русском, что я имею ввиду.
1. Ну вот допустим, мой void newFile (fstream&). Этот пункт меню должен открывать мой файл для ввода/вывода. На данный момент я пытаюсь прописать то же самое, только с помощью fopen. Только не понимаю зачем, наверное смысла нет записывать по-другому.

2. Я ведь работаю с текстовым файлом,  он обозначается как FILE*in, а для того, чтобы работать с файлом в двоичном формате, его необходимо обозначить как FILE*b.
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #73 : 09-05-2010 08:05 » 

LELECHKA, потренируйся еще - не получилось.

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #74 : 09-05-2010 09:16 » 

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

Например, в стандарте языка C++ одному только знаку "," (запятая) посвящено два абзаца на четверь страницы A4 мелким шрифтом английского текста описания! А ты на целую функцию отводишь лишь одно короткое предложение, причём далеко не соответствующее тому, что у тебя написано внутри функции newFile на самом деле. Да, функция newFile делает то, что ты говоришь, но это делается и в других местах твоей программы, а про самое главное, что делает функция newFile, ты вообще не упомянула.

В выражениях:
Код:
void newFile(fstream &);
и
Код:
FILE *in;
на самом деле бездна смысла. Любая функция, любой алгоритм начинается со спецификаций: решаемой задачи, необходимых для решения задачи входных и выходных данных, их способов передачи в памяти, типов данных, допущений о состоянии окружающей функцию "среды" - значений глобальных переменных, состояний файлов и т.п. Я от тебя даже про fstream ничего внятного услышать не могу, а уж про значки "&" и "*" вообще не заикаюсь, хотя это тоже интересно - почему выбран тот или иной значок, за этим тоже должны стоять какие-то соображения, потому что эти значки не для красоты пишутся.

P.S. Алгоритм удаления, который ты прислала мне в привате и мой ответ на твой алгоритм лучше сюда выкладывать. Дело в том, что подобные темы нами могут использоваться для других посетителей - кому-то со сходными проблемами можно будет предложить прочитать эту тему, и, возможно, это поможет. В привате оно будет недоступно. Если не хочешь сейчас, я выложу потом - по окончании. Естественно, информацию личного характера выкладывать не буду.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #75 : 09-05-2010 15:23 » 

Лекция по составлению алгоритмов и спецификаций для простейших случаев Улыбаюсь

Любой алгоритм - это упорядоченная последовательность действий, направленная на перевод системы из одного состояния в другое. Соответственно, начальное состояние называется предусловием - чтобы алгоритм правильно работал, нужно, чтобы он запустился только тогда, когда система находится в начальном состоянии, иначе нельзя гарантировать, что выполнение всех действий приведёт к ожидаемому результату, или, что эти действия не приведут к аварии. Конечное состояние называется постусловием - алгоритм обязан гарантированно приводить к конечному состоянию, нередко окончание работы алгоритма (особенно с циклами и/или рекурсией) определяется именно по факту выполнения постусловия (т.е. достижения ожидаемого результата). Пред- и постусловие разрабатываются до алгоритма и потом помогают программисту составлять сам алгоритм. Когда алгоритм разбивается на части - на последовательные шаги или этапы, пред- и постусловие разрабатываются для каждого шага, при этом постусловие предыдущего не должно конфликтовать с предусловием последующего шага.

Как этим пользоваться? Рассмотрим на элементарном примере. Допустим, система - это дверь. Соответственно, она может находиться в двух состояниях: открыта или закрыта. И над ней можно выполнять три действия: открыть или закрыть, а также узнать текущее состояние. Поскольку алгоритм должен переводить систему из одного состояния в другое, для двери возможно составить 2 алгоритма, каждый из которых состоит лишь из 1 действия.

Предусловие А: дверь открыта.
Алгоритм А: закрыть дверь.
Постусловие А: дверь закрыта.

Предусловие Б: дверь закрыта.
Алгоритм Б: открыть дверь.
Постусловие Б: дверь открыта.

Отсюда видно влияние пред- и постусловий на возможность применения алгоритмов. Совершенно очевидно, что открытую дверь нельзя открыть ещё раз, перед этим не закрыв, и нельзя закрыть уже закрытую дверь. Т.е. к предусловию А алгоритм Б просто не подходит - возникнет логическая ошибка при исполнении.

Но алгоритмы могут быть и более сложными, например:

Алгоритм В: закрыть дверь, открыть дверь.
Алгоритм Г: закрыть дверь, открыть дверь, закрыть дверь.

Алгоритм В подходит для предусловия А, но после его исполнения не будет справедливым постусловие А - поэтому такой алгоритм отвергается. Наконец, алгоритм Г подходит и для предусловия А, и для постусловия А - это корректный алгоритм для решения задачи, его можно применять. Но здравый смысл говорит, что алгоритм А предпочтительнее, потому что проще.

Если ослабляется (т.е. уменьшается количество ограничений) предусловие или усиливается (т.е. увеличивается количество ограничений) постусловие - алгоритм должен становиться сложнее, если наоборот - алгоритм можно упростить.

Например, если предусловие "дверь открыта", то более слабое предусловие "дверь открыта или закрыта" или, другими словами, "дверь находится в любом состоянии". Усиление происходит в обратном направлении: от безразличия мы должны перейти к определённости.

Посмотрим, как это влияет на алгоритмы:

Предусловие: дверь открыта или закрыта.
Алгоритм: закрыть дверь.
Постусловие: дверь закрыта.

В этом примере алгоритм подходит для постусловия, но слишком прост для предусловия - в некоторых случаях мы будем пытаться закрыть уже закрытую дверь, поэтому его нужно усложнить:

Предусловие: дверь открыта или закрыта
Алгоритм: ЕСЛИ дверь открыта ТО закрыть дверь КОНЕЦ ЕСЛИ
Постусловие: дверь закрыта

Пока что у нас дверь открывалась и закрывалась бессмысленно - не обсуждался вопрос, зачем её открывать или закрывать. Чтобы на такой вопрос получить ответ, систему с дверью нужно поместить в контекст другой системы. Например, система "дверь к врачу". К врачу потому, что такая дверь не бывает постоянно открыта, чтобы не мешать проходу, как это бывает, например, в магазинах, дверь у врача специально предназначена для возможности сохранения врачебной тайны.

В этом новом контексте уже имеет смысл ситуация:

Предусловие: дверь закрыта.
Алгоритм: открыть дверь, закрыть дверь.
Постусловие: дверь закрыта.

Такой алгоритм служит для впускания или выпускания посетителя, и не является ненужным усложнением. Но, как я выше говорил, любой алгоритм должен менять состояние системы. А этого в данной ситуации не видно.

Нужно добавить в систему посетителя. Посетитель умеет входить и выходить и может быть в двух состояниях: снаружи и внутри. К нему можно применить аналогичные рассуждения, что и к двери - подробно расписывать не буду, думаю, это очевидно. Возникает вопрос, как увязать посетителя и дверь между собой.

Попробуем сопоставить состояния:
ЗВ: дверь закрыта и посетитель внутри - возможно;
ЗС: дверь закрыта и посетитель снаружи - возможно;
ОВ: дверь открыта и посетитель внутри - возможно;
ОС: дверь открыта и посетитель снаружи - возможно.
Лишних состояний нет. Если бы мы к двери добавили замок с состояниями отперт и заперт, то очевидно, что состояние, когда дверь открыта и замок заперт хотя и возможно, но бессмысленно, смысл имеет только запертый замок у закрытой двери.

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

Например, если предусловие - ЗВ, а постусловие - ЗС, то возможны алгоритмы:
ЗВ-ЗС-1: посетитель выходит;
ЗВ-ЗС-2: открыть дверь, посетитель выходит, закрыть дверь;
ЗВ-ЗС-3: посетитель выходит, открыть дверь, закрыть дверь;
ЗВ-ЗС-4: открыть дверь, закрыть дверь, посетитель выходит;
и другие более длинные комбинации. Тут здравый смысл говорит, что из всех вариантов подходит только ЗВ-ЗС-2, так как посетитель может войти или выйти лишь через открытую дверь. Но здравый смысл хорошо работает только в очевидных случаях вроде этого, а более сложные и неочевидные случаи могут потребовать больших раздумий, какой из вариантов лучше выбрать - чтобы это решить, нужно очень хорошо понимать, что происходит.

Или, например, если предусловие - ЗВ, а постусловие - ОВ, то возможны алгоритмы:
ЗВ-ОВ-1: открыть дверь;
ЗВ-ОВ-2: посетитель выходит, открыть дверь, посетитель входит;
ЗВ-ОВ-3: открыть дверь, посетитель выходит, посетитель входит;
ЗВ-ОВ-4: посетитель выходит, посетитель входит, открыть дверь;
и другие более длинные комбинации. Здесь уже допустимы как ЗВ-ОВ-1, так и ЗВ-ОВ-3.

Что ещё интересно: посетитель может выполнять своё действие только при состоянии открытой двери. Значит можно сформулировать правило: прежде, чем посетитель выполняет свои действия, дверь нужно открыть. По контексту, поскольку дверь ведёт к врачу, мы договорились, что в конце концов она должна закрываться - это будет в самом конце любого алгоритма.

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

Обозначим Z состояние двери, а Y состояние посетителя. Через ~Z и ~Y обозначим противоположные состояния. Например, если Z - дверь открыта, то ~Z - дверь закрыта, если же Z - дверь закрыта, то ~Z - дверь открыта. Соответственно, формула алгоритмов:

Предусловие: Z
Какой-то алгоритм.
Постусловие: ~Z

подходит как для описания открытия, так и для описания закрытия двери. Или, как говорят, формула инвариантна относительно содержания действия, а её абстрактный смысл - измнение состояния системы на противоположное.

В нашем случае имеется:

Предусловие: Z и Y.
Шаги алгоритма.
Постусловие: дверь закрыта и ~Y.

Шаги алгоритма должны приводить к изменению состояния, описываемого исходным предусловием, чтобы получить окончательное постусловие.

Один шаг
Предусловие: Z
Постусловие: дверь закрыта
Если Y не упоминается, то для этого шага значение переменной не имеет значения.

Другой шаг
Предусловие: дверь открыта и Y
Постусловие: дверь открыта и ~Y.

Теперь попробуем сложить:

Предусловие: Z и Y
   Шаг 1, предусловие: Z
   Шаг 1, постусловие: дверь закрыта
   Шаг 2, предусловие: дверь открыта и Y
   Шаг 2, постусловие: дверь открыта и ~Y
Постусловие: дверь закрыта и ~Y

Как говорилось, в алгоритме каждое постусловие и следующее за ним предусловие не должны друг другу противоречить. Также не должны противоречить внешнее и первое вложенное предусловия, внешнее и последнее вложенное постусловия. Здесь это не соблюдается: постусловие шага 1 противоречит предусловию шага 2, постусловие шага 2 противоречит общему постусловию - значит нужно попробовать переставлять шаги, чтобы максимально уменьшить противоречия.

Предусловие: Z и Y
   Шаг 1, предусловие: дверь открыта и Y
   Шаг 1, постусловие: дверь открыта и ~Y
   Шаг 2, предусловие: Z
   Шаг 2, постусловие: дверь закрыта
Постусловие: дверь закрыта и ~Y

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

Предусловие: Z и Y
   Шаг 1, предусловие: Z
   Шаг 1, постусловие: дверь открыта
   Шаг 2, предусловие: дверь открыта и Y
   Шаг 2, постусловие: дверь открыта и ~Y
   Шаг 3, предусловие: Z
   Шаг 3, постусловие: дверь закрыта
Постусловие: дверь закрыта и ~Y

Теперь не осталось противоречий, и можно писать алгоритм. Но можно ещё обратить внимание, что постусловие шага 2 в части Z сильнее, чем предусловие шага 3. Если в конце шага 2 дверь гарантированно открыта, то в начале шага 3 она не может быть открытой или закрытой - она точно открыта. Поэтому мы смело можем усилить предусловие шага 3 и, как в самом начале говорилось, это приведёт к упрощению алгоритма на шаге 3.

Предусловие: Z и Y
   Шаг 1, предусловие: Z
   Шаг 1, постусловие: дверь открыта
   Шаг 2, предусловие: дверь открыта и Y
   Шаг 2, постусловие: дверь открыта и ~Y
   Шаг 3, предусловие: дверь открыта
   Шаг 3, постусловие: дверь закрыта
Постусловие: дверь закрыта и ~Y

Осталось только подставить нужные алгоритмы, которые, записанные в порядке следования, дадут нам общий алгоритм:

Шаг 1, алгоритм: ЕСЛИ дверь закрыта ТО открыть дверь КОНЕЦ ЕСЛИ
Шаг 2, алгоритм: посетитель входит (или посетитель выходит)
Шаг 3, алгоритм: закрыть дверь

Теперь алгоритм можно закодировать на языке C++. Условимся, что состояния описываются переменными (z и y) логического типа (bool), и константа true соответствует открытой двери и посетителю внутри. Договоримся описать алгоритм в отдельной функции, которой будем передавать ссылки на переменные (т.е. если функция будет менять значения переменных, это будет сказываться на других частях программы). Результата у функции нет (тип void). Назовём функцию "пройти" (go).

Вот это всё вышеперечисленно: пред- и постусловия, шаги алгоритма на русском языке, выбор способа кодирования - решения о том, как сказанное на русском языке, будет выражено в коде - вот это всё называется спецификацией. По ней можно совершенно точно написать требуемый участок кода:

Код: (C++)
void go(bool &y, bool &z)
{
   // Шаг 1
   if(!z)
   {
      z = true;
   }

   // Шаг 2
   y = !y;

   // Шаг 3
   z = false;
}

Естественно, хоть сколь-нибудь опытный программист в подавляющем большинстве случаев всё это не расписывает, и такие соображения и доводы приходят к нему автоматически. Начинающим же именно нужно попробовать так подробно порассуждать, пока у них не выработается соответствующий навык мышления.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #76 : 09-05-2010 15:35 » 

Dimka, Продолжение будет?
Начало

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
LELECHKA
Участник

by
Offline Offline
Пол: Женский

« Ответ #77 : 09-05-2010 16:23 » 


Dimka, можешь сбросить мой алгоритм.
Записан

Все можно познать, только не самого себя. (Стендаль)

Мудр не тот, кто знает много, а тот, чьи знания полезны. (Эсхил)

Победа над страхом придает нам силы. (Виктор Гюго)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #78 : 09-05-2010 16:32 » 

LELECHKA, мне это напоминает - ну напишите, дядечка!!!


Оффтоп!
Дядечка, здесь потратил не малый труд, чтоб довести до тебя свои знания, разжевал. Так может он еще и сам съест? Так ему вроде и не надо.


По делу. ( я со стороны постороннего наблюдателя)
Dimka, тебя просит элементарных вещей - рассказать СЛОВАМИ, что ты делаешь, без перехода на void  и прочие конструкции кода.



Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #79 : 09-05-2010 17:00 » 

Sla, продолжение - по обстоятельствам.

А про алгоритм ты не понял, поэтому зря к ней цепляешься. Речь шла про её алгоритм, который она мне в приват отправила. Я на него смотрел-смотрел, думал-думал и разразился Улыбаюсь Вот алгоритм, чтобы было понятно, о чём речь:

Цитата: LELECHKA
Я начну с удаления всех исполненных договоров, предшествующих заданной дате.

1. Открыть файл (в режиме “w+t”). Если попытка открыть файл была безуспешной, вывести сообщение об ошибке.
2. Определить позиции 2 записей: дата исполнения договора и дата оформления договора.
3. Сравнить 2 записи: дата оформления договора и дата исполнения договора.
Если дата исполнения договора=дате оформления, то договор считается исполненным.
Иначе вывести, что исполненных договоров нет.
3. Определить позицию исполненного договора.
4. Затем сравнить 2 следующие записи: дату исполненного договора с заданной датой.
Если дата исполненного договора<заданной, удалить все записи с исполненными       договорами.
Мне не очень нравится то, что я написала.
Я не понимаю, как обозначить исполненный договор? У меня почему-то напрашивается переменная и в то же время, мне кажется что это бессмысленно.
В файле может хранится информация о  нескольких покупателях, а не об одном, поэтому структура должна определятся не как Furniture furniture, а Furniture furniture [MAX], наверное.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #80 : 09-05-2010 17:11 » 

Я отцепился...

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

исполненный договор, насколько я поняла,это  когда дата исполнения=дате оформления

может вы уже выяснили принцип "исполненности" договора. Но...
А если поставить вопрос - удалить "такой-то" договор. Что изменится?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #81 : 10-05-2010 21:37 » 

В memorize:

Цитата: LELECHKA
Предусловие: файл открыт или закрыт/запись активна или удалена

Предусловие 1: файл открыт или закрыт
Алгоритм 1: ЕСЛИ файл закрыт ТО открыть файл КОНЕЦ ЕСЛИ
Постусловие 1: файл открыт

Предусловие 2: курсор находится на позиции какой-нибудь записи или в конце файла
Алгоритм 2: ЕСЛИ курсор находится на позиции какой-нибудь записи ТО прочитать структуру в позиции курсора и сдвинуть курсор к следующей записи КОНЕЦ ЕСЛИ
Постусловие 2: структура прочтена в позиции курсора

Предусловие 3: структура прочтена  в позиции курсора или курсор находится на позиции какой-нибудь записи
Алгоритм 3: ЕСЛИ структура прочтена в позиции курсора ТО записать структуру в позиции курсора и сдвинуть курсор к следующей записи КОНЕЦ ЕСЛИ
Постусловие 3: структура записана в позиции курсора

Предусловие 4: запись активна или удалена
Алгоритм 4: ЕСЛИ запись активна ТО извлечь дату исполнения договора и дату оформления договора КОНЕЦ ЕСЛИ
Постусловие 4: дата исполнения договора и дата оформления договора извлечены

Предусловие 5: дата исполнения договора <,>,= даты его оформления
Алгоритм 5: ЕСЛИ дата исполнения договора<даты оформления договора ТО извлечь дату исполнения договора КОНЕЦ ЕСЛИ
Постусловие 5: дата исполнения договора извлечена

Предусловие 6: дата исполнения договора (извлеченная) < или > заданной даты
Алгоритм 6: ЕСЛИ дата исполнения договора<заданной ТО удалить текущую запись и сдвинуть курсор на указанную позицию КОНЕЦ ЕСЛИ
Постусловие 6: запись удалена

Постусловие: файл закрыт и запись удалена

Я не уверена в правильности алгоритма 6: прежде, чем удалять запись наверное необходимо узнать позицию курсора, ведь он может находиться не именно в этом месте.
Подчеркнуто то, в чем я не уверена.

Sla, видишь, на лету схватывает! Нет проблем с логичностью, нет проблем с техникой, есть проблема с целеполаганием и предметной областью.

P.S. Но оригинальное мышление, чёрт побери Улыбаюсь Однажды я слышал мнение, что первым языком программирования лучше брать Prolog - тогда мне эта идея показалась не очень хорошей. Но в данном случае это именно то, что нужно - там целеполагание в чистом виде. Жаль, что придётся оставаться с C++. Попробую развивать тему пред- и постусловий, раз так хорошо пошло.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #82 : 13-05-2010 12:31 » 

Вести с невидимого фронта и результаты незримых боёв Улыбаюсь

Попробовали определиться с понятиями файла, позиции в файле и текущей позиции (курсора), записи, поля. А также разобраться с разницей между диском и памятью, почему и в каких случаях нужно копировать данные между памятью и диском. Ещё раз отдельно разобрали, что удалённая запись - это не "дырка в файле" и не "вынутая из колоды карта", а по-прежнему существующая запись, имеющая заранее условленную пометку об удалении, например, пустую строку в имени покупателя.

Последний вариант:
Цитата: LELECHKA
Предусловие: файл открыт или закрыт/запись активна или удалена

Предусловие 1: файл открыт или закрыт
Алгоритм 1: ЕСЛИ файл закрыт ТО открыть файл КОНЕЦ ЕСЛИ
Постусловие 1: файл открыт

Предусловие 2: курсор находится на позиции какой-нибудь записи или в конце файла
Алгоритм 2: ЕСЛИ курсор находится на позиции какой-нибудь записи ТО прочитать структуру в позиции курсора и сдвинуть курсор к следующей записи КОНЕЦ ЕСЛИ
Постусловие 2: структура прочтена в позиции курсора

Предусловие 3: структура прочтена  в позиции курсора или курсор находится на позиции какой-нибудь записи
Алгоритм 3: ЕСЛИ структура прочтена в позиции курсора ТО сохранить структуру в позиции курсора и сдвинуть курсор к следующей записи КОНЕЦ ЕСЛИ
Постусловие 3: структура сохранена в позиции курсора

Предусловие 4: запись активна или удалена
Алгоритм 4: ЕСЛИ запись активна ТО извлечь дату исполнения договора и дату оформления договора КОНЕЦ ЕСЛИ
Постусловие 4: дата исполнения договора и дата оформления договора извлечены

Предусловие 5: дата исполнения договора <,>,= даты его оформления
Алгоритм 5: ЕСЛИ дата исполнения договора<даты оформления договора ТО скопировать дату исполнения договора КОНЕЦ ЕСЛИ
Постусловие 5: дата исполнения договора сохранена

Предусловие 6: дата исполнения договора < или > заданной даты
Алгоритм 6: ЕСЛИ дата исполнения договора<заданной ТО удалить текущую запись и сдвинуть курсор на указанную позицию КОНЕЦ ЕСЛИ
Постусловие 6: запись удалена

Постусловие: файл закрыт и запись удалена
Здесь почти нет перемен, но надеюсь, разобравшись с понятиями, можно перейти к целеполаганию, подчинению логики действий общему замыслу задачи.

Поэтому будем двигаться дальше:

Дополнение к лекции

Выше говорилось, что алгоритм должен изменять состояние системы, и вся тройка - предусловие, алгоритм и постусловие - связывается между собой воедино через состояние: предусловие описывает, каково всё в начале, до выполнения алгоритма; алгоритм описывает, что делается, чтобы состояние изменилось; постусловие описывает, как изменилось состояние в конце, после выполнения алгоритма.

Рассмотрим два примера:

Пример 1.
Предусловие: дверь закрыта.
Алгоритм: открыть дверь.
Постусловие: дверь открыта.

Пример 2:
Предусловие: дверь закрыта или открыта
Алгоритм: ЕСЛИ дверь закрыта ТО открыть дверь, посетитель выходит КОН
Постусловие: посетитель снаружи

В обоих примерах предусловие, алгоритм и постусловие не противоречат друг другу. И отсутствие таких противоречий необходимо для правильного алгоритма, но этого мало.

В первом примере:
- все три части относятся к одному и тому же объекту (двери),
- пред- и постусловия описывают одни и те же свойства объекта (её закрытость).
Ни в алгоритме, ни в постусловии, с одной стороны, не появляется ни новых объектов, ни новых свойств этих объектов, с другой стороны, не теряются ни существующие объекты, ни их свойства. Именно поэтому все части первого примера не просто не противоречат друг другу, но и взаимно увязаны между собой через одни и те же свойства одних и тех же объектов, являются составными частями общего описания ситуации.

Во втором примере такого не наблюдается.
- В начале в предусловии речь идёт об объекте "дверь" и свойстве этого объекта "закрытость".
- В алгоритме появляется новый объект "посетитель", но непонятно, о каком его свойстве идёт речь.
- Наконец, в постусловии становится понятно, о каком свойстве посетителя говорится - о его "местоположении", однако при этом куда-то теряется объект "дверь" с её свойством "закрытости".
Здесь не хватает предусловия о том, что посетитель находится внутри (алгоритм может оказаться ошибочным). Здесь не хватает постусловия о состоянии двери, хотя над дверью совершается действие - теряется информация. Потеря информации означает, что другой алгоритм, который должен согласовывать своё предусловие с постусловием данного примера, может оказаться либо ошибочным, либо излишне сложным.

Как это исправить? Договоримся в самом начале перечислять объекты и их свойства, которые используются в предусловии, и затем проверять, что в алгоритме и постусловии не появились новые и не исчезали имеющиеся в списке объекты и свойства. Перепишем примеры:

Пример 1.
Объекты(свойства): дверь(закрытость)
Предусловие: дверь закрыта
Алгоритм: открыть дверь
Постусловие: дверь открыта

Не изменилось.

Пример 2:
Объекты(свойства): дверь(закрытость), посетитель(местоположение)
Предусловие: дверь закрыта или открыта и посетитель внутри
Алгоритм: ЕСЛИ дверь закрыта ТО открыть дверь, посетитель выходит КОН
Постусловие: дверь открыта и посетитель снаружи

Добавили существенные элементы в пред- и постусловие.
« Последнее редактирование: 13-05-2010 12:33 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #83 : 13-05-2010 13:17 » 

Нечестно!!!
Мы бы вам не мешали...
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #84 : 13-05-2010 18:32 » 

Цитата: LELECHKA
Предусловие: файл открыт или закрыт/запись активна или удалена

Предусловие 1: файл открыт или закрыт
Алгоритм 1: ЕСЛИ файл закрыт ТО открыть файл КОНЕЦ ЕСЛИ
Постусловие 1: файл открыт

Предусловие 2: курсор находится на позиции какой-нибудь записи или в конце файла
Алгоритм 2: ЕСЛИ курсор находится на позиции какой-нибудь записи ТО прочитать структуру в позиции курсора и сдвинуть курсор к следующей записи КОНЕЦ ЕСЛИ
Постусловие 2: структура прочтена в позиции курсора

Предусловие 3: структура прочтена или сохранена в позиции курсора и курсор находится на позиции какой-нибудь записи
Алгоритм 3: ЕСЛИ структура прочтена в позиции курсора ТО сохранить структуру в позиции курсора и сдвинуть курсор к следующей записи КОНЕЦ ЕСЛИ
Постусловие 3: структура сохранена в позиции курсора и курсор находится на позиции какой-нибудь записи

Предусловие 4: запись активна или удалена
Алгоритм 4: ЕСЛИ запись активна ТО извлечь дату исполнения договора и дату оформления договора КОНЕЦ ЕСЛИ
Постусловие 4: дата исполнения договора и дата оформления договора извлечены

Предусловие 5: дата исполнения договора <,>,= даты его оформления
Алгоритм 5: ЕСЛИ дата исполнения договора<даты оформления договора ТО сохранить дату исполнения договора КОНЕЦ ЕСЛИ
Постусловие 5: дата исполнения договора сохранена

Предусловие 6: дата исполнения договора < или > заданной даты и запись активна
Алгоритм 6: ЕСЛИ  дата исполнения договора<заданной удалить текущую запись и сдвинуть курсор к следующей записи КОНЕЦ ЕСЛИ
Постусловие 6: записи удалены

Постусловие: записи об исполненных договорах удалены и файл закрыт


В алгоритме №6, может нужен цикл,  напишу как я понимаю: если дата исполнения договора<заданной даты, удалять текущие записи до тех пор,  пока все записи, соответствующие условию не будут удалены. Соответственно в Постусловие 6 будет написано: записи удалены. Но оно мне все равно не нравится.
Про цикл ты догадываешься правильно. Но, когда я тебе говорил, что поправить, я специально подчеркнул, что множество записей и одна запись - это разные объекты.

И кроме того, я просил выписывать объекты и их свойства явным образом - этого ты пока не сделала.

Смотрим на самый верхний уровень:

Предусловие: файл открыт или закрыт/запись активна или удалена
Постусловие: записи об исполненных договорах удалены и файл закрыт

Какие тут объекты и их свойства?
« Последнее редактирование: 13-05-2010 18:37 от Sla » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #85 : 14-05-2010 20:34 » 

Цитата: LELECHKA
Объекты (свойства):  ФАЙЛ (открытость) / СТРУКТУРА ( …)
Предусловие: файл открыт или закрыт/записи об исполненных договорах активны или удалены

Объекты (свойства):  ФАЙЛ (открытость)
Предусловие 1: файл открыт или закрыт
Алгоритм 1: ЕСЛИ файл закрыт ТО открыть файл КОНЕЦ ЕСЛИ
Постусловие 1: файл открыт

Объекты (свойства):  КУРСОР (местоположение) / СТРУКТУРА (…)
Предусловие 2: курсор находится на позиции какой-нибудь записи или в конце файла
Алгоритм 2: ЕСЛИ курсор находится на позиции какой-нибудь записи ТО прочитать структуру в позиции курсора и сдвинуть курсор к следующей записи КОНЕЦ ЕСЛИ
Постусловие 2: структура прочтена в позиции курсора,  курсор находится на позиции какой-нибудь записи

Объекты (свойства):  КУРСОР (местоположение) / СТРУКТУРА (…)
Предусловие 3: структура прочтена или сохранена в позиции курсора и курсор находится на позиции какой-нибудь записи
Алгоритм 3: ЕСЛИ структура прочтена в позиции курсора ТО сохранить структуру в позиции курсора и сдвинуть курсор к следующей записи КОНЕЦ ЕСЛИ
Постусловие 3: структура сохранена в позиции курсора  и курсор находится на позиции какой-нибудь записи

Объекты (свойства):  ЗАПИСЬ (…) / ДАТА (…)
Предусловие 4: запись активна или удалена
Алгоритм 4: ЕСЛИ запись активна ТО извлечь дату исполнения договора и дату оформления договора КОНЕЦ ЕСЛИ
Постусловие 4: дата исполнения договора и дата оформления договора извлечены

Объекты (свойства):  ДАТА (…)
Предусловие 5: дата исполнения договора <,>,= даты его оформления
Алгоритм 5: ЕСЛИ дата исполнения договора<даты оформления договора ТО сохранить дату исполнения договора КОНЕЦ ЕСЛИ
Постусловие 5: дата исполнения договора сохранена

Объекты (свойства):  ДАТА (…) / СТРУКТУРА (…)
Предусловие 6: дата исполнения договора < или > заданной даты
Алгоритм 6: ЕСЛИ  дата исполнения договора<заданной ТО удалять текущие записи до тех пор, пока все записи, соответствующие условию, не будут удалены КОНЕЦ ЕСЛИ
Постусловие 6: записи удалены


Постусловие: записи об исполненных договорах удалены и файл закрыт


Там, где я не могу сформулировать свойства, я ставила многоточие. Изменения я подчеркивала.
Я все еще путаюсь, где у меня 2 объекта, а где один.

Например:


Объекты (свойства):  СТРУКТУРА (…) / ДАТА (…)
Предусловие 4: запись активна или удалена, даты не извлечены
Алгоритм 4: ЕСЛИ запись активна ТО извлечь дату исполнения договора и дату оформления договора КОНЕЦ ЕСЛИ
Постусловие 4: запись активна, дата исполнения договора и дата оформления договора извлечены


Объекты (свойства):  ДАТА (…) / СТРУКТУРА (…)
Предусловие 6: дата исполнения договора < или > заданной даты, запись активна
Алгоритм 6: ЕСЛИ  дата исполнения договора<заданной ТО удалять текущие записи до тех пор, пока все записи, соответствующие условию, не будут удалены КОНЕЦ ЕСЛИ
Постусловие 6: дата исполнения договора < заданной даты, записи удалены

Можно так оставить?
Можно считать, что запись и поле записи - это разные объекты. Но с одной оговоркой. Если меняется значение поля, то, соответственно, меняется и содержание записи (так как поле находится внутри записи, является составной частью записи).


В пункте 5 ты куда-то сохраняешь дату. Куда? И вообще, как я говорил, чтение происходит откуда-то (например, из файла) куда-то (например, в переменную) - в этом случае нужно завести вспомогательную переменную. Тогда результат прочтения будет относиться не к записи ("запись прочтена"), а к содержанию файла в позиции курса и переменной. Текущая запись в файле будет содержать ту же информацию, что и запись в переменной, и именно это тождество информации - лучшее свидетельство успешного прочтения. Аналогично с сохранением, только в обратную сторону. В пункте 4 у тебя фигурируют и поле, и запись, в пункте 5 остаётся одно поле, но при этом операция сохранения "подвисает".

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

Ещё у меня сохраняется стойкое подозрение к тому, что слова "запись" и "структура" тебе кажутся чем-то разным, хотя я уже дважды говорил, что это одно и то же, и во избежание путаницы настоятельно посоветовал выбрать и использовать какое-нибудь одно слово.

Используй переменные - это хорошие объекты для пред- и постусловий.


Посмотри внимательно на пункт 2. Есть одно замечательное правило: на всякое ЕСЛИ-ТО существует ИНАЧЕ. Т.е. можно так записать:

Предусловие 2: курсор находится на позиции какой-нибудь записи или в конце файла
Алгоритм 2: ЕСЛИ курсор находится на позиции какой-нибудь записи ТО прочитать структуру в позиции курсора и сдвинуть курсор к следующей записи ИНАЧЕ ничего не делать КОН

Т.е. при наличии ЕСЛИ всегда возможны два варианта развития событий. В твоём случае при одном из вариантов ничего не меняется. Постусловие должно подходить для обоих вариантов одновременно. Подумай над своимими постусловиями 2, 3, 4 и 5.


Наконец, по поводу цикла... Я пока не знаю, как к нему тебя подвести, так как ещё не всё разобрано с пред- и постусловиями. Поэтому сделаем иначе. Сначала опишем вспомогательный алгоритм удаления одной записи, а потом будем им пользоваться, когда будем писать цикл.

Объекты: файл(открытость), курсор(местоположение), запись(активность)
Предусловие: файл открыт, курсор находится в позиции записи, запись активна
Вспомогательный алгоритм 1: ?
Постусловие: файл открыт, курсор находится в позиции записи или в конце файла, запись активна или удалена

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


P.S. Складывается впечатление, что происходит информационная перегрузка. Много мелких деталей - в них происходит путаница. И всё из-за того, что отсутствует видение общей цели и стремления к ней. Вместо самостоятельного устремления к получению результата, при котором мелкие вопросы "отваливаются" сами собой, получается, что я будто ставлю рогатки и подпорки - лишь бы удержать движение в нужном направлении, а без этого всё расползается во все стороны. Над этим мне нужно подумать и искать новый подход...
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #86 : 18-05-2010 21:03 » 

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

Всем известны так называемые блок-схемы алгоритмов. Они позволяют визуализировать управляющие конструкции (условия, циклы), но совершенно беспомощны при необходимости обозначить состояния.

В UML известна Activity Diagram, позволяющая довольно много: обозначить участвующие в алгоритме объекты и показать, какие действия с какими объектами выполняются, обозначить состояния данных между шагами алгоритма. Недостаток её в том, что, во-первых, нужно изучать её графическую нотацию, во-вторых, в ней сложно показать состояние всей системы.

В стародавние времена, когда компьютеры были большими, и на сеанс работы с машиной нужно было записываться за несколько дней, программисты писали и отлаживали программы на бумажке. Для этого использовались специальные трассировочные таблицы, в которых шаг за шагом выписывались значения переменных в процессе исполнения алгоритма. В этих таблицах можно показать и объекты с их интересующими нас свойствами (по столбцам) и увидеть состояние всей системы на каждом шаге (по строкам).

Предлагаю за основу взять трассировочную таблицу и расширить её возможностями Activity Diagram.

Например, вывод содержимого файла на экран можно описать так:



В начале идёт заголовок. В первой строке идут названия объектов. Во второй строке - под каждым объектом один или несколько столбцов его свойств.

Затем идёт основное тело таблицы, где по строкам показывается течение времени при исполнении алгоритма (сверху вниз). В основном теле таблицы используются следующие два нехитрых правила:
1) Строчки с указанием состояний и строчки с указанием действий строго чередуются. Строка состояния выше действия рассматривается как предусловие этого действия, строка состояния ниже действия рассматривается как постусловие этого действия. Первая и последняя строки таблицы всегда состояния.
2) В строчках состояний всегда заполняются все колонки. В строчках действий всегда заполняется только одна колонка (одно действие в один момент времени) и указывается порядковый номер действия во времени.

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

При написании циклов используется операция безусловного перехода вида [См. № N], где N - номер строки соответствующего действия. Переход всегда записывается в том столбце, в котором находится действие в строке N.

Для наглядности действия можно выделять, чтобы они не терялись на фоне состояний. Для циклов и условий можно пририсовывать стрелки.


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

Предлагаю разделить действия чтения/сохранения и перемещения курсора. По факту в функциях fread и fwrite они совмещены, но это обстоятельство мешает соблюдать принцип одного действия в один момент времени, так как затрагивает сразу многие свойства объектов. В предложенной схеме движение курсора и так меняет как позицию курсора, так и состояние текущей записи. Возможно я не очень хорошо продумал эту часть и можно изобрести какую-то объединяющую сущность... Буду рад предложениям на этот счёт.

P.S. Может будет удобнее составлять таблицу на бумаге от руки карандашом, тогда нужна будет фотография листа или скан.

* alg-tab.PNG (33.95 Кб - загружено 2789 раз.)
« Последнее редактирование: 18-05-2010 21:18 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: 1 2 3 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines