Динамическое выделение памяти для структур С++

Уровень сложности:

Необходимо создать структуру, которая содержит элемент типа int и строку. Объявить указатель типа структуры (объект структуры) и выделить память для хранения данных одной структуры. Предложить пользователю внести данные и записать их в элементы объекта структуры. Далее пользователю необходимо сделать выбор: внести еще данные (создать еще один объект структуры) либо выйти из программы. Если пользователь продолжает ввод — необходимо выделить новую память для указателя на объект структуры и дописать в нее введенные пользователем новые данные. Цикл выделения новой памяти продолжается, пока пользователь не выберет выход из программы.

Решение примерно так должно выглядеть:

 Исходный код программы:

#include <iostream>
#include <string.h>

using namespace std;

struct Data //создание структуры
{
	int year;
	char name [10];
};

int main()
{
	setlocale(LC_ALL, "rus");

	Data *p = new Data[1];//объект структуры

	int var = 1; //будет хранить выбор пользователя (продолжить или выйти)
	int size = 1; //размер массива структур

	while (var)
	{
		if(size == 1)//просто вносим данные в 0-е элементы
		{
		cout << "Имя: ";
		cin >> p[size-1].name;
		cout << "Возраст: ";
		cin >> p[size-1].year;
		cout << "Элементы структуры объекта Р:  " << p[size-1].name << "  " <<  p[size-1].year << ";\n";
		}
		else//size > 1 
		{
			Data *copy = new Data [size-1];//создаем новую структуру для копирования в нее данных

			for(int i = 0; i < size-1; i++)//копируем данные перед отчисткой памяти объекта р
			{
				strcpy(copy[i].name, p[i].name);
				copy[i].year = p[i].year;
			}

			delete [] p; //освобождаем  память

			p = new Data[size]; //выделяем новую память 

			for (int i = 0; i < size-1; i++) // обратное копирование в объект р
			{
				strcpy(p[i].name, copy[i].name);
				p[i].year = copy[i].year;
			}

			delete [] copy; //освобождаем память 

			cout << "Имя: ";//дописываем новые введенные данные
			cin >> p[size-1].name;
			cout << "Возраст: ";
			cin >> p[size-1].year;

			for (int i = 0; i < size; i++)//выводим все данные  на экран
			{
				cout << i << "-е элементы структуры объекта Р:  " << p[i].name << "  " << p[i].year << ";\n";			
			}			
		}

		size++;//счетчик +1

		cout << "\nВнести еще данные - 1, выход - 0: ";
		cin >> var;
		while(var != 0 && var != 1)//если пользователь ввел не 0 и не 1
		{
			cout << "Ошибка ввода!\n";
				cout << "\nВнести еще данные - 1, выход - 0: ";
				cin >> var;
		}		
	}

	delete [] p;//освобождение памяти перед завершением работы программы
return 0;
}

Вот пример работы программы:

CppStudio.com

Имя: Alina
Возраст: 22
Элементы структуры объекта Р: Alina 22;

Внести еще данные — 1, выход — 0: 1
Имя: Danila
Возраст: 30
0-е элементы структуры  объекта Р: Alina 22;
1-е элементы структуры  объекта Р: Danila 30;

Внести еще данные — 1, выход — 0: 1
Имя: Fagot
Возраст: 34
0-е элементы структуры  объекта Р: Alina 22;
1-е элементы структуры  объекта Р: Danila 30;
2-е элементы структуры  объекта Р: Fagot 34;

Внести еще данные — 1, выход — 0: 0
Для продолжения нажмите любую клавишу . . .

Следующие статьи помогут вам в решении данной задачи:
Автор: Marienko L.
Дата: 22.01.2014
Поделиться:

Комментарии

  1. Alexander Trousevich

    // Language: rust. Details: rust-lang.org
    
    
    use std::io;
    
    fn read_integer(prompt: String) -> u32 {
        println!("{}", prompt);
        let mut buf: String = String::new();
        io::stdin().read_line(&mut buf).expect("Invalid Input");
        buf.trim().parse().expect("Not a number")
    }
    
    fn read_string(prompt: String) -> String {
        println!("{}", prompt);
        let mut buf: String = String::new();
        io::stdin().read_line(&mut buf).expect("Invalid Input");
        String::from(buf.trim())
    }
    
    struct Student {
        name: String,
        age: u32
    }
    
    impl Student {
        fn new() -> Student {
            Student {
                name: String::from("Unknown"),
                age: 0
            }
        }
        fn description(&self) -> String {
            return format!("{}, {}", self.name, self.age);
        }
    }
    
    fn main() {
        let mut students: Vec<Student> = Vec::new();
    
        loop {
            let mut student = Student::new();
            student.name = read_string(String::from("Student's Name: "));
            student.age = read_integer(String::from("Student's Age: "));
            students.push(student);
            match read_string(String::from("Continue? ( type 'no' for stop and anything else to continue)")).as_str() {
                "no" => break,
                _ => {}
            }
        }
    
        for s in students {
            println!("{}", s.description());
        }
    }
  2. Alex Pir

    Ребят помогите плиз у меня проблема из чисткой памяти, вот код (Не судите строго ,я только начинающий):

    #include <iostream>
    using namespace std;

    int main()

    {
    int size = 1;
    int *arr = new int[size] {};
    int *arr2 = new int[size + 1];
    int a;
    cin >> a;
    for (int l = 0; a >= 0; l++)
    {

    cout << «Enter value: «;
    cin >> a;
    cout << «Array: «;
    for (int i = 0; i < size + l; i++)
    {

    arr2[i] = arr[i];
    arr2[l] = a;
    arr[i] = arr2[i];
    cout << arr2[i] << «\t»;

    }
    cout << endl;
    }
    }

  3. Программист

    Dentchik 2016(Just Do it)

    //Опять же можно и так решить  , или поясните , почему бы не писать так просто
    #include<bits/stdc++.h>
    using namespace std;
    
    struct Pupil
    {
      char name[30];
      int age;
    };
    
    int main()
    {
        bool cont;
        Pupil* pupils = new Pupil[1];
        int c = 0;
        do
        {
            cin >> pupils[c].name >> pupils[c++].age;
            cin >> cont;
        }while(cont);
        for(int i= 0;i < c;i++)
        {
            cout << pupils[i].name << " " << pupils[i].age << endl;
        }
        delete [] pupils;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.