Описать структуру с именем TRAIN (Завершить задачу) - C (СИ)
Формулировка задачи:
Описать структуру с именем TRAIN, содержащую следующие поля:
- название пункта назначения;
- номер поезда;
- время отправления.
Написать программу, выполняющую следующие действия:
- ввод с клавиатуры данных в массив, состоящий из шести элементов типа TRAIN;
- записи должны быть упорядочены по времени отправления поезда;
- вывод на экран информации о поездах, направляющихся в пункт, название которого введено с
клавиатуры;
- если таких поездов нет, выдать на дисплей соответствующее сообщение.
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
struct TRAIN {
char point[30];
int N;
float T;char state[3];
unsigned long int zip;
} TRAIN_list[MAX];
void init_list(void), enter(void);
void delete(void), list(void);
void load(void), save(void);
int menu_select(void), find_free(void);
int main(void)
{
char choice;
init_list(); /* инициализация массива структур */
for(;;) {
choice = menu_select();
switch(choice) {
case 1: enter();
break;
case 2: delete();
break;
case 3: list();
break;
case 4: save();
break;
case 5: load();
break;
case 6: exit(0);
}
}
return 0;
}
/* Инициализация списка. */
void init_list(void)
{
register int t;
for(t=0; t<MAX; ++t) TRAIN_list[t].point[0] = '\0';
}
/* Получения значения, выбранного в меню. */
int menu_select(void)
{
char s[80];
int c;
printf("1. Ввести пункт назначения\n");
printf("2. Удалить пункт назначения\n");
printf("3. Вывести список\n");
printf("4. Сохранить файл\n");
printf("5. Загрузить файл\n");
printf("6. Выход\n");
do {
printf("\nВведите номер нужного пункта: ");
gets(s);
c = atoi(s);
} while(c<0 || c>6);
return c;
}
/* Добавление адреса в список. */
void enter(void)
{
int slot;
char s[80];
slot = find_free();
if(slot==-1) {
printf("\nСписок заполнен");
return;
}
printf("Введите пункт назначения: ");
gets(TRAIN_list[slot].name);
printf("Введите номер поезда: ");
gets(TRAIN_list[slot].N);
printf("Введите время: ");
gets(TRAIN_list[slot].T);
TRAIN_list[slot].zip = strtoul(s, '\0', 10);
}
/* Поиск свободной структуры. */
int find_free(void)
{
register int t;
for(t=0; TRAIN_list[t].name[0] && t<MAX; ++t) ;
if(t==MAX) return -1; /* свободных структур нет */
return t;
}
/* Удаление адреса. */
void delete(void)
{
register int slot;
char s[80];
printf("Введите № записи: ");
gets(s);
slot = atoi(s);
if(slot>=0 && slot < MAX)
TRAIN_list[slot].name[0] = '\0';
}
/* Вывод списка на экран. */
void list(void)
{
register int t;
for(t=0; t<MAX; ++t) {
if(TRAIN_list[t].name[0]) {
printf("%s\n", TRAIN_list[t].name);
printf("%s\n", TRAIN_list[t].street);
printf("%s\n", TRAIN_list[t].city);
printf("%s\n", TRAIN_list[t].state);
printf("%lu\n\n", TRAIN_list[t].zip);
}
}
printf("\n\n");
}
/* Сохранение списка. */
void save(void)
{
FILE *fp;
register int i;
if((fp=fopen("maillist", "wb"))==NULL) {
printf("Ошибка при открытии файла.\n");
return;
}
for(i=0; i<MAX; i++)
if(*TRAIN_list[i].name)
if(fwrite(&TRAIN_list[i],
sizeof(struct TRAIN), 1, fp)!=1)
printf("Ошибка при записи файла.\n");
fclose(fp);
}
/* Загрузить файл. */
void load(void)
{
FILE *fp;
register int i;
if((fp=fopen("maillist", "rb"))==NULL) {
printf("Ошибка при открытии файла.\n");
return;
}
init_list();
for(i=0; i<MAX; i++)
if(fread(&addr_list[i],
sizeof(struct addr), 1, fp)!=1) {
if(feof(fp)) break;
printf("Ошибка при чтении файла.\n");
}
fclose(fp);
}Решение задачи: «Описать структуру с именем TRAIN (Завершить задачу)»
textual
Листинг программы
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int n = 2;
int m = 0;
typedef struct
{
char pn [21];
unsigned int num;
char time [6];
} Train;
int main(void)
{
int kk = 1;
switch(kk)
{
case 1:
puts ( "добавить поезд "); break;
case 2:
puts ( "найти поезд 2. "); break;
case 3:
puts ( "выход 3. "); break;
default:
puts ( "случай default. "); break;
}
printf (" ВНОСИМ ИФНОРМАЦИЮ О ПОЕЗДАХ:\n ");
Train a[n];
int i = 0;
for (i=0; i<n; i++) //Ввод данных
{
printf ("Введите пункт назначения: ");
scanf("%s", &a[i].pn);
printf (" Введите номер поезда: ");
scanf("%d", &a[i].num);
printf (" Введите время отправления ");
scanf("%s", &a[i].time);
}
Train buf;
int k;
for (i=0; i < n-1; i++)
for (k=0; k < n-1; k++)
if (strcmp (a[k].time, a[k+1].time)>0)
{
buf = a[k];
a[k] = a[k+1];
a[k+1] = buf;
}
char pp[21];
printf (" ИЩЕМ ПОЕЗД\n ");
printf ("Введите пункт назначения: ");
scanf("%s%*c", pp);
int f = 0;
for (i=0; i<n; i++)
if (strcmp (a[i].pn, pp) == 0)
printf ("Поезд номер: %u\tВремя отправления: %s\n", a[i].num, a[i].time);
printf("\n");
f = 1;
if (!f)
printf ("В %s ПОЕЗДА НЕ ХОДЯТ!",pp);
getchar();
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Объявляем переменные
nиmтипа int - Объявляем структуру
Trainс полямиpn,numиtimeтипа char и unsigned int соответственно - В функции
mainобъявляем переменныеkk,a,buf,i,k,fиpp - В цикле switch выбираем действие в зависимости от значения переменной
kk - Вводим данные о поездах в массив
aс помощью цикла for и функцийscanf - Сортируем массив
aпо полюtimeс помощью двух вложенных циклов for и функцииstrcmp - Ищем поезд с заданным пунктом назначения с помощью цикла for и функции
strcmp - Выводим информацию о найденном поезде на экран
- Проверяем значение переменной
fи выводим соответствующее сообщение