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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2017, 22:17   #1
ANGeL_TbMbI
Пользователь
 
Регистрация: 14.10.2017
Сообщений: 14
По умолчанию [C++] Добавление\удаление и сортировка структуры

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

Код:
#include<fstream.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<windows.h>
 
 
 
struct bd {int id;
          char fio[30];
          int pas;
          int got;
          char tgot[6];
          int vart;} s[200];
 
 
void kol();
 
 
void main()
{
kol();
}
 
 
void kol()
{  char c[30];
  int k=0;
  int vop;
  ifstream f("DAT1.TXT");
  cout<<"Ñîäåðæèìîå ГґГ*éëГ* "<<"DAT1.TXT"<<endl;
  f>>k;
  for(int i=0;i<k;i++){
    f>>s[i].id>>s[i].fio>>s[i].pas>>s[i].got>>s[i].tgot>>s[i].vart;
  }
cout<<"___________________________________________________________________";
cout<<"\n |ID |Name                          |Pasport|Nomer|Type   |Vartist|";
cout<<"\n |===|==============================|=======|=====|=======|=======|";
 
for(int i=0;i<k;i++){
    printf("\n |%3d|%30s|%7d|%5d|%7s|%7d|",s[i].id,s[i].fio,s[i].pas,s[i].got,s[i].tgot, s[i].vart) ;
    cout<<"\n |---|------------------------------|-------|-----|-------|-------";
}
  f.close();
 
     //vibor
 
    if( printf( "\nAdd zapis [1] " ))
    {
 
}
 
   if(   printf( "\nDelete zapis [2]" ))
   {
 
    }
 
    if( printf( "\nSort AVG [3] " ))
    {
 
}
 
    if( printf( "\nSort DEC [4] " ))
    {
       scanf( "%d", &vop );
}
 
    if ( vop == 1 ) {
 
        printf ("Add zapis : \n" );
 
 
        _getch();
    }
 
    else if ( vop == 2 ) {
        printf( "Delete zapis : \n" );
    }
 
          else if ( vop == 3 ) {
        printf( "Sortirovka AVG : \n" );
    }
 
    else if ( vop == 4 ) {
        printf( "Sortirovka DEC : \n" );
    }
 
    else {
       printf( "vvedite odin iz variantov\n" );
    }
 
 
  _getch(); //âîçâðГ*Г№Г*åìîå Г§Г*Г*Г·ГҐГ*ГЁГҐ ГґГіГ*êöèè
}
ANGeL_TbMbI вне форума Ответить с цитированием
Старый 03.11.2017, 01:55   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

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

Я встречал, на этом форуме, что люди по разному это реализовывали.
Ну вот, набросал один из вариантов такого меню (обрати внимание, что пункты меню идут не жёстко как у тебя,
а "гибкие" - т.е. пользователь может выбрать любой пункт меню и в абсолютно любой последовательности):

Код:
#include <iostream>
#include <iomanip>
#include <stdio.h>

using namespace std;

struct automobil
{
	int id;
	char fio[30];
	int pas;
	int got;
	char tgot[6];
	int vart;
} s[100];

int k = 0;


void Prosmotr_vsey_BD();
void dobavit_sapiz();
void ochistit_BD();

int main()
{
	k = 4;
	s[0].id = 111; s[0].got = 2005; s[0].pas = 1101; s[0].vart = 654;   strcpy(s[0].fio,"Kotov I.P.");  strcpy(s[0].tgot, "sentabr");
	s[1].id = 123; s[1].got = 1997; s[1].pas = 1391; s[1].vart = 650;   strcpy(s[1].fio, "Bobo S.O.");  strcpy(s[1].tgot, "sentabr");
	s[2].id = 203; s[2].got = 1999; s[2].pas = 2380; s[2].vart = 250;   strcpy(s[2].fio, "Ivanov O.O.");  strcpy(s[2].tgot, "october");
	s[3].id = 100; s[3].got = 1990; s[3].pas = 1702; s[3].vart = 650;   strcpy(s[3].fio, "Turova O.N.");  strcpy(s[3].tgot, "janvar ");
	
	int vibor = 7;
	while (1)
	{
		if ((1 <= vibor && vibor <= 2) || (4 <= vibor && vibor <= 8) || (vibor == 31) || (vibor == 32) || (vibor == 33))
		{
			if (vibor == 1)
			{
				;
			}
			if (vibor == 2)
			{
				Prosmotr_vsey_BD();
			}
			if (vibor == 31)
			{
				dobavit_sapiz();
			}
			if (vibor == 32)
			{
				;	
			}
			if (vibor == 33)
			{
				ochistit_BD();	
			}
			if (vibor == 4)
			{
				;
			}
			if (vibor == 5)
			{
				;
			}
			if (vibor == 6)
			{
				;
			}
			if (vibor == 7)
			{
				system("cls");
				cout << " MENU:\n";
				cout << "  1.Vvod BD iz file:\n";
				cout << "  2.Prosmotr vsey BD\n";
				cout << "  3.Redactirovanie BD:\n";
				cout << "    31.dobavit sapiz\n";
				cout << "    32.udalit sapiz\n";
				cout << "    33.ochistit BD\n";			
				cout << "  4.Sortirovka AVG:\n";
				cout << "  5.Sortirovka DEC:\n";
				cout << "  6.Vuvod BD v file:\n";
				cout << "  7.Clear consol\n";
				cout << "  8.Exit\n\n";
			}
			if (vibor == 8)
			{
				break;
			}
		}
		else
		{
			cout << "ERROR! \n\n";
		}
		cout << "vibor ";
		cin >> vibor;
	}
	return 0;
}

void Prosmotr_vsey_BD()
{
	if (k == 0)
	{
		cout << "Net sapisey v BD\n\n";
		return;
	}
	else
	{
		cout << "====|===============|=======|=====|========|=====|";
		cout << "\n ID |      Name     |Pasport|Nomer| Type   |Cost |";
		cout << "\n====|===============|=======|=====|========|=====|";
		cout << "\n";
		for (int i = 0; i < k; i++)
		{
			cout << " " << s[i].id << "| " << setw(14) << s[i].fio << "|  " << s[i].pas << " | " << s[i].got << "| " << setw(5) << s[i].tgot << "| " << s[i].vart << " |\n";		
		}
		cout << "====|===============|=======|=====|========|=====|";
		cout << "\n\n";
	}
}

void dobavit_sapiz()
{
	cout << "=======================\n";
	cout << " ID: ";      cin >> s[k].id;
	cout << " Name: \n"; 
	cout << " Pasport: "; cin >> s[k].pas;
	cout << " Nomer: ";   cin >> s[k].got;
	cout << " Type: \n";    
	cout << " Cost: ";    cin >> s[k].vart;
	cout << "=======================";
	cout << "\n\n";
	k = k + 1;
}

void ochistit_BD()
{
	k = 0;
	cout << "BD ydalena! \n\n";
}
Должно получится что то вроде такого (выбираю п.меню "2" и отображаются данные):

0.jpg

В принципе можно было бы выбрать этот пункт и без данных, - в этом случае предусмотрена надпись: "в БД нет записей!":

22.jpg

Чтобы выйти из программы - нужно выбрать пункт меню "8".

Возьми поиграйся/по разбирайся с программой. Сейчас работает п.меню "2", "31", "33", "7", "8". Вводи как нормальные, так и явно ошибочные данные, - чтобы протестировать насколько программа устойчива.

___________________________________ ________________________
Пару слов о добавлении записи (п.меню "31"): я забыл как в С++ с консоли считать текст, поэтому поля "fio" и "tgot" я не заполняю. Т.е.:


1.jpg


Возьми доделай этот пункт.
___________________________________ ______________________

В принципе ты можешь уже сделать пункт "1", - всё у тебя есть (из твоего кода).
При этом удали мои (временные) данные-заглушки (они больше не нужны - раз ты забацаешь "ввод из файла"):
Код:
	k = 4;
	s[0].id = 111; s[0].got = 2005; s[0].pas = 1101; s[0].vart = 654;   strcpy(s[0].fio,"Kotov I.P.");  strcpy(s[0].tgot, "sentabr");
	s[1].id = 123; s[1].got = 1997; s[1].pas = 1391; s[1].vart = 650;   strcpy(s[1].fio, "Bobo S.O.");  strcpy(s[1].tgot, "sentabr");
	s[2].id = 203; s[2].got = 1999; s[2].pas = 2380; s[2].vart = 250;   strcpy(s[2].fio, "Ivanov O.O.");  strcpy(s[2].tgot, "october");
	s[3].id = 100; s[3].got = 1990; s[3].pas = 1702; s[3].vart = 650;   strcpy(s[3].fio, "Turova O.N.");  strcpy(s[3].tgot, "janvar ");
Т.е. логика работы этого пункта такая: пользователь выбирает п.м.1 и происходит считывание данных из файла в память компьютера, но они при этом не выводится на экран.
Разве что может быть выведено только уведомление: "БД считана нормально. Столько-то... записей" (или наоборот "Произошла ошибка при открытии файла" - если такое будет иметь место).

А чтобы посмотреть данные на экране нужно будет выбрать п.м.2.

___________________________________ ____________
Раз ты смог сделать п.меню "1", то и сможешь и п.меню "6" сделать.
В принципе это одно и тоже: поток ввода, в первом случае, направляется из файла, а во втором - в файл.

Только всё должно быть органично!
Т.е. я выбираю чтение из файла, а потом - добавить пару записей, а потом - запись в файл, а потом - снова считать ...
(комбинация может быть какой-угодно)
и никаких багов, ошибок и вылетов программы.
___________________________________ ____________

p.s.1: мне не понято, что значит "добавление, удаление строк из файла", ведь считывание из файла уже произошло и он закрыт? ...
Я так понимаю ,что все "добавление, удаление" осуществляются в оперативной памяти компьютера, а в файл уже пишется (корректней сказать "перезаписывается") конечный результат
(для этого у меня предусмотрен п.меню "6").

p.s.2: поищи на форуме задачи/решения на подобие.

p.s.3: расскажи, что понимаешь и что сделал по тому что я писал.

Последний раз редактировалось ura_111; 03.11.2017 в 06:04.
ura_111 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает добавление структуры в массив структур. ZerbsCooper Общие вопросы C/C++ 9 27.11.2015 10:10
Удаление из структуры MyLifeStyle Общие вопросы C/C++ 0 29.04.2014 21:02
Сортировка и поиск, Добавление и удаление записей в выборке из 6 разных таблиц студентка_диплом БД в Delphi 7 07.04.2012 21:37
Удаление(добавление) поля из(в) структуры kilgoreq Помощь студентам 0 22.02.2011 00:59
Удаление/добавление на С++. Serror Фриланс 6 21.10.2009 09:35