Турбо си выдает ошибку, несколько ошибок с инициализацией переменных - C (СИ)
Формулировка задачи:
#define AUTOBUS ((char)"а")
#define TRAMWAY ((char)"т")
#define TAXI ((char)"м")
#include <stdio.h>
#include <string.h>
typedef struct {
int route_number;
char transport_type;
char* start_point_name;
char* end_point_name;
struct {
int hours;
int minutes;
} route_time;
} file_rec;
char* menu_items[] = {
"Список всех маршрутов от/до пункта А",
"Номер самого длинного маршрута от/до пункта А",
"Количество маршрутов каждого вида транспорта, следующих от/до пункта А",
"Выход из программы"
};
char* point_name;
int longest_route_num = 0;
int longest_route_time = 0;
int routes_count[3];
int display_menu(void) {
int result, i;
while(1) {
printf("Выберите поисковый запрос\n");
for(i = 0; i < 4; i++)
printf("\t%i. %s\n", i + 1, menu_items[i]);
printf("Введите номер нужного пункта меню\n");
scanf("%i", &result);
if(result >= 1 && result <= 4)
return result;
else
printf("Неверный номер запроса. Номер должен иметь значение от 1 до 3\n");
}
}
void iterate_data_file(void(*func)(file_rec*)) {
FILE* file = fopen("datafile.dat", "r");
file_rec rec;
if(file) {
while(!feof(file)) {
fscanf(file, "%i %c %s %s %i %i",
&rec.route_number,
&rec.transport_type,
rec.start_point_name,
rec.end_point_name,
&rec.route_time.hours,
&rec.route_time.minutes);
func(&rec);
}
fclose(file);
} else
printf("Файл с данными (datafile.dat) не найден\n");
}
void execute_item_1(file_rec* rec) {
if(strcmp(rec->start_point_name, point_name) == 0 || strcmp(rec->end_point_name, point_name))
printf("Маршрут %i(%c) следует из %s в %s, время в пути %i ч, %i мин\n",
rec->route_number,
rec->transport_type,
rec->start_point_name,
rec->end_point_name,
rec->route_time.hours,
rec->route_time.minutes);
}
void execute_item_2(file_rec* rec) {
if((strcmp(rec->start_point_name, point_name) == 0 || strcmp(rec->end_point_name, point_name)) &&
rec->route_time.hours * 60 + rec->route_time.minutes > longest_route_time) {
longest_route_num = rec->route_number;
longest_route_time = rec->route_time.hours * 60 + rec->route_time.minutes;
}
}
void execute_item_3(file_rec* rec) {
if(strcmp(rec->start_point_name, point_name) == 0 || strcmp(rec->end_point_name, point_name)) {
switch(rec->transport_type) {
case AUTOBUS:
routes_count[0]++;
break;
case TRAMWAY:
routes_count[1]++;
break;
case TAXI:
routes_count[2]++;
}
}
}
int main(int agrc, char** argv) {
int menu_item_num;
while(1) {
menu_item_num = display_menu();
printf("Выполняем пункт %i - %s\n", menu_item_num, menu_items[menu_item_num - 1]);
if(menu_item_num < 4) {
printf("Введите название населенного пункта ");
scanf("%s", point_name);
}
switch(menu_item_num) {
case 1:
iterate_data_file(execute_item_1);
break;
case 2:
longest_route_num = longest_route_time = 0;
iterate_data_file(execute_item_2);
break;
case 3:
memset(&routes_count, 3, sizeof(int));
iterate_data_file(&execute_item_3);
printf("Число маршрутов автобусов - %i\n", routes_count[0]);
printf("Число маршрутов трамваев - %i\n", routes_count[1]);
printf("Число маршрутов такси - %i\n", routes_count[2]);
break;
case 4: return 0;
}
}
}Решение задачи: «Турбо си выдает ошибку, несколько ошибок с инициализацией переменных»
textual
Листинг программы
#define AUTOBUS 'а'
#define TRAMWAY 'т'
#define TAXI 'м'
#include <stdio.h>
#include <string.h>
typedef struct {
int route_number;
char transport_type;
char* start_point_name;
char* end_point_name;
struct {
int hours;
int minutes;
} route_time;
} file_rec;
char* menu_items[] = {
"Список всех маршрутов от/до пункта А",
"Номер самого длинного маршрута от/до пункта А",
"Количество маршрутов каждого вида транспорта, следующих от/до пункта А",
"Выход из программы"
};
char* point_name;
int longest_route_num = 0;
int longest_route_time = 0;
int routes_count[3];
int display_menu(void) {
int result, i;
while(1) {
printf("Выберите поисковый запрос\n");
for(i = 0; i < 4; i++)
printf("\t%i. %s\n", i + 1, menu_items[i]);
printf("Введите номер нужного пункта меню\n");
scanf("%i", &result);
if(result >= 1 && result <= 4)
return result;
else
printf("Неверный номер запроса. Номер должен иметь значение от 1 до 3\n");
}
}
void iterate_data_file(void(*func)(file_rec*)) {
FILE* file = fopen("datafile.dat", "r"); //вот в этом месте 2 ошибки: Undefined symbol 'FILE'
//и Undefined symbol 'file'
file_rec rec; // в этой строчке пишет Declaration is not allowed
// here
if(file) {
while(!feof(file)) {
fscanf(file, "%i %c %s %s %i %i",
&rec.route_number,
&rec.transport_type,
rec.start_point_name,
rec.end_point_name,
&rec.route_time.hours,
&rec.route_time.minutes);
func(&rec);
}
fclose(file);
} else
printf("Файл с данными (datafile.dat) не найден\n");
}
void execute_item_1(file_rec* rec) {
if(strcmp(rec->start_point_name, point_name) == 0 || strcmp(rec->end_point_name, point_name))
printf("Маршрут %i(%c) следует из %s в %s, время в пути %i ч, %i мин\n",
rec->route_number,
rec->transport_type,
rec->start_point_name,
rec->end_point_name,
rec->route_time.hours,
rec->route_time.minutes);
}
void execute_item_2(file_rec* rec) {
if((strcmp(rec->start_point_name, point_name) == 0 || strcmp(rec->end_point_name, point_name)) &&
rec->route_time.hours * 60 + rec->route_time.minutes > longest_route_time) {
longest_route_num = rec->route_number;
longest_route_time = rec->route_time.hours * 60 + rec->route_time.minutes;
}
}
void execute_item_3(file_rec* rec) {
if(strcmp(rec->start_point_name, point_name) == 0 || strcmp(rec->end_point_name, point_name)) {
switch(rec->transport_type) {
case AUTOBUS:
routes_count[0]++;
break;
case TRAMWAY:
routes_count[1]++;
break;
case TAXI:
routes_count[2]++;
}
}
}
int main(int agrc, char** argv) {
int menu_item_num;
while(1) {
menu_item_num = display_menu();
printf("Выполняем пункт %i - %s\n", menu_item_num, menu_items[menu_item_num - 1]);
if(menu_item_num < 4) {
printf("Введите название населенного пункта ");
scanf("%s", point_name);
}
switch(menu_item_num) {
case 1:
iterate_data_file(execute_item_1);
break;
case 2:
longest_route_num = longest_route_time = 0;
iterate_data_file(execute_item_2);
break;
case 3:
memset(&routes_count, 3, sizeof(int));
iterate_data_file(&execute_item_3);
printf("Число маршрутов автобусов - %i\n", routes_count[0]);
printf("Число маршрутов трамваев - %i\n", routes_count[1]);
printf("Число маршрутов такси - %i\n", routes_count[2]);
break;
case 4: return 0;
}
}
}
Объяснение кода листинга программы
- В функции
display_menuпеременнаяresultобъявлена, но не инициализирована. - В функции
iterate_data_fileпеременныеfileиrecобъявлены, но не инициализированы. - В функции
execute_item_1иexecute_item_2переменнаяpoint_nameобъявлена, но не инициализирована. - В функции
mainпеременныеmenu_item_numиpoint_nameобъявлены, но не инициализированы. - В функции
mainпри использованииscanfдля ввода названия населенного пункта, ввод не проверяется на успешность. - В функции
mainпри использованииiterate_data_fileдля выполнения пунктов меню, файл с данными не проверяется на открытие. - В функции
mainпри использованииiterate_data_fileдля выполнения пунктов меню, ввод названия населенного пункта не проверяется на успешность. - В функции
mainпри использованииiterate_data_fileдля выполнения пунктов меню, результат выполнения функцииexecute_item_3не проверяется на успешность. - В функции
mainпри использованииiterate_data_fileдля выполнения пунктов меню, после выполнения функцииexecute_item_3переменнаяpoint_nameне очищается. - В функции
mainпри использованииiterate_data_fileдля выполнения пунктов меню, после выполнения функцииexecute_item_3переменныеroutes_countне очищаются. - В функции
mainпри использованииiterate_data_fileдля выполнения пунктов меню, после выполнения функцииexecute_item_3не выводится сообщение об успешном выполнении. - В функции
mainпри использованииiterate_data_fileдля выполнения пунктов меню, после выполнения функцииexecute_item_3не выводится сообщение об ошибке.