Объединить 2 структуры и вывести результаты не в файл, а на экран - C (СИ)
Формулировка задачи:
даны две структуры. Цель и пусковая установка (лаба такая) во общем надо так: ввожу номер цели и надо чтобы программа вывела близкую пусковую установку. У меня две структуры. каждая выводит в текстовый документ данные
получилось немного громадно, но понятно. создается бинарник и туда заносятся данные. Ответ надо вывести на экран. Помогите пожалуйста
вот функция для примера, как мне сделать так, чтобы он хотябы нашел ракету
ввожу номер ракеты, он не ищет
вот чтобы это заработало
//lab2.14 #include <stdio.h> #include <conio.h> #include <string.h> #include <windows.h> void input(FILE*rf,FILE*cf); // создание нового файла void print(FILE*rf,FILE*cf); // просмотр файла void app(FILE*rf,FILE*cf); // добавление в файл void find(FILE*rf,FILE*cf); // поиск и изменение typedef struct cel { int No; int X; int Y; } Cel; typedef struct raketa { int No; int X; int Y; } Raketa; Cel t1; Raketa t2; main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); char c; FILE *tf; FILE *rf, *cf; while (1) { system("CLS"); puts("* 1 – новый файл"); puts("* 2 – просмотр файла"); puts("* 3 – добавление в файл"); puts("* 4 – поиск фильма"); puts("* 0 - выход"); c=getch(); switch(c) { case '1':input(rf,cf);break; case '2':print(rf,cf);break; case '3':app(rf,cf);break; case '4':find(rf,cf);break; case '0':return 0; default : puts(" неверный режим"); } } } void input(FILE*rf,FILE*cf) //новый файл { char ch; char c; cf=fopen("filec.dat","wb"); rf=fopen("filer.dat","wb"); // открытие бинарного файла для записи //printf("\n Ввод\n"); while (1) { puts("\n* 1 – РАКЕТА"); puts("* 2 – ЦЕЛЬ"); puts("* 0 - назад\n"); c=getch(); switch(c) { case '1': { do { printf("\nНомер ракеты:"); scanf("%d",&t2.No); printf(" Координата по X:"); scanf("%d",&t2.X); printf(" Координата по Y:"); scanf("%d",&t2.Y); fwrite(&t2,sizeof(Raketa),1,rf); printf(" Закончить? *y\n "); ch=getch(); } while (ch != 'y'); break; } case '2': { do { printf("\nНомер установки:"); scanf("%d",&t1.No); printf(" Координата по X:"); scanf("%d",&t1.X); printf(" Координата по Y:"); scanf("%d",&t1.Y); fwrite(&t1,sizeof(Cel),1,cf); printf(" Закончить? *y\n "); ch=getch(); } while (ch != 'y'); break; } case '0': {fclose(cf); fclose(rf); return;} default : puts(" неверный режим"); } } return; } void print(FILE*rf,FILE*cf) //просмотр файла { int i=1; rf=fopen("filer.dat","rb"); cf=fopen("filec.dat","rb"); // открытие бинарного файла для чтения fread(&t2,sizeof(Raketa),1,rf); // чтение из файла одной структуры t1 printf("РАКЕТЫ:"); for (;!feof(rf);i++) { printf("\n %d) №%d [%d:%d]",i,t2.No,t2.X,t2.Y); fread(&t2,sizeof(Raketa),1,rf); } i=1; fread(&t1,sizeof(Cel),1,cf); printf("\nЦЕЛИ:"); for (;!feof(cf);i++) { printf("\n %d) №%d [%d:%d]",i,t1.No,t1.X,t1.Y); fread(&t1,sizeof(Cel),1,cf); } //fread(&t1,sizeof(Cel),1,cf); getch(); } void app(FILE*rf,FILE*cf) //добавление в файл { char ch; char c; rf=fopen("filer.dat","ab"); cf=fopen("file1.dat","ab"); // открытие бинарного файла для добавления printf("\n _______________________________\n"); while (1) { puts("\n* 1 – РАКЕТА"); puts("* 2 – ЦЕЛЬ"); puts("* 0 - закончить\n"); c=getch(); switch(c) { case '1': { do { printf("\nНомер ракеты:"); scanf("%d",&t2.No); printf(" Координата по X:"); scanf("%d",&t2.X); printf(" Координата по Y:"); scanf("%d",&t2.Y); fwrite(&t2,sizeof(Raketa),1,rf); printf(" Закончить? *y\n "); ch=getch(); } while (ch != 'y'); break; } case '2': { do { printf("\nНомер установки:"); scanf("%d",&t1.No); printf(" Координата по X:"); scanf("%d",&t1.X); printf(" Координата по Y:"); scanf("%d",&t1.Y); fwrite(&t1,sizeof(Cel),1,cf); printf(" Закончить? *y\n "); ch=getch(); } while (ch != 'y'); break; } case '0': { fclose(cf); fclose(rf); return 0; } default : puts(" неверный режим"); } } } void find(FILE *rf, FILE *cf) { char tov[30]; int i=1; rf=fopen("filer.dat","rb+"); cf=fopen("filec.dat","rb+"); printf("Выбирите номер цели: "); fread(&t2,sizeof(Cel),1,cf); for (;!feof(cf);i++) { printf("\n %d) №%d [%d:%d]",i,t1.No,t1.X,t1.Y); fread(&t1,sizeof(Cel),1,cf); } gets(tov); int min=1000000000; int rmin; fread(&t1,sizeof(Raketa),1,rf); for (i=1;!feof(rf);i++) { if (abs(t1.X-t2.X)+abs(t1.Y-t2.Y)<min ) //strcmp сравнивает в лексикографическом порядке две строки и возвращает целое значение, зависящее следующим образом от результата сравнения { printf(abs((t1.X-t2.X)+(t1.Y-t2.Y))); } } printf("ракета %d",rmin); fclose(rf); fclose(cf); }
вообще заучился там не поиск фильма, а поиск ближайшей пусковой установки
void find(FILE *rf, FILE *cf) /// поиск ближайшей ракеты { char tov[100]; int i=1; rf=fopen("filer.dat","rb+"); cf=fopen("filec.dat","rb+"); printf("------------------------"); fread(&t1,sizeof(Cel),1,cf); for (;!feof(cf);i++)///мы вывели цели для удобства { printf("\n %d) №%d [%d:%d]",i,t1.No,t1.X,t1.Y); fread(&t1,sizeof(Cel),1,cf); } printf("\n"); printf("введите номер цели:"); /// типо номер scanf("%d", &tov); int min; int rmin; int temp; fread(&t1,sizeof(Raketa),1,rf); ///найду цель getc(tov); while (!feof(cf)) { if (strcmp(t1.No,tov)==0) //strcmp сравнивает в лексикографическом порядке две строки и возвращает целое значение, зависящее следующим образом от результата сравнения { printf("\n %d",abs(t1.X-t1.Y)); } //fread(&t1,sizeof(t1),1,tf); } fclose(rf); fclose(cf); }
извините конечно за говнокод
getc(tov); while (!feof(cf)) { if (strcmp(t1.No,tov)==0) //strcmp сравнивает в лексикографическом порядке две строки и возвращает целое значение, зависящее следующим образом от результата сравнения { printf("\n %d",abs(t1.X-t1.Y)); } //fread(&t1,sizeof(t1),1,tf); }
Решение задачи: «Объединить 2 структуры и вывести результаты не в файл, а на экран»
textual
Листинг программы
void find(FILE *rf, FILE *cf) /// поиск ближайшей ракеты { char boom[10]; int i=1; rf=fopen("filer.dat","rb+"); cf=fopen("filec.dat","rb+"); printf("------------------------"); fread(&Cel,sizeof(Cel),1,cf); for (;!feof(cf);i++)///мы вывели цели для удобства { printf("\n %d) №%s [%s:%s]",i,Cel.No,Cel.X,Cel.Y); fread(&Cel,sizeof(Cel),1,cf); } fread(&Raketa,sizeof(Raketa),1,rf); //getch(); printf("\nвведите номер цели: "); gets(boom); fread(&Cel,sizeof(Cel),1,cf); while (!feof(cf)) { getch(); if (strcmp(Cel.No,boom)==0) { getch(); printf("%s,%s,%s\n\n\n",Cel.X,Cel.X,Cel.Y); } fread(&Cel,sizeof(Cel),1,cf); } fclose(rf); fclose(cf); }
Объяснение кода листинга программы
- Объединение двух структур: Cel и Raketa.
- Чтение данных из файла
filec.dat
в переменную Cel типа struct Cel. - Организация цикла для вывода на экран всех доступных целей (структуры Cel).
- Чтение данных из файла
filer.dat
в переменную Raketa типа struct Raketa. - Ввод номера цели с клавиатуры в буфер boom.
- Поиск цели с заданным номером в файле
filec.dat
и вывод её координат на экран. - Закрытие файлов rf и cf.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д