晚上好。我正在编写一个程序代码,该代码应该具有 AEROFLOT 结构类型数组的输入和输出函数。适用于一次航班。不带两个。胡说八道,我认为它会导致一段不存在的记忆。但我不明白为什么。同时我请你分析代码。我释放了内存是真的吗?我还想将这些功能推入一个结构中。也许有人会建议怎么做?
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <iomanip>
using namespace std;
struct AEROFLOT
{
public:
char Trip[20]; //номер рейса
char Departure[30]; // пункт отправления
char Destination[30]; //пункт назначения
char Type[30]; //тип самолёта
float Time; //Время в пути
};
AEROFLOT set(int k);
void out(AEROFLOT *n, int k);
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int k, check;
cout << "Введите кол-во рейсов" << endl;
cin >> k;
AEROFLOT * n = new AEROFLOT[k];
*n = set(k);
while (1)
{
cout << "1. Ввод информации" << endl;
cout << "2. Вывод информации по всем рейсам" << endl;
cout << "3. Выход" << endl;
cin >> check;
switch (check)
{
case 1:
{
cout << "Введите новое кол-во рейсов" << endl;
cin >> k;
AEROFLOT * n = new AEROFLOT[k];
*n = set(k);
break;
}
case 2:
{
system("cls");
out(n, k);
break;
}
case 3:
{
delete n;
return 0;
}
default: cout <<endl<< "Неверный ввод! Повторите. " << endl;
cout << endl;
break;
}
}
return 0;
}
AEROFLOT set(int k)
{
AEROFLOT *n = new AEROFLOT[k];
for (int i = 0; i < k; i++)
{
cout << "Введите номер "<<i+1<< "-го рейса: " << endl;
cin >> n[i].Trip;
cout << "Введите пункт отправления " << i+1 << "-го рейса: " << endl;
cin >> n[i].Departure;
cout << "Введите пункт назначения " << i+1 << "-го рейса: " << endl;
cin >> n[i].Destination;
cout << "Введите тип самолёта " << i+1 << "-го рейса: " << endl;
cin >> n[i].Type;
cout << "Введите время в пути(мин) " << i+1 << "-го рейса: " << endl;
cin >> n[i].Time;
}
system("cls");
return *n;
}
void out(AEROFLOT *n, int k)
{
for (int i = 0; i < k; i++)
{
cout << "___________________________________________" << endl;
cout << "|Номер рейса: |"<< setw(20) << n[i].Trip<<" |"<< endl;
cout << "___________________________________________" << endl;
cout << "|Пункт отправления: |"<< setw(20) << n[i].Departure <<" |"<<
endl;
cout << "___________________________________________" << endl;
cout << "|Пункт назначения: |"<< setw(20) << n[i].Destination<< " |"
<<endl;
cout << "___________________________________________" << endl;
cout << "|Тип самолёта: |"<< setw(20) << n[i].Type <<" |"<< endl;
cout << "___________________________________________" << endl;
cout << "|Время в пути: |"<< setw(16) << n[i].Time<<" мин"<<" |" <<
endl;
cout << "___________________________________________" << endl;
cout << endl;
}
system("pause");
system("cls");
}
AEROFLOT set(int k)返回单个结构而不是指向这些结构数组的指针,该数组在函数中分配(和丢失)。因此,赋值*n = set(k);仅复制数组中的第一个元素(不应在此处分配,因为它已在函数中分配),其余元素包含垃圾。此外,正在创建的局部变量会AEROFLOT * n = new AEROFLOT[k];掩盖同名变量,并且第一个数组会留下垃圾。将指向先前分配的数组的指针传递给您的函数。AEROFLOT *通过循环删除解决了这个问题。因为AEROFLOT *创建一个新的,不同于以前的变量。因此,没有所需数组的输出。现在旧变量在程序中被编辑,它也被显示出来。