Параметр указателя функции структуры? - PullRequest
0 голосов
/ 06 мая 2020

Поля студента: name, lastName, studentId, mid1Grade, mid2Grade, finalGrade, средний

Поля курса: courseName, courseCode, myStudentArray (массив Student структур), currentStudentCount

Функции:

void createNewStudent(struct Course *myCourse);

void setGradeOfStudent(struct Course *myCourse);

void findAndDisplayAverage(struct Course *myCourse);

struct Student * findStudentByID(int id, struct Course *myCourse);

void displayAverageOfAllStudents(struct Course *myCourse);

void displayAverageOfStudentsInInterval(struct Course *myCourse

хорошо, поэтому я написал первую функцию, но есть ошибка, которую я не понимаю. Прежде всего, первая функция и то, что она делает:

createNewStudent: Предлагает пользователю ввести имя, фамилию и идентификатор нового студента. Значения, введенные пользователем, присваиваются полям студент, проживающий в них, yStudentArray, конечно, переменная, указанная myCourse. CurrentStudentCount будет обновлен так, чтобы он обозначал слот, выделенный для следующего студента.

и моя реализация:

#include <string.h>

#include <stdio.h>

struct Student {
  char name[50];
  char lastname[50];
  int id;
  int mid1;
  int mid2;
  int final;
  double average;
};

struct Course {
  char courseName[50];
  char courseCode[50];
  struct Student myStudentArray[5];
  int currentstudentcount;
};

void createNewStudent(struct Course * myCourse);
void setGradeOfStudent(struct Course * myCourse);
void findAndDisplayAverage(struct Course * myCourse);
struct Student * findStudentByID(int id, struct Course * myCourse);
void displayAverageOfAllStudents(struct Course * myCourse);
void displayAverageOfStudentsInInterval(struct Course * myCourse);

int main() {
  struct Student * stud;
  int input = 0;
  scanf("%d", & input);
  if (input == 1) {
    createNewStudent(struct Course * myCourse);
  }
}
return 0;

}

void createNewStudent(struct Course * myCourse) {
  struct Student s1;
  printf("Enter name: ");
  scanf("%[^\n]%*c", s1.name);
  printf("Enter Surname: ");
  scanf("%[^\n]%*c", s1.lastname);
  printf("Enter id: ");
  scanf("%d", & s1.id);
}

Когда вы вызываете функцию с if (input == 1) он дает ошибку: ожидаемое выражение перед 'struct', но я не понимаю этого, потому что * myCourse - это просто указатель на структуру курса, не так ли ???? Если я смогу понять это, я смогу использовать следующие функции, я думаю

Функция правильная ?? Я не знаю, почему это не работает

Хорошо, я попытался использовать struct Student myStudentArray[5];, чтобы получить имя, фамилию, идентификатор (структуры такие же)

void createNewStudent(struct Course *myCourse);
void setGradeOfStudent(struct Course *myCourse);


int main(){

  struct Course *myCourse;

  int input=0;
  scanf("%d",&input);

  if(input == 1){
      createNewStudent(myCourse);

  }

  return 0;

  } 

void createNewStudent(struct Course *myCourse){
  myCourse->currentstudentcount=0;

  printf("Enter name: ");
  scanf("%[^\n]%*c"  
  ,myCourse->myStudentArray[myCourse->currentstudentcount].name);                                                                                      

  printf("Enter Surname: ");
  scanf ("%[^\n]%*c",
  myCourse->myStudentArray[myCourse->currentstudentcount].name);

  myCourse->currentstudentcount++;

  }

Продолжаю получать

может использоваться без инициализации в этом may be used uninitialized in this function [-Wmaybe-uninitialized] и Ошибках сегментации

Ответы [ 3 ]

2 голосов
/ 06 мая 2020
void createNewStudent(struct Course * myCourse)

Если вы хотите создать нового ученика, вы должны использовать структуру ученика в качестве параметра этой функции вместо использования struct Course.

void createNewStudent(struct Student *s1)

Тогда эта функция будет выглядеть как:

void createNewStudent(struct Student *s1) {

  printf("Enter name: ");
  scanf("%49s", s1->name);
  printf("Enter Surname: ");
  scanf("%49s", s1->lastname);
  printf("Enter id: ");
  scanf("%d", & s1->id);
}

Если вы хотите протестировать, в основной функции вы можете объявить значение stud или указатель на struct Student.

Например:

int main() {
  struct Student stud;
  int input = 0;
  scanf("%d", & input);
  if (input == 1) {
    createNewStudent(&stud);
    printf("name: %s\n Surname: %s\n id = %d\n", stud.name, stud.lastname, stud.id);
  }

  return 0;
}

Полная программа для теста:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

struct Student {
  char name[50];
  char lastname[50];
  int id;
  int mid1;
  int mid2;
  int final;
  double average;
};

struct Course {
  char courseName[50];
  char courseCode[50];
  struct Student myStudentArray[5];
  int currentstudentcount;
};

void createNewStudent(struct Student *s1);

int main() {
  struct Student stud;
  int input = 0;
  scanf("%d", & input);
  if (input == 1) {
    createNewStudent(&stud);
    printf("name: %s\nSurname: %s\nid = %d\n", stud.name, stud.lastname, stud.id);
  }


  return 0;
}


void createNewStudent(struct Student *s1) {

  printf("Enter name: ");
  scanf("%49s", s1->name);
  printf("Enter Surname: ");
  scanf("%49s", s1->lastname);
  printf("Enter id: ");
  scanf("%d", & s1->id);
}

Результат:

#./test 
1
Enter name: abc
Enter Surname: def
Enter id: 100
name: abc
Surname: def
id = 100

Обновление для вашего вопроса в комментарии:

Если вы хотите сохранить информацию о студенте в массиве вы можете изменить код на:

struct Student myStudentArray[5];
  int input = 0;
  scanf("%d", & input);
  if (input == 1) {
    for (int i = 0; i < 5; i++) {
        createNewStudent(&myStudentArray[i]);
    }

    for (int i = 0; i < 5; i++) {
        printf("name: %s\nSurname: %s\nid = %d\n", myStudentArray[i].name, myStudentArray[i].lastname, myStudentArray[i].id);
    }
  }

Для Course structure вы можете создать одну функцию как функцию createNewStudent, но для struct Course создать новый курс. После создания 5 новых учеников (например, кода выше) вы можете скопировать myStudentArray в new_course.myStudentArray. Теперь у вас есть информация о 5 студентах из new_course. Когда вы копируете значение из массива в другой, вы можете использовать memcpy или один l oop для копирования каждого элемента из одного массива в другой. Не используйте для массива что-то вроде myStudentArray = new_course.myStudentArray.

1 голос
/ 06 мая 2020

В вашей функции CerateNewStudent правильный способ адресации переменных, в которые помещаются данные, считываемые scanf, должен быть следующим:

myCourse->myStudentArray[myCourse->currentstudentcount].name

как переменная для чтения name. Используйте этот синтаксис для чтения всех элементов данных. После этого увеличьте счетчик:

myCourse->currentstudentcount++;

Примечание: чего не хватает во всех ваших функциях (и в задании?), Так это способ создания курса. Все созданные студенты добавляются к курсам. Сначала должен быть создан курс, а затем к нему могут быть добавлены студенты.

1 голос
/ 06 мая 2020

Вы делаете объявление как параметр функции createNewStudent(). В C функциям в качестве параметров требуются выражения, поэтому вы получили сообщение об ошибке «Ожидаемое выражение ...».

Итак, просто создайте указатель структуры перед вызовом функции:

if (input == 1) {
    struct Course *myCourse = malloc(sizeof(struct Course));
    createNewStudent(myCourse);
}

Обратите внимание на использование malloc(), которое возвращает указатель на место в памяти достаточного размера для хранения этой конкретной структуры Course. При работе с указателями на структуры вам необходимо выделить память для структур, на которые в конечном итоге будут указываться, чтобы избежать разыменования нераспределенных областей памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...