Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в пункт назн

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
ПашаПетрович
Сообщения: 1
Зарегистрирован: 26 дек 2017, 21:10
Откуда: Minsk

26 дек 2017, 21:14

Условие:
В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны:
- номер рейса;
- тип автобуса;
- пункт назначения; - время отправления;
- время прибытия на конечный пункт;


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


Мой код:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
//#include <iostream.h>
#include  <locale.h>
#include <iostream>
 
using namespace std;
 
struct Spisok
{
    char Nomer[20];
    char Tip[10];
    char punkt[20];
    char timeO[20];
    char timeP[20];
 
}*sved;
 
void Vvod(int nom, struct Spisok*sved)
{
    setlocale(LC_ALL, "RUS");
    printf("\n Введите сведения %d", (nom + 1));
    puts("\n Номер рейса  -");
    fflush(stdin);
    gets_s(sved->Nomer);
    puts("Тип автобуса -");
    fflush(stdin);
    gets_s(sved->Tip);
    puts("Пункт назначения: -");
    fflush(stdin);
    gets_s(sved->punkt);
    puts("Время отправления -");
    fflush(stdin);
    gets_s(sved->timeO);
    puts("Время прибытия на конечный пункт -");
    fflush(stdin);
    gets_s(sved->timeP);
 
}
FILE *Fzap;
int main(){
    setlocale(LC_ALL, "RUS");
    struct Spisok Avto[80];
    int i, N, size = sizeof(Spisok);
    char tr = sizeof(Spisok);
    system("cls"); Fzap = fopen("myf.dat", "wb");
    puts("\n Введите количество < 50");
    scanf_s("%d", &N);
    for (i = 0; i < N; i++){
        Vvod(i, &Avto[i]);
        fwrite(&sved, size, 1, Fzap);
    }
    /* END of FOR */
    fclose(Fzap);
    Fzap = fopen("myf.dat", "rb"); /*  читать из файла  */
    if (!Fzap) { puts("can’t open it!"); exit(1); }
 
    puts("\n Список автобусов :");
    for (i = 0; i < N; i++){
        fread(&sved, 1, size, Fzap);
        printf("\n %10s %10s %10s %10s %10s", Avto[i].Nomer, Avto[i].Tip, Avto[i].punkt, Avto[i].timeO, Avto[i].timeP);
    }
 
 
    puts("\n Vvedi vrema ");
    fflush(stdin);
    char tr;
    cin >> tr;
    if (tr > Avto[i].timeP){
        for (i = 0; i < N; i++){
            fread(&sved, 1, size, Fzap);
            printf("\n %10s %10s %10s %10s %10s", Avto[i].Nomer, Avto[i].Tip, Avto[i].punkt, Avto[i].timeO, Avto[i].timeP);
        }
 
        fclose(Fzap);
        printf("\n");
        system("pause");
        return 0;
    }
Все вроде бы работает, а вот это не верно:

Код: Выделить всё

puts("\n Vvedi vrema ");
    fflush(stdin);
    char tr;
    cin >> tr;
    if (tr > Avto[i].timeP){
        for (i = 0; i < N; i++){
            fread(&sved, 1, size, Fzap);
            printf("\n %10s %10s %10s %10s %10s", Avto[i].Nomer, Avto[i].Tip, Avto[i].punkt, Avto[i].timeO, Avto[i].timeP);
        }
 
        fclose(Fzap);
        printf("\n");
        system("pause");
        return 0;
    }
как быть, помогите исправить пожалуйста
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

27 дек 2017, 09:03

Проблема у тебя начинает ещё раньше, при записи в файл. Переменная sved - это указатель на Spisok, правильно? Тогда &sved - это адрес указателя на список. Чего ты хочеть добиться, записывая адрес указателя (а не сами данные)? Более того, указатель ничем не инициализирован, так что он хранит просто ноль (все статические переменные инициализированы нулём по стандарту). Ты записываешь в файл ноль, а так же ещё какой-то мусор, который следует по памяти за переменной, так как sizeof(Spisok) однозначно больше, чем размер указателя.

С чтением та же фигня.

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

И ещё совет. Обязательно записывай N, чтобы при чтении его не нужно было вводить снова, а можно было просто вычитать из файла. Ты что не понимаешь, что если первый и второй раз ввести разные N, то программа упадёт?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить