请告诉我如何与结构和子程序进行联运工作?特别是,我在使用 Student 和 Marks 结构以及诸如 action 这样的函数时遇到问题,它对给定的 Student 结构数组执行给定的操作(执行作为参数传递的函数)
主程序
#include <stdio.h>
#include <rpc.h>
int main() {
SetConsoleOutputCP(CP_UTF8); //Windows10
size_t n;
printf("Введите число студентов: ");
scanf("%i", &n);
Student *students = Read_Students(n);
action(students, n, &Sort);
for (size_t i=0;i<n;i++)
printf("%i %i\n",students[i].marks.History,students[i].marks.Math);
return 0;
}
行动.c
#include <rpcndr.h>
void InsertionSort(struct Student *students, int *arr, int n) {
size_t tmpIntElement, location;
Student tmpStudElement;
for (size_t i = 1; i < n; i++) {
tmpIntElement = arr[i];
tmpStudElement = students[i];
location = i - 1;
while (location >= 0 && arr[location] < tmpIntElement) {
arr[location + 1] = arr[location];
students[location + 1] = students[location];
location = location - 1;
}
arr[location + 1] = tmpIntElement;
students[location + 1] = tmpStudElement;
}
}
void Sort(Student *students, int n) {
int *arr = getSredneeArr(students, n);
if (!equals_el(arr, n)) {
InsertionSort(students, arr, n);
}
}
void action(Student *students, int n, void (*f)(Student *,int)) {
f(students,n);
}
函数.c
#include <stdio.h>
#include <dxtmpl.h>
void Read_Student(Student *student) {
printf("\tИмя студента : ");
scanf("%s", student->name);
puts("");
printf("\tФамилия студента : ");
scanf("%s", student->surname);
puts("");
printf("\tОценка студента по\n");
printf("\t\tМатематике = ");
scanf("%i", &student->marks.Math);
printf("\t\tИстории = ");
scanf("%i", &student->marks.History);
puts("");
}
int *getSredneeArr(struct Student *students, int n) {
int *arr = malloc(n * sizeof(int));
for (size_t i = 0; i < n; i++)
arr[i] = (students[i].marks.Math + students[i].marks.History) / 2;
return arr;
}
int equals_el(int *arr, int n) {
size_t i, j;
for (i = 0; i < n - 1; ++i) {
for (j = i + 1; j < n; ++j) {
if (arr[i] == arr[j]) {
break;
}
}
}
return arr[i] == arr[j];
}
Student *Read_Students(int n) {
Student *students;
students = (Student *) malloc(sizeof(Student) * n);
puts("");
for (size_t i = 0; i < n; i++) {
printf("Cтудент %i\n\n", i + 1);
Read_Student(&students[i]);
}
return students;
}
结构体.c
#define MAXBuffer 256
typedef struct Marks {
int Math;
int History;
} Marks;
typedef struct Student {
char name[MAXBuffer];
char surname[MAXBuffer];
int srMark;
Marks marks;
} Student;
出于您的目的,您的文件系统需要稍作调整。:)
如果我是你,我会在调整后留下以下文件:
在studs.h中,根据所有规则,将存储您在structs.c + 中您在actions.c和functions.c中实现的函数原型(稍后我将解释为什么这样做)。
不要忘记包含守卫:)。
结果,头文件可能如下所示(您最好阅读注释):
文件
studs.c只是actions.c和的集合functions.c。您需要将它们组合成一个,因为每个功能都是专门为与学生一起工作而设计的(他们的“阅读”、他们的“分类”等)。如果您编写了一个“.c” - 一个可以对任何类型进行排序的文件(您没有,因为它是 IMO,不可能),那么它可以单独取出,所以 - “netushki”:D
我不会复制粘贴,因为里面应该包含什么已经很清楚了(
actions.c+functions.c,正如我已经写过的那样)。如果
studs.c您需要在其中“包含”某些内容(并且您将 100% 需要在其中包含studs.h ,并且根据代码判断,stdio.h也是如此),那么就在其中执行,不要害羞:)(我忍不住写了这个,因为有些是“害怕”的,只是将例如stdio.h包含在头文件中,在那里不需要它,只是不要在“.c”中包含任何内容文件)
如果您不知道,那么以后我会注意到自定义头文件已经使用双引号连接,而不是字符 "<" 和 ">" :
如果您有一个gcc编译器,并且您的头文件与其余代码位于同一位置,那么您可以像这样编译它:
-pedantic(我强烈推荐使用,-Wall和键-Werror来保持你的代码更简洁和更高效)一些我以前没有写给你的笔记:
Read_Student在内部使用Read_Students但没有在其他地方使用,因此添加static. 你也可以 看这里。考虑所有情况,并正确实现您的功能。祝你好运 :)
UPD:这是另一个链接,您可以查看头文件中的内容。
为了让程序中的所有文件都知道什么结构
Student和Marks是什么,您需要将其重命名为并将其structs.c包含structs.h在所有 .c 文件中你感兴趣吗?