расположить строки в алфавитном порядке - PullRequest
0 голосов
/ 12 июля 2010

/ * написать программу для сортировки имен, введенных в массив в порядке возрастания * / Когда я ввожу имена в массив, программа останавливается. Никто не знает почему?

#include<stdio.h>
#include<string.h>
void main(void)
{
/*  write a program to sort names entered in an array in ascending order */
    int in,out,i,x;
    char temp[30],string2d[5][30];
    printf("ENTER NAMES IN THE ARRAY:");
    for(i=0;i<5 ;i++)
    {
        gets(string2d[i]);
    }
        for(out=0;out<5-1;out++)
        {
            for(in=out+1;out<5;in++)
            {
                x=strcmpi(string2d[out],string2d[in]);
                if(x>1)
                {
                    strcmpi(temp,string2d[out]);
                    strcmpi(string2d[out],string2d[in]);
                    strcmpi(string2d[in],temp);
                }
            }
        }

    for(i=0;i<5;i++)
    {
        puts(string2d[i]);
    }
    getch();
}

Я видел комментарии и внес изменения в настоящую программу, но программа все еще находится в цикле между циклом in и i

Ответы [ 7 ]

5 голосов
/ 12 июля 2010

На самом деле проблема, кажется, на линии

for(in=out+1;out<5;in++)

Вы увеличиваете, но проверяете, меньше ли 5. 5. 1004 *

1 голос
/ 12 июля 2010

Я подозреваю, что бесконечный цикл:

for(in=out+1;out<5;in++)
{
    x=strcmpi(string2d[out],string2d[in]);
    if(x>1)
    {
        strcmpi(temp,string2d[out]);
        strcmpi(string2d[out],string2d[in]);
        strcmpi(string2d[in],temp);
    }
}

Ваше состояние цикла out < 5 никогда не изменяется, я подозреваю, что вы имели в виду in < 5.

Также, как упоминалось ранее, вы, вероятно, используете strcmpi вместо strcpy. Кроме того, strcmp* возвращает целое число, меньшее, равное или большее 0, ваш код сравнивает это с 1

0 голосов
/ 12 июля 2010

Один метод с использованием qsort (проверено):

#include <stdio.h>
#include <stdlib.h>

#include <string.h>

//Changeable constants
const size_t MAX_LENGTH = 100;
const size_t N_NAMES = 10;

//Simple alias for lazy ones
typedef char String[MAX_LENGTH];

//fgets keeps the \n at the end of the
//returned string : this function removes it
void remove_end_rc(char * const string) {
    size_t const len = strlen(string);
    if(len && string[len-1] == '\n')
        string[len-1] = '\0';
}

//Input function
void ask_names(String names[N_NAMES]) {
    for(size_t i = 0 ; i < N_NAMES ; ++i) {
        printf("Name %u ? ", i+1);

        fgets(names[i], MAX_LENGTH, stdin);
        remove_end_rc(names[i]);
    }
}

//Output function
void print_names(String const names[N_NAMES]) {
    printf("Sorted :\n");

    for(size_t i = 0 ; i < N_NAMES ; ++i) {
        printf("%u) %s\n", i+1, names[i]);
    }
}

int alpha_cmp(void const *str1, void const *str2 ) {
    return strcmp((char const*)str1,(char const*)str2);
}

int main(void) {

    String names[N_NAMES] = {""};

    ask_names(names);
    //Sort alphabetically using strcmp
    qsort(names, N_NAMES, MAX_LENGTH, alpha_cmp);
    print_names(names);

    return 0;
}

Другой метод без qsort (), использующий пузырьковый алгоритм:

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

/** Types *************************************/

//Changeable constants
#define MAX_LENGTH 100
#define N_NAMES 10

//Simple aliases for lazy ones
typedef char String[MAX_LENGTH];
typedef String Names[N_NAMES];

/** Input/Output ******************************/

//fgets keeps the \n at the end of the
//returned string : this function removes it
void remove_end_rc(char * const string) {
    size_t const len = strlen(string);
    if(len && string[len-1] == '\n')
        string[len-1] = '\0';
}

//Input function
void ask_names(Names names) {
    for(size_t i = 0 ; i < N_NAMES ; ++i) {
        printf("Name %u ? ", i+1);

        fgets(names[i], MAX_LENGTH, stdin);
        remove_end_rc(names[i]);
    }
}

//Output function
void print_names(Names names) {
    printf("Sorted :\n");

    for(size_t i = 0 ; i < N_NAMES ; ++i) {
        printf("%u) %s\n", i+1, names[i]);
    }
}

/** Sorting *************************************/

//Explicit
void swap_str(String s1, String s2) {
    String temp = "";

    strcpy(temp, s1);
    strcpy(s1, s2);
    strcpy(s2, temp);
}

#include <stdbool.h>

//Sorts alphabetically using bubble algorithm
void alpha_sort(Names names)
{
    bool swapped;

    do {
        swapped = false;

        for(size_t i = 0 ; i < N_NAMES-1 ; ++i) {
            if(strcmp(names[i], names[i+1])) {
                swap_str(names[i], names[i+1]);
                swapped = true;
            }
        }
    }while(!swapped);
}

/** Main program **********************************/

int main(void) {

    Names names = {""};

    ask_names(names);
    alpha_sort(names);
    print_names(names);

    return 0;
}

Вы можете улучшить его, позаботившись о падежах (нижний, верхний), символах ... Но в основном это делает свое дело.

0 голосов
/ 12 июля 2010

Как уже говорилось, ваши три strcmpi должны быть копией.Также обратите внимание, что если первый strcmpi (правильный) имеет значение strcmp, ваш x>1 всегда ложен, а if никогда не выполняется.

0 голосов
/ 12 июля 2010

Несколько примечаний:

При использовании функции strcmpi необходимо проверить, не является ли возвращаемое значение меньше, равно или больше нуля, а не 1.

Внутренняя часть вашего кода, вероятно, должна использовать strncpy вместо strcmpi.Текущий код на самом деле ничего не делает.

Что вы имеете в виду, что ваша программа "останавливается"?Как далеко это зайдет?Попробуйте разместить некоторые отладочные операторы printf в ключевых местах (например, после цикла ввода и в начале каждой итерации циклов for), чтобы лучше понять, какая часть вашего кода работает некорректно.

0 голосов
/ 12 июля 2010

Где у вас есть

                strcmpi(temp,string2d[out]);
                strcmpi(string2d[out],string2d[in]);
                strcmpi(string2d[in],temp);

вы, вероятно, имели в виду strcpy

0 голосов
/ 12 июля 2010

Я думаю, вы имели в виду strcpy (или, может быть, лучше, strncpy) в этих строках.

            strcmpi(temp,string2d[out]);
            strcmpi(string2d[out],string2d[in]);
            strcmpi(string2d[in],temp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...