如何在C中打印结构的内容?
我自己解决了这些问题,使用了不同于下面建议的方法!:)强> 感谢您查看我的问题!:) 我一直在学习关于结构的知识,并在C语言的实践实验室工作,我的代码似乎没有经过任何修改而正确编译。目前我没有收到任何输出,程序崩溃。在将“*”和“&”符号传递到函数中时,如何正确使用它们,我仍然非常困惑。我的目标是:如何在C中打印结构的内容?,c,struct,printf,average,C,Struct,Printf,Average,我自己解决了这些问题,使用了不同于下面建议的方法!:) 感谢您查看我的问题!:) 我一直在学习关于结构的知识,并在C语言的实践实验室工作,我的代码似乎没有经过任何修改而正确编译。目前我没有收到任何输出,程序崩溃。在将“*”和“&”符号传递到函数中时,如何正确使用它们,我仍然非常困惑。我的目标是: 以与数据文件相同的格式打印数组的内容 打印具有最佳GPA的学生的全名 计算并打印平均GPA 打印GPA高于平均水平的所有学生的姓名 打印平均成绩低于平均水平的最年轻学生的姓名 将数组中的结构按从低到高
- 以与数据文件相同的格式打印数组的内容
- 打印具有最佳GPA的学生的全名
- 计算并打印平均GPA
- 打印GPA高于平均水平的所有学生的姓名
- 打印平均成绩低于平均水平的最年轻学生的姓名
- 将数组中的结构按从低到高的顺序排序 平均成绩
- 再次打印阵列(现在的顺序与上次不同 时间)
#include <stdio.h>
#include <stdlib.h>
// define constants
#define ARR 100
#define FIRST 7
#define MIDINIT 1
#define LAST 9
#define STREET 16
#define CITY 11
#define STATE 2
#define ZIP 5
#define AGE 3
#define GPA 4
#define START 0
#define FIRSTID 8
#define INITID 10
#define STREETID 20
#define CITYID 37
#define STATEID 49
#define ZIPID 52
#define AGEID 57
#define GPAID 64
// defined structs
typedef struct {
char street[STREET + 1];
char city[CITY + 1];
char state[STATE + 1];
char zip[ZIP + 1];
} Address;
typedef struct {
char firstname[FIRST + 1];
char initial[MIDINIT + 1];
char lastname[LAST + 1];
Address ofstudent;
int age;
double gpa;
} Student;
// function prototype
void strsub(char buf[], char s[], int start, int size);
void processStudent(int *id, Student students[]);
void sortStudentGpa(Student *students, int id);
void maxGpa(Student *students, int id);
/* lab6student.c: creates an array of student structures and outputs reports */
int main(void)
{
Student students[ARR]; // creates an array of student structures
int id = 0; // counter for student
processStudent(&id, students);
maxGpa(students, id);
}
void strsub(char buf[], char s[], int start, int size) {
int i;
for (i = 0; i < size && buf[start + i] != '\0'; i++) {
// loops as long as iterator is less than size
// and while string has not run out of characters
s[i] = buf[i + start];
}
s[i] = '\0';
}
/* void sort(Student *students, int id) {
int j, i;
for(i = 1; i < n; i++) {
for(j = 0; j < id - i; j++) {
if(students[j].gpa > students[j + 1].gpa) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
} */
void processStudent(int *id, Student students[]) {
FILE *data;
char line[ARR];
*id = 0; // counter for student
data = fopen("Students.dat", "r");
if (data == NULL) {
printf("Students.dat file not found!\n");
exit(1);
}
// process file
while (!feof(data)) {
// organize student info into separate arrays
fgets(line, ARR, data);
strsub(line, students[*id].firstname, START, FIRST);
strsub(line, students[*id].initial, FIRSTID, MIDINIT);
strsub(line, students[*id].lastname, INITID, LAST);
strsub(line, students[*id].ofstudent.street, STREETID, STREET);
strsub(line, students[*id].ofstudent.city, CITYID, CITY);
strsub(line, students[*id].ofstudent.state, STATEID, STATE);
strsub(line, students[*id].ofstudent.zip, ZIPID, ZIP);
students[*id].age = atoi(&line[AGEID]);
students[*id].gpa = atoi(&line[GPAID]);
(*id)++;
}
fclose(data);
}
//sorts struct student array containing num (gpa) elements into
//ascending order
void sortStudentGpa(Student *students, int id) {
int i, j; // indexes into unsorted and sorted partitions
Student temp; // temporarily holds an element from the array
for (i = 1; i < id; ++i) {
temp = students[i];
j = i - 1;
while (j >= 0 && temp.gpa < students[j].gpa) {
students[j + 1] = students[j];
j = j - 1;
}
students[j + 1] = temp;
}
}
void maxGpa(Student *students, int id) {
int iwithmax, i;
float max = 0;
for ( i = 0 ; i < id ; i++) {
if (students -> gpa > max) {
max = students -> gpa;
iwithmax = i;
}
}
printf("\n\nHighest GPA is done by Student %d with GPA = %f", iwithmax, max);
}
#包括
#包括
//定义常数
#定义ARR 100
#定义前7个
#定义MIDINIT 1
#定义最后9个
#定义街道16
#定义城市11
#定义状态2
#定义ZIP 5
#定义年龄3
#定义GPA 4
#定义开始0
#定义FIRSTID8
#定义INITID 10
#定义streetid20
#定义城市ID 37
#定义stateid49
#定义Zipd52
#定义年龄57
#定义GPAID 64
//定义结构
类型定义结构{
查尔街[街+1];
char city[城市+1];
字符状态[状态+1];
char-zip[zip+1];
}地址;
类型定义结构{
char firstname[FIRST+1];
字符首字母[MIDINIT+1];
char lastname[LAST+1];
学生地址;
智力年龄;
双gpa;
}学生;
//功能原型
void strsub(char buf[],char s[],int start,int size);
void processStudent(int*id,Student-students[]);
无效sortStudentGpa(学生*学生,国际id);
无效maxGpa(学生*学生,整数id);
/*lab6student.c:创建学生结构数组并输出报告*/
内部主(空)
{
学生[ARR];//创建学生结构数组
int id=0;//学生计数器
processStudent(&id,students);
maxGpa(学生,id);
}
void strsub(字符buf[],字符s[],整数开始,整数大小){
int i;
对于(i=0;istudents[j+1].gpa){
学生临时工=学生[j];
学生[j]=学生[j+1];
学生[j+1]=临时工;
}
}
}
} */
无效进程学生(int*id,学生[]){
文件*数据;
字符行[ARR];
*id=0;//学生计数器
数据=fopen(“学生数据”,“r”);
如果(数据==NULL){
printf(“未找到Students.dat文件!\n”);
出口(1);
}
//进程文件
而(!feof(数据)){
//将学生信息组织到单独的数组中
fgets(线路、ARR、数据);
strsub(行,学生[*id].firstname,START,FIRST);
strsub(行,学生[*id]。首字母,首字母,中间字母);
strsub(行,学生[*id].lastname,INITID,LAST);
strsub(行,学生[*id]。of student.street,streeted,street);
strsub(行,学生[*id]。of student.city,CITYID,city);
strsub(行,学生[*id].ofstudent.state,STATEID,state);
strsub(行,学生[*id].ofstudent.zip,ZIPID,zip);
学生[*id].age=atoi(&line[AGEID]);
学生[*id].gpa=atoi(&line[GPAID]);
(*id)++;
}
fclose(数据);
}
//将包含num(gpa)元素的struct student数组排序为
//升序
无效sortStudentGpa(学生*学生,内部id){
int i,j;//索引到未排序和已排序的分区中
Student temp;//临时保存数组中的元素
对于(i=1;i=0&&temp.gpa平均成绩>最高成绩){
max=学生->平均成绩;
iwithmax=i;
}
}
printf(“\n\n最高GPA由学生%d完成,GPA=%f”,iwithmax,max);
}
在maxGpa函数中,只需将定义更改为
void maxGpa(Student *students, int id);
然后在maxGpa函数中执行以下更改
void maxGpa(Student *students, int id) {
int iwithmax, i;
float max = 0;
for ( i = 0 ; i < id ; i++) {
if (students -> gpa > max) {
max = students -> gpa;
iwithmax = i;
}
}
void maxGpa(学生*Student,int-id){
国际iwithmax,i;
浮动最大值=0;
对于(i=0;i平均成绩>最高成绩){
max=学生->平均成绩;
iwithmax=i;
}
}
尝试此操作….使用调试器。在启用警告的情况下编译。我发现很可能没有编译器错误(
我的代码似乎没有正确编译
)。重新开始并逐步添加部分代码以查看错误所在。校园中可能有人愿意深入研究并调试您的代码,但Stackoverflow不是。请不要一次问两个问题。这将如何帮助其他搜索的人?在这个过程中,您将为学生函数分配地址id为0。因此您必须分配值而不是地址。*id=0;然后执行代码。@remyabel噢,我不认为我的代码应该工作!我使用的是deb