破碎的泡泡排序程序错误。更新的代码

时间:2015-04-16 10:35:57

标签: c arrays bubble-sort

所以我被困在如何正确调试这个程序并让它运行。任何人都可以有所了解。假设对一个或多个数组进行排序,然后对一组年龄进行排序。

prog.c: In function 'main':
prog.c:24:22: warning: passing argument 1 of 'bubblesortname' from incompatible pointer type
       bubblesortname(fullname,age,SIZE);
                      ^
prog.c:9:8: note: expected 'char **' but argument is of type 'char (*)[25]'
       void bubblesortname(char *fullname[], int *age, int size);

任何可以运行此操作的人都可以免费使用Cookie **

    #define SIZE 5
    #include <stdio.h>
    #include <string.h>
    #include <stdio.h>


    void input(char fullname[][25], int age[]);
    void output(char fullname[][25], int age[]);
    void bubblesortname(char fullname[][25], int *age, int size);
    void bubblesortage(char fullname[], int *age, int size);

    int main(int argc, char *argv[]) 
    {
        char fullname[SIZE][25];
        int age[SIZE];



        // promt user for names and ages
        input(fullname, age);
        //output unsorted names and ages
        output(fullname, age);

        bubblesortname(fullname,age,SIZE);

        output(fullname, age);

        //sorts age
        bubblesortage(fullname,age,SIZE);
        //
        output(fullname, age);


        return 0;
    }

    void input(char fullname[][25], int age[]) 
    {
        int i;
        for (i = 0; i < SIZE; i++) 
        {
            fflush(stdin);
            printf("Enter a full name\n");
            //scanf("%[\^n]\n", fullname[i]);
            fgets (fullname[i],40, stdin);
            printf("Enter the age\n");
            scanf("%d", &age[i]);

        }
    }

    void output(char fullname[][25], int age[]) 
    {
        int i;
        for (i = 0; i < SIZE; i++)
            printf("%s, %d\n", fullname[i], age[i]);
    }//end function

    void bubblesortname(char fullname[][], int *age, int size)
    {
         int temp_age;
          char* temp_name;
          int j,i;

          for (i = 0; i < SIZE - 1; ++i) 
          {
            for (j = 0; i < SIZE - 1; ++j) 
            {
              if (strcmp(fullname[j], fullname[j + 1]) > 0) 
              {
                temp_age = age[i];
                age[j] = age[j + 1];
                age[j + 1] = temp_age;

                temp_name = fullname[j];
                fullname[j] = fullname[j + 1];
                fullname[j + 1] = temp_name;


                 }//end if

            }//end inner for

        }//end for

    }//end function

            bubblesortage(char fullname[][], int *age, int size) 
            {
                int j,i;
                int temp_age;
                char* temp_name;
                char temp[25];
                    for (i = 0; i < size - 1; ++i) 
                      {
                         for (j = 0; j < size - 1; ++j) 
                            {
                                 if (age[j] > age[j + 1]) 
                                  {
                                    strcpy(temp, fullname[<index1>]);
                                    strcpy(fullname[index1], fullname[index2]);
                                    strcpy(fullname[index2], temp);
                                    temp_age = age[j];
                                    age[j] = age[j + 1];
                                    age[j + 1] = temp_age;
                                    temp_name = fullname[j];
                                    fullname[j] = fullname[j + 1];
                                    fullname[j + 1] = temp_name;

                                    }// end inner for

                            }// end outer for


                        }// end function

2 个答案:

答案 0 :(得分:3)

给我该死的饼干:)

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

#define SIZE 5

void input (char fullname[][25], int age[]);
void output (char fullname[][25], int age[]);
void bubblesortname (char fullname[][25], int *age, int size);
void bubblesortage (char fullname[][25], int *age, int size);
void fflush_stdin();

int main (void)
{
    char fullname[SIZE][25];
    int age[SIZE];

    // promt user for names and ages
    input (fullname, age);

    //output unsorted names and ages
    printf ("\n input provided:\n\n");
    output (fullname, age);

    // sorts by name
    bubblesortname (fullname, age, SIZE);

    printf ("\n sorted by name:\n\n");
    output (fullname, age);

    //sorts age
    bubblesortage (fullname, age, SIZE);

    printf ("\n sorted by age:\n\n");
    output (fullname, age);


    return 0;
}

void input (char fullname[][25], int age[])
{
    int i = 0;
    size_t nchr = 0;
    for (i = 0; i < SIZE; i++) {
        printf ("\nEnter a full name: ");
        if (fgets (fullname[i], 24, stdin) != NULL)
        {
            nchr = strlen (fullname[i]);
            while (nchr > 0 && (fullname[i][nchr -1] == '\n' || fullname[i][nchr -1] == '\r'))
                fullname[i][--nchr] = 0;
        }
        printf ("Enter the age    : ");
        scanf ("%d", &age[i]);
        fflush_stdin();
    }
}

void output (char fullname[][25], int age[])
{
    int i;
    for (i = 0; i < SIZE; i++)
        printf (" %-30s, %d\n", fullname[i], age[i]);
}               //end function

void bubblesortname (char fullname[][25], int *age, int size)
{
    int j = 0, i = 0;
    int temp_age = 0;
    char temp_name[25] = {0};

    for (i = 0; i < size - 1; ++i) {
        // for (j = 0; i < size - 1; ++j) {
        for (j = 0; j < size - 1 - i; ++j) {
            if (strcmp (fullname[j], fullname[j + 1]) > 0) {
                temp_age = age[j + 1];
                age[j + 1] = age[j];
                age[j] = temp_age;

                strcpy (temp_name, fullname[j + 1]);
                strcpy (fullname[j + 1], fullname[j]);
                strcpy (fullname[j], temp_name);
            }           //end if
        }           //end inner for
    }               //end for
}               //end function

void bubblesortage (char fullname[][25], int *age, int size)
{
    int j = 0, i = 0;
    int temp_age = 0;
    char temp_name[25] = {0};

    for (i = 0; i < size - 1; ++i) {
        // for (j = 0; j < size - 1; ++j) {
        for (j = 0; j < size - 1 - i; ++j) {
            if (age[j] > age[j + 1]) {
                temp_age = age[j + 1];
                age[j + 1] = age[j];
                age[j] = temp_age;

                strcpy (temp_name, fullname[j + 1]);
                strcpy (fullname[j + 1], fullname[j]);
                strcpy (fullname[j], temp_name);
            }           // end inner for
        }           // end outer for
    }               // end function
}

void fflush_stdin()
{ int c; while ((c = getchar()) != '\n' && c != EOF); }

<强>输出

$ ./bin/freecookies

Enter a full name: George Carver
Enter the age    : 143

Enter a full name: Albert Einstein
Enter the age    : 115

Enter a full name: Ma Ferguson
Enter the age    : 131

Enter a full name: George Charles Butte
Enter the age    : 116

Enter a full name: Alexander Hamilton
Enter the age    : 277

 input provided:

 George Carver                 , 143
 Albert Einstein               , 115
 Ma Ferguson                   , 131
 George Charles Butte          , 116
 Alexander Hamilton            , 277

 sorted by name:

 Albert Einstein               , 115
 Alexander Hamilton            , 277
 George Carver                 , 143
 George Charles Butte          , 116
 Ma Ferguson                   , 131

 sorted by age:

 Albert Einstein               , 115
 George Charles Butte          , 116
 Ma Ferguson                   , 131
 George Carver                 , 143
 Alexander Hamilton            , 277

说真的,你遇到的问题是(1)你对泡泡排序的索引是完全错误的,(2)你不能互相分配字符串,你必须复制字符串到字符串,和(3){{1永远不会导致未定义的行为

答案 1 :(得分:1)

您的计划有几个问题:

首先,您的函数原型与您稍后提供的函数不匹配:

void input(char fullname[25], int age[]);

不符合

void input(char fullname[][25], int age[]) 

void output(char fullname[25], int age[]);

不符合

void output(char fullname[][25], int age[])

void bubblesortname(char *fullname[][25], int *age, int size);

不符合

void bubblesortname(char *fullname[], int *age, int size)

最后

void bubblesortage(char *fullname[], int *age, int size);

bubblesortage(char *fullname[], int *ages, int size)

也不匹配(请注意默认返回类型,默认为int)。

您需要修复所有这些以匹配。

接下来,您需要决定要排序的,或者更具体地说,如果您认识到必须交换两个字符串,那么您想要移动哪些数据。

最初设置数据结构的方式(一个大的二维数组)意味着你想要对全长的单个字符串进行排序,而不是指向字符串的指针(因为你必须交换它们会更有效率)只有两个指针,而不是2 x 26个字节)。

二维数组只是行x列x sizeof(元素)的内存区域,因此没有指向交换的指针,只有数据。

唉,你决定并且你决定完整的字符串。

要使其工作,您需要在'\0'函数中包含26个字节(25个字符+尾随bubblesortname())临时字段:

char temp[25];

一旦发现需要交换两个字符串,请执行以下操作:

strcpy(temp, fullname[<index1>]);
strcpy(fullname[index1], fullname[index2]);
strcpy(fullname[index2], temp);

(不要忘记交换年龄值以保持一切同步)。

自行修复,你可以保留你的cookies;)