Форум программистов, компьютерный форум CyberForum.ru

Нужно решение в c++ - C++

Восстановить пароль Регистрация
 
DireSleep
0 / 0 / 0
Регистрация: 15.05.2011
Сообщений: 8
24.06.2011, 06:58     Нужно решение в c++ #1
Уважаемые форумчани, помогите пожалуйста с задачей. Завтра нужно сдавать, у самого не получается..(
Заранее большое спасибо!!!
А. Создать файл, содержащий сведения о наличии билетов и рейсах, пункт назначениЯ, ВРЕМЯ ВЫЛЕТА,время прибытия, кол-во свободных мест в самолете. Количество записей- 25.
Б.Найти время отправления самолетов в город X, наличие свободных мест на рейс в городе X с временм отправления Y. Значение X, Y - вводятся по запросу с терминала.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2011, 06:58     Нужно решение в c++
Посмотрите здесь:

Нужно решение C++
C++ нужно решение
C++ Нужно решение
C++ Нужно решение!
C++ нужно решение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
24.06.2011, 09:48     Нужно решение в c++ #2
Цитата Сообщение от DireSleep Посмотреть сообщение
А. Создать файл, содержащий сведения о наличии билетов и рейсах, пункт назначениЯ, ВРЕМЯ ВЫЛЕТА,время прибытия, кол-во свободных мест в самолете. Количество записей- 25.
Б.Найти время отправления самолетов в город X, наличие свободных мест на рейс в городе X с временм отправления Y. Значение X, Y - вводятся по запросу с терминала.
Это типовая задача, не сомневаюсь, что где-то на форуме она уже есть. Еще я подзреваю, что у тебя есть методичка и в ней есть пример такого задания.
Короче
вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
/*#####################################################################################
#   База данных  по междугородним автобусным перевозкам. 
# Каждая запись состоит из следующих полей: место назначения (20 символов), 
# время отправления (часы, минуты), количество свободных мест, стоимость билета (руб.). 
# Написать функции сортировки базы по месту назначения, по времени отправления.
# Написать функцию определения свободных мест.
######################################################################################*/
 
#include <stdio.h>//думаю это комментировать не надо
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAXLEN 20  //определяем константу - макслимальная длина строки
//###############################################################
typedef struct {  //определяем структуру Bus 
    char destination[MAXLEN]; //пункт назначения
    struct{//вложенная структура время
        int hour;//часы
        int min;//минуты
    }time;
    int vacancy;//кол-во свободных мест
    double price;//цена
}Bus;
//###############################################################
int input(Bus**);//прототипы функций
void output(Bus*,int);
void remove_data(Bus**,int*);
void save(Bus*,int);
int load(Bus**);
void dest_sort(Bus*,int);
void time_sort(Bus*,int);
void show_vacancy(Bus*,int);
//##############################################################
int main(){
    Bus* Bptr=(Bus*)malloc(sizeof(Bus));//определяем указатель на структуру и выделаем память под одну структуру
    int i,menuitem,n=0;//i - переменная цикла, minuitem - выбранный пункт меню, n - кол-во структур, на котрые указывает указатель
    char *menu[]={"1. Input data\n",//массив указателей на строки
                  "2. Output data\n",
                  "3. Remove data\n",
                  "4. Sort by destination\n",
                  "5. Sort by time\n",
                  "6. Show vacancy\n"
                  "7. Load from file\n",
                  "8. Save in file\n"
                  "9. Exit\n"};
    printf("Select menu item\n");//печатаем 
    while(1){//бесконечный цикл
        system("cls");//команда для командной строки, которая очищает экран консоли
        for(i=0;i<sizeof(menu)/sizeof(*menu);i++)//выводим пункты меню в цикле
            printf(menu[i]);
        menuitem=getch();//ждем нажатие клавиши, и присваеваем код нажатой клавиши переменной menuitem
        switch(menuitem){//оператор выбора
            case '1':n=input(&Bptr);break;//если нажата 1, то вызываем функцию input()
            case '2':output(Bptr,n);break;//если нажата 2, то вызываем output()
            case '3':remove_data(&Bptr,&n);break;//и т.д.
            case '4':dest_sort(Bptr,n);break;
            case '5':time_sort(Bptr,n);break;
            case '6':show_vacancy(Bptr,n);break;
            case '7':n=load(&Bptr);break;
            case '8':save(Bptr,n);break;
            case '9':free(Bptr);exit(0);
            default:printf("Please, press key from 1 to 9\n");//если нажата "левая" клавиша, то просим юзера не тупить
        }
    }
}
int input(Bus **Bptr){//реализация функции input(), ф-ция принимает в качестве аргумента указатель на указатель на структуру Bus
    char ch=0;//переменная, потом понадобится для считывания ответ Yes/No
    static int i=0;//статичная переменная (т.е. ее значение не меняется между вызовами ф-ции), нужна для хранения кол-ва введеных структур
    system("cls");//очищаем экран
    do{//цикл
        if((*Bptr=(Bus*)realloc(*Bptr,sizeof (Bus)*(i+1)))==NULL){//перевыделяем память под нужное кол-во структур
            perror("Fatal error: can't allocation memory\nProgramm halted");//если память не выделилась, выводим сообщение об ошибке
            getch();//ждем нажатия любой клавиши
            exit(1);//и завершаем программу с кодом ошибки "1"
        }
 
        while(1){//вечный цикл, будет крутиться, пока юзер не введет корректные данные
            printf("\nEnter destination: ");
            if(scanf("%[^\n]%*c",(*Bptr)[i].destination)==1)break;//если все норм, то выходим из цикла
            printf("\nIncorrect input\n");//если нет, то выводим сообщение о некорректном вводе
            fflush(stdin);//и очищаем входящий поток, потому что там может быть левая хрень, которую ввел юзер
        }//конец цикла
        while(1){//вводим следующее значение, опять в вечном цикле
            printf("Enter time (hh:mm): ");
            if(scanf("%d:%d",&(*Bptr)[i].time.hour,&(*Bptr)[i].time.min)==2 &&
                (*Bptr)[i].time.hour<24 && (*Bptr)[i].time.hour>=0 &&
                (*Bptr)[i].time.min<60 && (*Bptr)[i].time.min>=0)break;//если введены корректные данные, то выходим
                printf("\nIncorrect input\n");//если юзер ввел хрень, то выводим сообщение об этом
                fflush(stdin);//и очищаем входящий поток
        }
        while(1){//следующие 2 цикла аналогичны - крутим цикл, пока не будут введены корректные данные
            printf("Enter vacancy: ");
            if(scanf("%d",&(*Bptr)[i].vacancy)==1)break;
            printf("\nIncorrect input\n");
            fflush(stdin);
        }
        while(1){
            printf("Enter price: ");
            if(scanf("%lf",&((*Bptr)[i].price))==1)break;
            printf("\nIncorrect input\n");
            fflush(stdin);
        }
        printf("\nContinue? (y/n): ");//спрашиваем, продолжить ли ввод данных
        scanf("%*c%c%*c",&ch);//считываем ответ в переменную ch
        ++i;//увеличиваем счетчик структур на 1
    }while(ch!='n' && ch!='N');//условие цикла do..while(), цикл будет продолжаться, пока юзер не нажмет n или N в ответ на Continue?
    return i;//возвращаем кол-во считанных структур
}
void output(Bus *Bptr, int n){//реализация ф-ции output(), ф-ция принимает в качестве аргументов указатель на Bus и кол-во структур, котрые содержатся по этому указателю
    system("cls");//очищаем экран (больше про эту функцию писать не буду))))
    if(n==0)//если функция вывода данных вызвана с n=0 (т.е по указателю нет данных)
        printf("\nNothing to show\n");//то пишем, что нечего выводить
    while(n--){//цикл пока n не станет равна 0
        printf("\nDistination: %s\n",Bptr->destination);//выводим данные, содержащаяся в стуктуре, по указателю
        printf("Time %d:%d\n",Bptr->time.hour,Bptr->time.min);
        printf("Vacancy: %d\n",Bptr->vacancy);
        printf("Price: %.2lf\n",Bptr->price);
        ++Bptr;//увеличиваем указатель на 1 (т.е. теперь он указывает на следующую структуру)
    }
    getch();//после того как все напечатанно, ждем нажатия любой клавиши (про getch() тоже больше писать не буду)))
}
void save(Bus *Bptr,int n){//реализация ф-ции сохранения в файл, ф-ция принимает 2 аргумента - указатель на стуктуры и кол-во структур
    FILE *fout;//объявляем указатель на файл
    char filename[MAXLEN];//строка, в которую считаем имя файла
    if(n==0){//если n=0, значит нечего сохранять
        printf("\nNothing to save\n");//пишем об этом
        getch();
        return;//после нажатия клавиши, уходим из функции
    }
    printf("\nEnter file name: ");
    scanf("%s",filename);//считываем имя фала
    if((fout=fopen(filename,"ab"))==NULL){//отрываем файл
        perror("\nCan't open file\n");//если файл не открыт, то выводим сообщение об ошибке
        getch();
        return;// и уходим из ф-ции
    }
    if(fwrite(Bptr,sizeof(Bus),n,fout)==n)//записываем в файл данные, находящиеся по указателю
        printf("\nSaving was successful\n");//если кол-во записанных структур совпало с нужным, то пишет, что все сохранение успешно
    else perror("\nError: saving was not successfully\n");//если не совпало, то пишем, что произошла ошибка
    fclose(fout);//закрываем файл
    getch();
}
int load(Bus **Bptr){//ф-ция загрузки из файла, принимает указтель на указатель на структу Bus
    int n = 0;//это будет кол-во загруженных из файла стуктур
    char fname[MAXLEN];
    FILE *fin;
    printf("\nEnter file name: ");
    scanf("%s",fname);//до  этого момента все должно быть понятно
    if((fin = fopen(fname,"rb")) == NULL){// Открываем файл для чтения
        perror("\nCan't open file\n");//если файл не открыт (или не существует), то пишем об этом
        getch();
        return 0;//и возвращаем 0
    }
    fseek(fin, 0, SEEK_END);        // Позиционируем указатель на конец файла
    n = ftell (fin) / sizeof(Bus); // Определяем количество записей в файле
    rewind(fin);        // Позиционируем указатель на начало файла
    *Bptr=(Bus*)realloc(*Bptr,sizeof(Bus)*n);//выделяем память для нужного кол-ва структур
    if(fread(*Bptr, sizeof(Bus), n, fin)!=n) // Читаем из файла
        printf("\nWarning: was read by less than expected\n");//если кол-во прочитанных структур не совпало с нужным, то выводим предупреждение
    else printf("\nLoading was success\n");//если совпало, то пишем, что все норм
    fclose(fin);    // Закрываем файл
    getch();
    return n;   // Возвращаем число прочитанных структур
}
void remove_data(Bus **Bptr,int *n){//удаление данных, я вообще не понял, что подразумевалось в методичке
    //поэтому сделал удаление ВСЕХ данных, т.е. в файле и по указателю
    char fname[MAXLEN];
    FILE *f;
    printf("\nEnter file name: ");
    scanf("%s",fname);
    if((f = fopen(fname,"w")) == NULL){// Открываем файл для чтения, при этом ВСЕ данные удаляются нахер
        perror("\nCan't open file\n");//если файл не открыт, то пишем об этом
        getch();
        return;//и уходим из функции
    }
    free(*Bptr);//освобождаем память по указателю
    *Bptr=NULL;
    *n=0;
    printf("\nRemoving was success\n");//пишем, что все удаленно
    getch();
    fclose(f);//закрываем файл
}
void dest_sort(Bus *Bptr,int n){//ф-ция сортировки по пункту назначения
    int i,j,min;//переменные цикла
    Bus tmp;//временная стуктура Bus (она удалится при выходе из ф-ции)
    if(n==0){//если кол-во структур равно 0, то нечего сортировать
        printf("Nothing to sort\n");//пишем об этом
        return;//и выходим из ф-ции
    }
    for(i=0;i<n-1;i++) {//цикл для сортировки
        min = i;//присваем перменной min текущее значение i
        for(j=i+1;j<n;j++)//вложенный цикл, для поиска самой младшей (по алфавиту) строки
            if(strcmp(Bptr[min].destination, Bptr[j].destination) > 0)  min = j;//если ф-ция strcmp() вернула значение больше 0
        //значит пункт назначение, находящийся в структуру с индексом min "старше" по алвавиту, чем структура с индексом j
        tmp = Bptr[i];//эти 3 строки меняют местами стурктуры с индексом i и с индексом min 
        Bptr[i] = Bptr[min];
        Bptr[min] = tmp;
    }
    printf("\nSorting is completed\n");
    getch();
}
void time_sort(Bus *Bptr,int n){//сотрировка по времени
    int i,j,min;
    struct{
        int h;
        int m;
    }mintime;//временная структура mintime (она будет хранить минимальное время)
    Bus tmp;//временная структура Bus
    if(n==0){
        printf("Nothing to sort\n");
        return;
    }
    for(i=0;i<n-1;i++) {//сортировка аналогична как в ф-ции сортировке по пункту назначения
        //т.е. находим минимальное значение и вставляем его на место текущего, и т.д., пока не отсортируем все структуры
        mintime.h=Bptr[i].time.hour;
        mintime.m=Bptr[i].time.min;
        min=i;
        for(j=i+1;j<n;j++)
            if((Bptr[j].time.hour<mintime.h) ||
               (Bptr[j].time.hour==mintime.h && Bptr[j].time.min<mintime.m))  min = j;
        tmp = Bptr[i];
        Bptr[i] = Bptr[min];
        Bptr[min] = tmp;
    }
    printf("\nSorting is completed\n");
    getch();
}
void show_vacancy(Bus *Bptr,int n){//ф-ция, печатает все маршруты, в которых есть свободные места
    int i,fl=0;
    system("cls");
    if(n==0)
        printf("\nNothing to show\n");
    for(i=0;i<n;i++)//проходимся циклом по всем структурам
        if(Bptr[i].vacancy!=0){//если нашли стурктуру, в которой есть свободные места
            printf("\nDistination: %s\n",Bptr[i].destination);//то печатаем ее
            printf("Time %d:%d\n",Bptr[i].time.hour,Bptr[i].time.min);
            printf("Vacancy: %d\n",Bptr[i].vacancy);
            printf("Price: %.2lf\n",Bptr[i].price);
            fl=1;//присваеваем переменной значение 1, это нужно для того, что бы потом понять, было ли напечатанно хочть что-нибудь
        }
    if(!fl)//если fl = 0
        printf("\nNo vacant\n");//значит ни чего напечатанно не было, пишем, что сободных мест нет.
    getch();
}
там аналогичное задание. Писал тупо по примеру из методички. Писал не за спасибо, поэтому в коде очень подробные коментарии (для нуба)). Разберайся )))
DireSleep
0 / 0 / 0
Регистрация: 15.05.2011
Сообщений: 8
24.06.2011, 14:05  [ТС]     Нужно решение в c++ #3
Благодарю!!!

У меня в программе происходит зависание, не знаю почему..??


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <fstream.h>
#include <conio.h>
#include <string.h>
struct air
{char punkt[100];
char vriz[100];
char vrpr[100];
char ksm[100];
char nr[100];};
void spr()
{air tablo;int i;
ofstream f("paha.txt",ios::app);
memset(&tablo,0,sizeof(air));
for(i=1;i<=25;i++)
{clrscr();
cout<<"Vvedite infu o peise N"<<i<<endl;
cout<<"\tN reisa:";
cin>>tablo.nr;
cout<<"\tPunkt naznachenua:";
cin>>tablo.punkt;
cout<<"\tVremya vileta:";
cin>>tablo.vriz;
cout<<"\tVremya pribitia:";
cin>>tablo.vrpr;
cout<<"\tKol-vo svob mest:";
cin>>tablo.ksm;
f.write((char*) &tablo,sizeof(air));}
f.close();}
void poisk()
{air tablo;
ifstream f("paha.txt");
char X,Y;
int i;
clrscr();
cout<<"Kuda nuzhno:";
cin>>X;
cout<<"Vo skolko:";
cin>>Y;
 
for(;;)
{memset(&tablo,0,sizeof(air));
if (f.eof()) break;
if ((*tablo.punkt==X)&&(*tablo.vriz==Y))
cout<<"Info o reise:\n\tN reisa:"<<tablo.nr<<"\n\tkol-vo svob-h mest:"<<tablo.ksm;}
 
f.close();
cout<<"\n Press any key...";
getch();
}
void poisk2()
{air tablo;
ifstream f("paha.txt");
char X;
clrscr();
cout<<"kuda nuzhno";
 
for(;;)
{memset(&tablo,0,sizeof(air));
if (f.eof())break;
if (*tablo.punkt==X)
cout<<"\nvrema vileta:"<<tablo.vriz;}
f.close();
cout<<"\n Press any key...";
getch();
}
void menu()
{window(1,1,80,50);
textbackground(2);
clrscr();
textbackground(6);
window(1,1,50,20);
clrscr();
textcolor(0);
gotoxy(8,5);
cout<<"1-vvod inf-ii o reisah";
gotoxy(8,6);
cout<<"2-poisk reisa";
gotoxy(8,7);
cout<<"3-poisk po vremeni";
gotoxy(8,8);
cout<<"4-exit";}
void main(void)
{int choice,i;
do
{clrscr();
menu();
gotoxy(8,9);
cout<<"vash vibor:";
cin>>choice;
switch(choice)
{case 1: spr(); break;
case 2: poisk(); break;
case 3: poisk2(); break;
default:; break;}} while(choice!=3);
}
Добавлено через 4 часа 9 минут
Во втором пункте, второй пункт зависает.
И третий пункт тоже(
???help
DireSleep
0 / 0 / 0
Регистрация: 15.05.2011
Сообщений: 8
07.02.2012, 14:11  [ТС]     Нужно решение в c++ #4
Исправил, цикл мешал...
Yandex
Объявления
07.02.2012, 14:11     Нужно решение в c++
Ответ Создать тему
Опции темы

Текущее время: 08:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru