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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2009, 01:55   #1
max382
Пользователь
 
Регистрация: 15.04.2009
Сообщений: 14
По умолчанию [C++] Работа со структурами...

Всем привет! Пишу сюда, так как немогу реализовать задумку...

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

Есть задание:
Разработка способа сбора и сортировки сведений.
1) Занести данные в файл
2) При необходимости вывести все
3) Добавлять записи
4) Сортировать
5) Нужно уметь удалять ненужные записи

Код:
#include<iostream.h>
#include<stdio.h>
   main()
{ int i,UKAZ;
 struct telev
  {
    char firma[30];
    char name[20];
    int diagonal;
    char tip[10];
    float stoimost;
  };
   telev rec[20];
   FILE *dikop;
 cout<<"\n 1 - Zapolnenie dannih \n";
 cout<<"\n 2 - Zagruzka dannih iz faila \n\n  ";
 cin>>UKAZ;
   if (UKAZ==1)
   { 
     dikop=fopen("DATA.DAT","w");
      for (i=0;i<10;i++)
       {
	 cout<<"\n Nazvanie Firmi ";
	 cin>>rec[i].firma;
	 cout<<"\n Marka televizora ";
	 cin>>rec[i].name;
	 cout<<"\n Razmer diagonali ";
	 cin>>rec[i].diagonal;
	 cout<<"\n Tip televizora ";
	 cin>>rec[i].tip;
	 cout<<"\n Stoimost ";
	 cin>>rec[i].stoimost;
    fwrite (&rec[i], sizeof(rec[i]),1,dikop);
    cout<<"_________________________________________ \n";
       }
   }
  if (UKAZ==2)
   {
     dikop=fopen("DATA.DAT","r");
      for (i=0;i<20;i++)
       {
        fread (&rec[i],sizeof(rec[i]),1,dikop);
               printf("\n Nazvanie firmi %s \n",rec[i].firma);
	   printf("\n Marka televizora %s \n",rec[i].name);
	   printf("\n Razmer diagonali %i \n",rec[i].diagonal);
	   printf("\n Tip televizora %s \n",rec[i].tip);
	   printf("\n Stoimost %.1f \n",rec[i].stoimost);
               printf("\n ______________________________________ \n");
       }
   }
 fclose(dikop);
}
В выше приведенном коде я вроде как сделал первые 2 пункта...
Дальше же у меня проблема:
Пункт номер 3) - я в 1) пункте добавляю заранее 10 пунктов, и после этого мне нужно будет как то добавлять еще при необходимости, но не затрагивая предыдущие 10, но у меня получается опять запись в файл по новой с i=0... Я думал над тем чтобы в первом месте где идет цикл for внутри поставить i=10 сразу, но тогда получится я не смогу вводить данные после второго раза, потому что будут затрагиватся записи уже после первого добавления... (т.е. i=11, i=12 и т.д. будут перезаписыватся, а мне этого не надо T_T)

Пункт 4) - я вроде понимаю что это нужно делать методом пузырька, и постараюсь осилить этот пункт сам, но если не смогу, то отпишу сюда и надеюсь вы подскажете ^_^

Пункт 5) - тут у меня почему то нету идей, можете намекнуть хотябы на способ удаления записей?

Последний раз редактировалось max382; 24.04.2009 в 01:59.
max382 вне форума Ответить с цитированием
Старый 24.04.2009, 10:22   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

3) используйте switch и while

Код:
while(1)
{
    cout<<"\n 1 - Zapolnenie dannih \n";
    cout<<"\n 2 - Zagruzka dannih iz faila \n";
    cout<<"\n 2 - Vichod iz programmy\n\n";
    cin>>UKAZ;
   
     switch(UKAZ)
    {
        case 1: // добавляем
        case 2: // вывод всего
        case 3: // выход из программы
    }
}
и еще :
в данном случае лучше использовать динамическией список (очередь).
В начале работы программы нужно считать все данные из файла в очередь, а затем уже добавлять или удалять записи из очереди. В конце - перезаписать файл.

Последний раз редактировалось counter; 24.04.2009 в 10:25.
counter вне форума Ответить с цитированием
Старый 24.04.2009, 12:03   #3
max382
Пользователь
 
Регистрация: 15.04.2009
Сообщений: 14
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
3) используйте switch и while
и еще :
в данном случае лучше использовать динамическией список (очередь).
В начале работы программы нужно считать все данные из файла в очередь, а затем уже добавлять или удалять записи из очереди. В конце - перезаписать файл.
Эммм, а это как? Просто я еще не сталкивался с таким понятием...
max382 вне форума Ответить с цитированием
Старый 24.04.2009, 13:39   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Эммм, а это как?
как-то так
counter вне форума Ответить с цитированием
Старый 24.04.2009, 23:41   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

у меня такое получилось

Код:
#include<iostream>
#include<conio.h>

using namespace std;

void  main()
{
  int i,UKAZ;
  int count=0;

  struct telev
  {
    char firma[30];
    char name[20];
    int diagonal;
    char tip[10];
    float stoimost;
  };

  telev rec[256];

	FILE *dikop;
	dikop=fopen("DATA.DAT","r");
	if(!dikop) // если файла нет
	{
		cout<<"Create new file!\n\n";
		_getch();
	}
           // если есть - то читаем его и данные заносим в массив
	else { 
	fread (&count,sizeof(count),1,dikop);
    for (i=0;i<count;i++)
    {
       fread (&rec[i],sizeof(rec[i]),1,dikop);
	}
	fclose(dikop);}
  
 while(1) {
 cout<<"\n 1 - Zapolnenie dannih \n";
 cout<<"\n 2 - Vivod vsego \n";
 cout<<"\n 3 - Exit\n\n";
 cin>>UKAZ;
 switch(UKAZ) {
  case 1:
	  if(count>255)
	  {
		  cout<<"\nNelzya dobavit' zapis'!\n\n";
	  }
	  else
   {    
	 cout<<"\n Nazvanie Firmi  > ";
	 cin>>rec[count].firma;
	 cout<<"\n Marka televizora  > ";
	 cin>>rec[count].name;
	 cout<<"\n Razmer diagonali  > ";
	 cin>>rec[count].diagonal;
	 cout<<"\n Tip televizora  > ";
	 cin>>rec[count].tip;
	 cout<<"\n Stoimost  > ";
	 cin>>rec[count].stoimost;
     cout<<"_________________________________________ \n";
	 count++;    
   }break;

  case 2:
   {
	  if(count>0){
      for (i=0;i<count;i++)
      {
       printf("\n Nazvanie firmi - %s \n",rec[i].firma);
	   printf("\n Marka televizora - %s \n",rec[i].name);
	   printf("\n Razmer diagonali - %i \n",rec[i].diagonal);
	   printf("\n Tip televizora - %s \n",rec[i].tip);
	   printf("\n Stoimost - %.1f \n",rec[i].stoimost);
       printf("\n ______________________________________ \n");
       }
	  }
	  else
	  {
		  cout<<"\n\nNet dannich!\n";
	  }
   }break;
  case 3: dikop=fopen("DATA.DAT","w+"); // перезаписываем файл
	      fwrite (&count, sizeof(count),1,dikop);
	      for(int i=0;i<count;i++)
		  {
			   fwrite (&rec[i], sizeof(rec[i]),1,dikop);
		  }
		  fclose(dikop);
	      exit(0);
 }
 } 
}
использовал статический массив, добавить более 255 записей будет невозможно

Последний раз редактировалось counter; 24.04.2009 в 23:45.
counter вне форума Ответить с цитированием
Старый 25.04.2009, 00:40   #6
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

Ребятки, а че это вы тут намутили? Используй двусвязный список и не заморачивайся (5 пункт сразу отпадет).

Пример
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 25.04.2009, 10:12   #7
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

SunKnight, человек еще не знает списков
counter вне форума Ответить с цитированием
Старый 26.04.2009, 15:29   #8
max382
Пользователь
 
Регистрация: 15.04.2009
Сообщений: 14
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
использовал статический массив, добавить более 255 записей будет невозможно
Спасибо за советы и ссылку, щас думаю как сделать...

Ваша программа почему то выдала 2 ошибки:
using namespace std; (что это такое я не знаю) и еще какая то проблемы с exit(0);

Попробывал убрать эти 2 строки, запустил программу, нажал "1" ввел первое название и произошло зацикливание... Программа начала подряд вводить одно и тоже название как я понял...

Насчет ссылки про "очередь" - теоретически понял в чем суть, но как реализовать в моей программе как то идей не приходит T_T



Вот что я думаю:
1. Нужно как то организовать код, чтобы можно было добавлять записи поверх уже существующих.
2. В файле нужно как то помечать каждую запись.
3. Потом получившиеся записи в файле сортировать по какому то критерию.
4. Удалять записи с помощью тех пометок в пункте 2)
Вот такой вот план действия, но опыта нехватает и знаний чтобы его реализовать...
T_T переделываю код уже 2 дня, но результаты все равно не те... У кого нить есть еще идеи? ПОтому что один мне кажется не справлюсь T_T

Последний раз редактировалось max382; 26.04.2009 в 16:22.
max382 вне форума Ответить с цитированием
Старый 29.04.2009, 22:53   #9
max382
Пользователь
 
Регистрация: 15.04.2009
Сообщений: 14
По умолчанию

Решил я полностью переделать эту программу (мне подсказали как, и даже дали пример), но дело в том что все вроде сделал, а работать не хочет, пишет мне кучу просто ошибок, которые я вообще не понимаю T_T

Помогите кто нибудь посмотрите у себя на компиляторе у кого есть, файл прикреплю, там много текста очень но он не важен, то что отвечает за работу свмой программы - совсем чуть чуть...
Вложения
Тип файла: rar MyProg.rar (1.6 Кб, 18 просмотров)
max382 вне форума Ответить с цитированием
Старый 29.04.2009, 23:02   #10
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

а у вас какой компиль?

в VS просто нет функций типа clrscr
counter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с задачой со структурами на С++. Many man Помощь студентам 1 12.04.2009 11:45
работа со структурами - дерево Nostalgia Паскаль, Turbo Pascal, PascalABC.NET 0 24.03.2009 19:45
Работа с массивами и структурами (С/С++) Aliance Помощь студентам 3 28.10.2008 22:28
Помогите со структурами в Delphi profi Помощь студентам 2 24.08.2008 12:15
Проблема с модулями и дин.структурами данных velgelmina Помощь студентам 1 16.05.2007 06:43