Компилятору необходимо знать, что такое struct student
, при использовании его в другом месте кода, например, объявив функцию с этим типом аргумента / параметра. Компилятор читает исходный файл сверху вниз. Вы должны объявить структуру перед тем, как использовать ее как тип в объявлении функции:
struct student; // forward declaration of structure `student`.
void display(struct student); // ok, because `struct student` is declared before.
void read_student(struct student*); // ok, because `struct student` is declared before.
struct student{ // definition of structure `student`.
int roll;
char name[20],depart[20],sex,result;
float percent,marks[5],total;
};
В качестве альтернативы, вы можете определить структуру перед объявлением функций:
struct student{ // define the structure `student` before the function declarations.
int roll;
char name[20],depart[20],sex,result;
float percent,marks[5],total;
};
void display(struct student);
void read_student(struct student*);
Другим способом было бы поместить определения функций read_student
и display
до main()
, но после определения структуры student
. Таким образом, вы можете опустить отдельные объявления функций read_student
и display
и, конечно, предварительное объявление структуры student
:
#include<stdio.h>
struct student{
int roll;
char name[20],depart[20],sex,result;
float percent,marks[5],total;
};
void read_student(struct student *std){
int c=0,i;
printf("Enter the roll no:");
scanf("%d",&std->roll);
printf("enter the name:\n");
scanf("%s",std->name);
printf("enter Sex:\n");
scanf(" %c",&std->sex);
printf("Enter the department:\n");
scanf("%s",std->depart);
printf("enter the marks in 5 subjects:\n");
for(i=0;i<5;i++){
scanf("%f",&std->marks[i]);
std->total=std->total+std->marks[i];
if(std->marks[i]>=40)
c++;
}
if(c==5)
std->result='p';
else
std->result='f';
std->percent=(std->total/500)*100;
}
void display(struct student st){
printf("\n%2d\t%10s\t\t%c\t%10s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%4.2f\t %2.2f\t\t%c\n",st.roll,st.name,st.sex,st.depart,st.marks[0],st.marks[1],st.marks[2],st.marks[3],st.marks[4],st.total,st.percent,st.result);
}
int main(){
int n;
printf("enter the no of data you want to enter ??");
scanf("%d",&n);
struct student s[n];
for(int i=0;i<n;i++)
read_student(&s[i]);
printf("\n---------------------------------------------------Result Sheet --------------------------------------------------------------------");
printf("\nRoll No.\tName\t\tSex\tDepartment\t\tMarks\t\t\t\tTotal\tPercentage\tResult ");
printf("\n----------------------------------------------------------------------------------------------------------------------------------------");
printf("\n \t\t\t\tA\tB\tC\tD\tE\n");
printf("----------------------------------------------------------------------------------------------------------------------------------------");
for(int i=0;i<n;i++)
display(s[i]);
}
При объявлении Функции, которые вы можете опустить идентификаторы параметров, но не тип параметров.
Также недопустимо использовать структуру student
без предшествующего ключевого слова struct
, как вы его пытались:
void display(student);
, так как вы используете структуру student
по ее определение:
struct student{
...
};
Если вы используете typedef
, например, например:
typedef struct student{
...
} student;
Вы можете опустить ключевое слово struct
, но если вы используете typedef
или просто использовать структуру как есть, это своего рода спор topi c среди сообщества в отношении читабельности. Все ссылки на это вы можете увидеть в ответах на эти вопросы:
typedef struct vs struct определений
Почему мы должны так часто печатать def в C?
Я лично рекомендую продолжать использовать вариант struct
, даже если это требует немного большего набора текста с помощью клавиш, но делает ваш код немного более понятным.