#include <stdio.h>
#include <string.h>
void bubble_sort_grades(char [], int);
int main(void)
{
int menuswitch=1;
int amountofstudents;
int i;
int z;
char studentinfo[100];
char fname[50][100];
char lname[50][100];
char grade[50][100];
printf("Enter Amount of Students: ");
scanf("%d ", &amountofstudents);
for (i=0;i<amountofstudents;i++)
{
fgets(studentinfo, sizeof(studentinfo), stdin);
strcpy(fname[i], strtok(studentinfo, " "));
strcpy(lname[i], strtok(NULL, " "));
strcpy(grade[i], strtok(NULL, " "));
}
while (menuswitch==1)
{
int answer;
printf("Enter 1 for Alphabetical Sort (First Name) \n");
printf("Enter 2 for Alphabetical Sort (Last Name) \n");
printf("Enter 3 for Score Sort \n");
printf("Enter 0 to exit \n");
printf("Enter choice now: ");
scanf("%d", &answer);
if (answer==1)
{
bubble_sort_grades(grade,amountofstudents);
printf("%s\n", grade[0]);
printf("%s\n", grade[1]);
}
if (answer==2)
{
printf("In 2 \n");
}
if (answer==3)
{
printf("In 3 \n");
}
if (answer==0)
{
printf("Ending Program \n");
menuswitch=0;
}
}
}
void bubble_sort_grades(char grades2[], int amount)
{
int c, d , t;
for (c=0; c<(amount); c++)
{
for (d=0; d<amount-1; d++)
{
if (grades2[c]>grades2[d+1])
{
t=grades2[d+1];
grades2[d+1]=grades2[d];
grades2[d]=t;
}
}
}
}
很抱歉提出其他问题,但我需要有关气泡分类的帮助。我创建了一个函数,用于对输入中的学生成绩进行冒泡。然而,当我这样做时,我只得到排序的第一年级而不是数组。
Input:
John Smith 86
Victor Jones 76
输出: 68 76
答案 0 :(得分:3)
这里有两个主要问题。
问题1:数组索引不正确
正如@TWhite已经指出的那样,bubble-sort函数的参数类型错误。您已声明您的数组类型为char[50][100]
,这意味着它将50 * 100个字符分配为内存中的单个大块。如果grade
分配了baseAddr
的内存,则grade[0]
位于baseAddr+0
,grade[1]
位于baseAddr+100
,grade[2]
在baseAddr+200
等等。如果你没有告诉bubble_sort_grades
你的二维数组的最后一个维度,那么就无法计算这些指数。将bubble_sort_grades
的签名更改为void bubble_sort_grades(char[][100], int)
可以解决该问题。
问题2:您正在存储c字符串,但将它们视为整体
grade
数组是一个c字符串数组(char*
)。它存储字符,而不是整数。这意味着这一行完全错误:if (grades2[c]>grades2[d+1])
( 旁注:请注意,您使用c
代替d
作为第一个索引,这也是一个错误)。如果你想比较字符串,你应该使用strcmp
,因为比较两个char*
值将与>
运算符进行指针比较。但是,使用strcmp
要求所有成绩都是2位数(例如05
而不是5
),否则字符串"9"
将大于"80"
。由于成绩是c字符串,这也意味着t=grades2[d+1]
完全不正确,因为您将char*
存储到int
中。您需要创建一个临时缓冲区char t[100]
,然后使用strcpy
而不是通过分配来复制内容。
我喜欢@ chux关于使用struct
的建议。使用结构体还具有在使用=
运算符时自动(正确)处理复制整个结构的额外好处。我打算提出类似的建议,并且实际上建议使用内置的qsort
例程,但我意识到这可能是功课,你可能还没有覆盖结构。在这种情况下,更改grade
数组以存储整数而不是c字符串可能更容易。
答案 1 :(得分:2)
许多问题
而不是
char fname[50][100];
char lname[50][100];
char grade[50][100];
使用结构
typedef struct {
char fname[100];
char lname[100];
char grade[100];
} Student_t;
Student_t Student[50];
在bubble_sort_grades()
内,使用strcmp()
来比较名称。
void bubble_sort_grades(Student_t Student[], int amount) {
int c, d;
for (c = 0; c < (amount); c++) {
for (d = 0; d < amount - 1; d++) {
if (strcmp(Student[d].grade, Student[d+1].grade) > 0) {
Student_t t;
t = Student[d];
Student[d + 1] = Student[d];
Student[d] = t;
}
}
}
}
还存在其他一些重要问题,但这应该会让OP继续下去。
答案 2 :(得分:1)
一个问题是你的:
void bubble_sort_grades(char [], int);
应改为:
void bubble_sort_grades(char *[], int);
考虑对所有数组使用char *[]
。