2013-07-17 3 views
1

Я пишу программу в алфавитном порядке ввода имен и возрастов. Возраст вводится отдельно, поэтому я знаю, что мне нужно использовать массив указателей, чтобы связать возрасты с массивом имен, но я не могу понять, как это сделать. Есть идеи?Проблема с массивом указателей

Пока что моя программа только в алфавитном порядке имен.

/* program to alphabetize a list of inputted names and ages */ 

#include <stdio.h> 
#define MAXPEOPLE 50 
#define STRSIZE 

int alpha_first(char *list[], int min_sub, int max_sub); 
void sort_str(char *list[], int n); 

int main(void) 
{ 
    char people[MAXPEOPLE][STRSIZE]; 
    char *alpha[MAXPEOPLE]; 
    int num_people, i; 
    char one_char; 

    printf("Enter number of people (0...%d)\n> ", MAXPEOPLE); 
    scanf("%d", &num_people); 

    do 
     scanf("%c", &one_char); 
    while (one_char != '\n'); 

    printf("Enter name %d (lastname, firstname): ",); 
    printf("Enter age %d: ",); 
    for (i = 0; i < num_people; ++i) 
     gets(people[i]); 

    for (i = 0; i < num_people; ++i) 
     alpha[i] = people[i]; 
    sort_str(alpha, num_people); 

    printf("\n\n%-30s5c%-30s\n\n", "Original List", ' ', "Alphabetized List"); 

    for (i = 0; i < num_people; ++i) 
     printf("-30s%5c%-30s\n", people[i], ' ', alpha[i]); 

    return(0); 
} 

int alpha_first(char *list[], int min_sub, int max_sub) 
{ 
    int first, i; 

    first = min_sub; 
    for (i = min_sub + 1; i <= max_sub; ++i) 
     if (strcmp(list[i], list[first]) < 0) 
      first = i; 

    return (first); 
} 

void sort_str(char *list[], int n) 
{ 
    int fill, index_of_min; 
    char *temp; 

    for (fill = 0; fill < n - 1; ++fill){ 
     index_of_min = alpha_first(list, fill, n - 1); 

     if(index_of_min != fill){ 
      temp = list[index_of_min]; 
      list[index_of_min] = list[fill]; 
      list[fill] = temp; 
     } 
    } 
} 
+1

Вы ищете структуру данных [хеш-таблицы] (http://en.wikipedia.org/wiki/Hash_table)? –

+2

Эй, это много кода, есть ли какие-то фрагменты этого, которые можно опустить? Я гораздо охотнее помогу, когда мне не нужно пытаться читать 50 строк uncommented C. – jozefg

+0

@ H2CO3 Похоже, что это сработает, но это для класса, и мы еще не узнали о хэш-таблицах. Мой профессор поручил нам «создать массив указателей на символы для хранения адресов имен в массиве имен изначально», а затем «использовать другой массив указателей для возраста массива, чтобы убедиться, что возраст соответствует правильному имени». –

ответ

0

Создание на структуру, вероятно, будет легче: то есть

struct person { 
    char name[STRSIZE]; 
    int age; 
} 

В противном случае, если вы должны делать это так, как вы пытаетесь, просто создать дополнительный массив индексов. Когда вы перемещаете имя, вы также перемещаете индекс по массиву ... когда вы делаете сортировку имен, просто сортируйте возрасты, чтобы они соответствовали индексам.

1

Большинством вашего printfs являются синтаксическими ошибками, как в

printf("Enter name %d (lastname, firstname): ",); 
printf("Enter age %d: ",); 

или бомб сразу, так как вы передаете Int (' ') в качестве указателя:

printf("\n\n%-30s5c%-30s\n\n", "Original List", ' ', "Alphabetized List"); 

В качестве первого шага, получите все% s и показать нам, что вы действительно скомпилирован, а не какой-то случайный мусор. И повышайте уровень предупреждения своего компилятора до максимума, вам это нужно! Что

#define STRSIZE 

должен иметь в виду, когда STRSIZE используется как arary измерение? У вас серьезная проблема с патчем &.

Смежные вопросы