Объединить 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);
}

Объяснение кода листинга программы

  1. Объединение двух структур: Cel и Raketa.
  2. Чтение данных из файла filec.dat в переменную Cel типа struct Cel.
  3. Организация цикла для вывода на экран всех доступных целей (структуры Cel).
  4. Чтение данных из файла filer.dat в переменную Raketa типа struct Raketa.
  5. Ввод номера цели с клавиатуры в буфер boom.
  6. Поиск цели с заданным номером в файле filec.dat и вывод её координат на экран.
  7. Закрытие файлов rf и cf.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы