2015-04-16 4 views
2

Итак, я застрял в том, как правильно отладить эту программу и запустить ее. Может ли кто-нибудь пролить свет. Предположим, что отсортировать массив или имена, а затем массив возрастов.Ошибки программы Broken. ОБНОВЛЕННЫЙ КОД

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); 

бесплатных печенья для тех, кто может получить это запустить :) **

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

'void bubblesortname (char fullname [] [25] (или char (* fullname) [25]), int * age (или int age []), int size);' – BLUEPIXY

+1

также 'fgets (fullname [i ], 40, stdin); ': 40 слишком велико. – BLUEPIXY

+0

Подожди, я в замешательстве. Какая разница между двумя? – SaturdaycityEZ

ответ

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) вы не можете назначать строки друг другу, вы должны скопировать stri ng-to-string, и (3) fflush(stdin) никогда не является правильным, в результате чего возникает Неопределенное поведение.

+0

По крайней мере, у меня есть хороший печенье. –

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 (element), поэтому нет указателей на свопинг, просто данные.

Увы, вы решаете, и вы решили, что будете играть в полном порядке.

Для того, чтобы работать, вы будете нуждаться в 26 байт (25 символов + отставая '\0') временное поле внутри вас bubblesortname() функции:

char temp[25]; 

После того, как вы нашли что вам нужно поменять местами две строки, выполните следующие действия:

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

(не забудьте поменять свои возрастные значения и сохранить все в синхронизации).

Фикс, что сами, и вы можете хранить ваши печенья;)

+0

Подождите, так как это правильный путь к функции fullname? – SaturdaycityEZ

+0

Каков правильный способ перечислить мою функцию fullname? – SaturdaycityEZ

+0

у вас есть всякая информация, необходимая для исправления вашей программы. Просто продолжайте и делайте это. – mfro