Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] проблема с сортировкой массива! 
:(
    Опции темы
Thief
Дата 6.11.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.11.2008

Репутация: нет
Всего: нет



Требуется создать программу по сортировке сотрудников по возрасту. Сама программа сортирует по возрасту, но как сделать так, чтобы можно было вводить и фамилии ещё и при этом всё нормально сортировалось?

Код
#include <stdio.h>
#include<locale.h>   
#include<conio.h>

#define FALSE 0
#define TRUE 1

void DisplayMenu(void);
void sortirovkaVozrastania(void);
void sortirovkaUbyvania(void);
int MenuVybora(void);
    int n, i, j, x;
    char s;
    double a[1000], b;
int main()
{
    setlocale(LC_ALL, "Russian");
    int quitting=FALSE;
    while(1)
    {
        printf("\nВведите количество сотрудников фирмы:");
        scanf("%d", &n);
        if (n>1 && n<=100) break;
        printf("Большое число, введите количество сотрудников до 1000");
    }
    printf("\n================================================");

    printf("\nНомер\tФамилия И. О.\t\t\tВозраст\n\n");
    for(j=0; j<n; j++)
    {
        printf("N%d\t", j+1);
        scanf("%lf", &a[j]);
    }
    
            printf("\n================================================\n");
            while(!quitting)
    {
        DisplayMenu();
        switch(MenuVybora())
        {
        case 1:
            sortirovkaVozrastania();
            break;
        case 2:
            sortirovkaUbyvania();
            break;
        case 3:
            quitting=TRUE;
            break;
        default:
            printf("\n\nОшибка выбора!!!Следует нажмать 1,2 или 3!!!\n\n");
        }
    }
    return 0;
}
            
void DisplayMenu(void)
{
    printf("\nМеню\n");
    printf("-----------------------------------------------------------\n");
    printf("1-Сортировка сотрудников по возрасту в порядке возрастания.\n");
    printf("2-Сортировка сотрудников по возрасту в порядке убывания.\n");
    printf("3-Выход.\n");
    printf("-----------------------------------------------------------\n");
}
void sortirovkaVozrastania(void)
{
    
    for(i=0; i<n-1; i++)
        for(j=i+1; j<n; j++)
            if(a[i]>a[j])
            {
                b=a[i];
                a[i]=a[j];
                a[j]=b;
            }
            printf("\n\n\nСортировка сотрудников по возрасту в порядке возрастания\n\n");
            printf("***************************************************\n");
            printf("\nНомер\tФамилия И. О.\t\t\tВозраст\n\n");
            for(j=0; j<n; j++)
                printf("N%d\t%g\n", j+1, a[j]);
            printf("***************************************************\n\n");
}
int MenuVybora(void)
{
    printf("\nВыбирите из меню тип сортировки:");
    return (getche()-'0');
}
void sortirovkaUbyvania(void)
{
    for(i=0; i<n-1; i++)
        for(j=i+1; j<n; j++)
            if(a[i]<a[j])
            {
                b=a[i];
                a[i]=a[j];
                a[j]=b;
            }
            printf("\n\n\nСортировка сотрудников по возрасту в порядке убывания\n\n");
            printf("***************************************************\n");
            printf("\nНомер\tФамилия И. О.\t\t\tВозраст\n\n");
            for(j=0; j<n; j++)
                printf("N%d\t%g\n", j+1, a[j]);
            printf("***************************************************\n\n");
}



Это сообщение отредактировал(а) bsa - 6.11.2008, 18:15
PM MAIL   Вверх
bsa
Дата 6.11.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Thief, сделай структуру, в которой поля будут "имя", "фамилия" и "возраст". Затем сортируй по одному из полей.
PM   Вверх
Thief
Дата 11.11.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.11.2008

Репутация: нет
Всего: нет



Сделал структуру, но снова проблемы((( Как сделать так, чтобы ФИО можно было вводить русскими буквами, а то у меня после сортировки выводяться вместо букв значки? Помогите, пожалуйста, исправить сортировку  ( сротирует по имени, а надо по возрасту). 
Код

#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <conio.h>
#define MAXFAM 40
#define MAXNAME 40
#define MAXCHEL 100
#define FALSE 0
#define TRUE 1

void DisplayMenu(void);
int MenuVybora(void);
void sortirovkaVozrastania( struct firma (* ptr)[MAXCHEL], int count);
void sortirovkaUbyvania(struct firma  (*ptr)[MAXCHEL], int count);

struct firma {
               char family [ MAXFAM  ];
               char name [ MAXNAME ];
               float age;
            };

int main(void)
{
    setlocale(LC_ALL, "Russian");
    struct firma list[ MAXCHEL ];
    int count = 0;
    int index;
    int quitting=FALSE;

    
    printf("По окончании ввода всех данных нажмите ENTER.\n\n");
    printf("Пожалуйста, введите фамилию: \n");
   
   

   while (count < MAXCHEL && gets(list[count].family) != NULL && list[count].family[0] != '\0')
   {
    
       printf("Пожалуйста, введите имя и отчество: \n");
          gets(list[count].name);

          printf("Пожалуйста, введите возраст: \n");
          scanf("%f", &list[count++].age);

          while (getchar() != '\n')
                 continue;

          if (count < MAXCHEL)
              printf("Пожалуйста, введите следующую фамилию: \n");
   }
        while(!quitting)
   {
        DisplayMenu();
        switch(MenuVybora())
        {
        case 1:
            sortirovkaVozrastania( &list, count);
                printf("\n\n\nСортировка сотрудников по возрасту в порядке возрастания\n\n");
                printf("***********************************************************");
                printf("\nФамилия\t\t    Имя отчество\t\tВозраст\n");
                printf("***********************************************************\n\n");
                for (index = 0; index < count; index++)
                printf("%-20s %-30s %3g\n", list[index].family, list[index].name, list[index].age);
                printf("***********************************************************\n");
            break;
        case 2:
            sortirovkaUbyvania(&list, count);
                printf("\n\n\nСортировка сотрудников по возрасту в порядке убывания\n\n");
                printf("***********************************************************");
                printf("\nФамилия\t\t    Имя отчество\t\tВозраст\n");
                printf("***********************************************************\n\n");
                for (index = 0; index < count; index++)
                printf("%-20s %-30s %3g\n", list[index].family, list[index].name, list[index].age);
                printf("***********************************************************\n");
                break;
        case 3:
            quitting=TRUE;
            break;
        default:
            printf("\n\nОшибка выбора!!!Следует нажмать 1,2 или 3!!!\n\n");
        }
   }
   return 0;
}


void DisplayMenu(void)
{
    printf("\nМеню\n");
    printf("-----------------------------------------------------------\n");
    printf("1-Сортировка сотрудников по возрасту в порядке возрастания.\n");
    printf("2-Сортировка сотрудников по возрасту в порядке убывания.\n");
    printf("3-Выход.\n");
    printf("-----------------------------------------------------------\n");
}

int MenuVybora(void)
{
    printf("\nВыбирите из меню тип сортировки:");
    return (getche()-'0');
}

void sortirovkaVozrastania( struct firma  (*ptr)[MAXCHEL], int count)
{
    struct firma temp_name;
    struct firma temp_family ;

    int i, j;

    for ( i = 0; i < count - 1; i++)
    {
          for ( j = i + 1; j < count; j++)
          {
                if ( strcmp( (*ptr)[i].name , (*ptr)[j].name) > 0)
                {
                     strcpy ( temp_name.name , (*ptr)[i].name);
                     strcpy ( temp_family.family, (*ptr)[i].family);

                     strcpy ( (*ptr)[i].name, (*ptr)[j].name);
                     strcpy ( (*ptr)[i].family, (*ptr)[j].family);

                     strcpy ( (*ptr)[j].name, temp_name.name);
                     strcpy ( (*ptr)[j].family, temp_family.family);
                }
          }
    }
}

            

void sortirovkaUbyvania(struct firma  (*ptr)[MAXCHEL], int count)
{
    
    struct firma temp_name;
    struct firma temp_family ;

    int i, j;

    for ( i = 0; i < count - 1; i++)
    {
          for ( j = i + 1; j < count; j++)
          {
                if ( strcmp( (*ptr)[i].name , (*ptr)[j].name) < 0)
                {
                     strcpy ( temp_name.name , (*ptr)[i].name);
                     strcpy ( temp_family.family, (*ptr)[i].family);

                     strcpy ( (*ptr)[i].name, (*ptr)[j].name);
                     strcpy ( (*ptr)[i].family, (*ptr)[j].family);

                     strcpy ( (*ptr)[j].name, temp_name.name);
                     strcpy ( (*ptr)[j].family, temp_family.family);
                }
          }
    }
}

PM MAIL   Вверх
bsa
Дата 11.11.2008, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Ну а в чем проблема? Не можешь сравнивать поле age или family?
Я бы на твоем месте создал функцию swap, которая бы меняла местами две структуры:
Код
void swap(struct firma *f1, struct firma *f2)
{
    struct firma tmp;
    memcpy(&tmp, f1, sizeof(tmp));
    memcpy(f1, f2, sizeof(*f1));
    memcpy(f2, &tmp, sizeof(*f2));
}
И использовал бы ее в сортировках, вместо:
Код
                     strcpy ( temp_name.name , (*ptr)[i].name);
                     strcpy ( temp_family.family, (*ptr)[i].family);

                     strcpy ( (*ptr)[i].name, (*ptr)[j].name);
                     strcpy ( (*ptr)[i].family, (*ptr)[j].family);

                     strcpy ( (*ptr)[j].name, temp_name.name);
                     strcpy ( (*ptr)[j].family, temp_family.family);
Код в этом случае станет намного понятней, не говоря уже о размерах и скорости исполнения.
PM   Вверх
jonie
Дата 12.11.2008, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



ну а чтобы было совсем хорошо имхо стоит сделать класс, с переопределенными operator=, копирующим конструктором, operator>, operator>=, etc.
использовать для сортировки std::sort или иные (по вкусу)... и т.п....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
J0ker
Дата 12.11.2008, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(jonie @  12.11.2008,  00:54 Найти цитируемый пост)
operator>, operator>=

достаточно operator<


--------------------
user posted image
PM MAIL   Вверх
bsa
Дата 12.11.2008, 13:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(jonie @ 12.11.2008,  00:54)
ну а чтобы было совсем хорошо имхо стоит сделать класс, с переопределенными operator=, копирующим конструктором, operator>, operator>=, etc.
использовать для сортировки std::sort или иные (по вкусу)... и т.п....

Уж лучше создать функциональные объекты, для конкретного сравнения (по фамилии, по имени или по возрасту) для обоих направлений, которые и поставлять третьим параметром в sort.
PM   Вверх
Thief
Дата 13.11.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.11.2008

Репутация: нет
Всего: нет



Всё исправил, почти всё работает ( с кодировкой не могу разобраться ). Большое спасибо тем кто помогал!!!  Но как сделать так, чтобы ФИО можно было вводить русскими буквами, а то у меня после сортировки выводяться вместо букв значки? Может подскажет кто? А то у меня не получается. 
#include <locale.h>   setlocale(LC_ALL, "Russian") написаны, но ФИО русскими буквами не выводяться (((

PM MAIL   Вверх
Lorigin
Дата 13.11.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Печатаю фото на холс



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.3.2008
Где: Москва

Репутация: нет
Всего: нет



если в студии:
Код

_tprintf(L"Мой текст по русски");

PM MAIL WWW   Вверх
Thief
Дата 14.11.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.11.2008

Репутация: нет
Всего: нет



Я всё равно не могу понять, почему после сортировки мои ФИО не пишутся по-русски. Ведь printf("По окончании ввода всех данных нажмите ENTER.\n\n"); printf("Пожалуйста, введите фамилию: \n");  нормально выводяться на русском, а эти отсортированные нет. Может кто-нибудь всё-таки покажет на моём примере как это реализовать. Я буду очень признателен, потому что самому не додуматься. 
PM MAIL   Вверх
bsa
Дата 14.11.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Thief, напиши простейшую программу, которая будет вводить строку с клавиатуры и выводить ее на экран
PM   Вверх
Thief
Дата 14.11.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.11.2008

Репутация: нет
Всего: нет



не понял, зачем?
PM MAIL   Вверх
bsa
Дата 14.11.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Thief @ 14.11.2008,  13:53)
не понял, зачем?

Затем, чтобы узнать где проблема с кодировкой.
PM   Вверх
Thief
Дата 15.11.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.11.2008

Репутация: нет
Всего: нет



После сортировки мои ФИО  пишутся по-русски: удалил #include <locale.h>   setlocale(LC_ALL, "Russian") и всё заработало. Я пробовал использовать функцию OemToChar, но компилятор выдавал ошибку.
Также в простой программе использовал функцию OemToChar. Но компилятор выдаёт ту же  ошибку: error C2664: 'CharToOemW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR' 
Подскажите пожалуйста, в чём может быть проблема.
Код
  #include <stdio.h>
#include <windows.h>
char bufRus[256];
char* Rus(const char*);

void main(void)
{
    int a=2;
    float r=5.5;
    char s[]="Минск !", s1[256];
    printf("\n %s", Rus(s));
    printf("\n Vvedi string ");
    gets(s1);
    printf("\n %s", s1);
    printf(Rus("\n Значение a=%d r=%f\n"), a, r);
}
char* Rus(const char *text)
{
    CharToOem(text, bufRus);
    return bufRus;
}


Это сообщение отредактировал(а) Thief - 15.11.2008, 15:06
PM MAIL   Вверх
Crafty
Дата 15.11.2008, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Если пишешь в студии то можно в настройках проекта отключить использование юникода (Project -> Properties -> Configuration Properties -> General -> Character Set -> Поставить Not Set) это должно помочь.

Это сообщение отредактировал(а) Crafty - 15.11.2008, 15:47
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0675 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.