1
#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

4

3 回答 3

3

这里有两个主要问题。

问题 1:不正确的数组索引

正如@TWhite 已经指出的那样,冒泡排序函数的参数类型错误。您已将数组声明为 type char[50][100],这意味着它将 50*100 个字符分配为内存中的单个大块。如果您的内存grade分配在 at baseAddr,那么grade[0]是 at baseAddr+0grade[1]is at baseAddr+100grade[2]is atbaseAddr+200等。如果您不告诉bubble_sort_grades2D 数组的最后一个维度,那么它就无法计算这些索引。更改 to 的签名bubble_sort_gradesvoid 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]完全不正确,因为您将 a 存储char*int. 您需要创建一个临时缓冲区char t[100],然后使用strcpy而不是通过分配复制东西。


我喜欢@chux 关于使用struct. 使用 structs 具有在使用运算符时自动(正确)处理复制整个结构的额外好处=。我打算提出类似的建议,实际上建议使用内置qsort例程,但我意识到这可能是家庭作业,您可能还没有涵盖结构。grade在这种情况下,将数组更改为存储整数而不是 c 字符串可能更容易。

于 2013-10-15T22:17:19.790 回答
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 继续下去。

于 2013-10-15T21:45:06.567 回答
1

一个问题是你的:

void bubble_sort_grades(char [], int); 

应改为:

void bubble_sort_grades(char *[], int); 

考虑char *[]用于所有阵列。

于 2013-10-15T21:48:57.010 回答