gpt4 book ai didi

c - 填充学生分数的问题

转载 作者:行者123 更新时间:2023-11-30 21:30:35 26 4
gpt4 key购买 nike

这是为了回应我前几天发布的类似威胁,将文件读入必要的数据结构,其中包含文件数据,我不记得是谁说的,但是的,有四个主题。 (我想对所有回复进行总体回复,但只能对每个帖子发表评论):

131782 数学 59

075160 数学92

580313物理63

073241 数学32

487476 数学 73

075160 物理 98

472832 英语 44

...

我现在使用 fscanf() 来解析数据,这是一个更好的方法。我昨天做了另一个关于删除重复字符串的主题。我现在放弃了这个想法,只是对学生 ID 使用 qsort 并创建了一个 for 循环,该循环跳过每四个元素并将唯一的学生 ID 放入结构中。我之前执行了 printf() 命令,它们已成功存储。现在我已经存储了 ID,我现在准备搜索该 ID 并填充它们的标记,我“认为”它几乎就在那里,除了 update_student() 函数内部的一个小问题。

如果您查看我的代码,甚至编译它,您会发现它不喜欢应该填充学生标记的行,student_data[idx].marks[buffer_subjects]=marks。但是 buffer_subjects 是一个字符串,但如果你看看我的定义,这些字符串是常量,这就是到达这个阶段的整个想法。

我该如何解决这个问题?

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

#define STUDENTS 20

#define COMPUTING 0
#define ENGLISH 1
#define MATHEMATICS 2
#define PHYSICS 3
#define SUBJECTS 4


#define ROWS 80
#define SIZE 100

int string_compare(void const *x, void const *y)
{
return strcmp(*(char**)x, *(char**)y);
}

struct student
{
char student_ID[SIZE];
int marks[SUBJECTS];
};struct student student_data[STUDENTS];

int find_student(char buffer_IDs[])
{
int j;

for(j=0;j<STUDENTS;j++)
if(strcmp(student_data[j].student_ID,buffer_IDs)==0)
return j;
}

void update_student(char buffer_IDs[], char buffer_subjects[], int marks[])
{
int idx = find_student(buffer_IDs);


student_data[idx].marks[buffer_subjects] = marks;
}


int main(void)
{
FILE *input;
int i,j, data_items;
char buffer_IDs[ROWS][SIZE];
char buffer_subject[ROWS][SIZE];
int marks[ROWS][SIZE];
char *string_ptrs[ROWS];



if((input=fopen("C:\\marks\\marks.txt","r"))==NULL)
perror("File open failed!");
else
{
for(i=0;i<ROWS;i++)
{
while((data_items=fscanf(input, "%s %s %d", buffer_IDs[i], buffer_subject[i], marks[i])!=3));
printf("%s %s %d\n", buffer_IDs[i], buffer_subject[i], *marks[i]);


string_ptrs[i]=buffer_IDs[i];
}

putchar('\n');

qsort(string_ptrs, sizeof(string_ptrs)/sizeof(char*), sizeof(char*), string_compare);

for(i=0;i<ROWS;i=i+4)
{
j=0;
strcpy(student_data[j].student_ID,string_ptrs[i]);

printf("%s\n",student_data[j].student_ID);
j++;
}

for(i=0;i<ROWS;i++)
update_student(buffer_IDs[i], buffer_subject[i], marks[i]);



}
return 0;
}

> Blockquote

最佳答案

这段代码中有很多错误。我强烈建议逐 block 构建它,并使用调试器来确认每个阶段的数据是否符合预期,直到每个较低级别的 block 工作(并且不会产生编译错误)为止才继续。

使用一些示例数据通过 GDB 运行它,即使在从磁盘上的文件读入和解析数据时也会出现问题。

我们可以协助解决此方法中出现的个别问题。

关于c - 填充学生分数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com