Как использовать структуру?

Хорошо, сначала я объясню свое задание. Для этого задания я должен использовать динамическое распределение памяти, с которым у меня нет проблем. У меня возникла проблема с тем, чтобы выяснить правильный способ работы с моим заданием. Для моего задания мне нужно создать программу, предлагающую пользователю ввести количество студентов, которые у них есть, затем запросить следующую информацию; Идентификатор студента, Дата рождения и номер телефона. Мне нужно использовать цикл, чтобы побудить пользователя ввести всю информацию о студентах. Мне нужно создать цикл, который будет проверять все идентификаторы студента и найти самого старого ученика, использующего дату рождения (цикл должен быть способен сканировать более трех учеников).

Вот мой код, у меня есть некоторые предложения и даже кусочки кода от вас, ребята, но после их реализации я еще больше смущен тем, что должен делать. Пожалуйста, взгляните на него и критикуйте меня.

EDIT: Я также добавил в код, где я получаю и ошибка

Спасибо.

#include  #include  int main (void) { int * studentData= NULL; int * studentDataType=NULL; int students; int studentID; int year; int month; int day; long long phone; printf("How many students are you entering records for:\n"); scanf("%d", &students); studentData=(int*)malloc((sizeof(int)*students)); struct studentDataType { int studentID; int year; int month; int day; long long phone; }; //invalid operands to binary * (have 'int' and 'int *') studentDataType *studentData = (studentDataType*)malloc(numberOfStudents *sizeof(studentData)); for (int i = 0 ; i < students ; ++i) { printf("%d, %d, %d, %d, %d\n", studentID, year, month, day, phone); } } 

Вы переопределяете studentData

int * studentData= NULL;

тогда позже

studentDataType *studentData = (studentDataType*)malloc(numberOfStudents * sizeof(studentData));

studentDataType вы должны объявить структуру studentDataType (вне main() ), а затем использовать ее в своем первоначальном объявлении

Чтобы увидеть задачу, лучше, по крайней мере, в первый раз написать некоторую блок-схему того, что вы должны делать в программе. В твоем случае:

  1. Прочитайте данные от пользователя (каждая структура).
  2. Увеличьте размер массива, добавьте новую структуру.
  3. Петля 1-2 до тех пор, пока пользователь не завершит добавление новых людей (для этого нужно какое-то условие).
  4. Найдите необходимую структуру и распечатайте ее.

Итак, первый шаг – прочитать информацию от пользователя. Вы можете использовать scanf (): самым простым способом вы можете сделать это шаг за шагом для каждого поля:

 #include  ... int value; scanf("%d", &value); ... 

В случае успеха эта функция должна возвращать количество элементов, которые она читает (1 в вашем случае). Для телефона вы должны использовать scanf («% ld» и телефон).

Для изменения размера массива используйте функцию realloc () (#include:

 realloc(&ptr_to_array, new_size); 

Каждый элемент массива является указателем на структуру «ученик». Следующие шаги схожи.

Первая проблема заключается в том, что у вас есть имена переменных, аналогичные имени типа. Хотя вы можете иметь это в C в определенной степени, например:

 typedef int x; x foo (xx) { return x; } 

Было бы неплохо не делать этого для целей читаемости. Поэтому в вашем случае у вас есть:

 int * studentData= NULL; int * studentDataType= NULL; 

который является именем переменной, тогда у вас есть:

 struct studentDataType ... 

который является именем типа (должен использоваться как struct studentDataType, а не без структуры, как и вы); в конце концов

 studentDataType *studentData = ... 

обрабатывается компилятором как операция по двум переменным, а не объявлению типа, как вы ожидали. Таким образом, ваше распределение памяти должно быть:

 struct studentDataType *studentData = malloc(numberOfStudents *sizeof(struct studentData)); 

В результате возникает проблема, когда вы переопределяете studentData, которую вы указали в начале программы, и «numberOfStudents» не определен, возможно, вы хотели написать вместо этого «учеников».

Что касается данных чтения с scanf, см. Предыдущий комментарий.