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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка по фамилии в структуре, Структура студент 
:(
    Опции темы
Kseni1995
Дата 16.5.2014, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Посмотрите пожалуйста структуру Студент! Нужно сделать сортировку по фамилии. Думаю, что с сортировкой и strcmp что-то не так...
Задание: вывести фамилии студентов, указанной пользователем группы, с указанием их среднего балла и года рождения. Список упорядочить по фамилии.
Код

#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <string>
using namespace std;
 
struct student {
const char * lname;
unsigned short int birthday;
unsigned short int group;
float sr;
} person[6];
 
 
void fill()
{
    person[1].lname = "Potter";
    person[1].group=103;
    person[1].birthday=1994;
    person[1].sr=4.7;
    
               person[2].lname = "Granger";
               person[2].group=103;
    person[2].birthday=1994;
    person[2].sr=5;
 
    person[3].lname = "Weasley";
    person[3].group=106;
    person[3].birthday=1994;
    person[3].sr=3.7;
 
    person[4].lname = "Longbottom";
    person[4].group=106;
    person[4].birthday=1994;
    person[4].sr=4.1;
 
    person[5].lname = "Finnigan";
              person[5].group=101;
    person[5].birthday=1994;
    person[5].sr=3.8;
 
              person[6].lname = "Wood";
              person[6].group=101;
    person[6].birthday=1993;
    person[6].sr=4.8;
    
}
 
 
void main()
{
    fill();
              int i, j, num;
    student swap;
    cout<<"Input the number of the group"<<endl;
    cin>>num;
    i=0;
    for (i=1; i<7; i++)
        if (person[i].group == num)
        { if (strcmp (person[i].lname, person[i+1].lname) > 0)
    {
        swap = person[i];
        person[i] = person[i+1];
        person[i+1] = swap;
    }
        cout<<num<<endl<<endl<<person[i].lname<<endl<<endl<<person[i].birthday<<endl<<endl<<person[i].sr<<endl<<endl; 
        }
_getch();
}


Это сообщение отредактировал(а) Kseni1995 - 16.5.2014, 23:49
PM MAIL   Вверх
konshyn
Дата 17.5.2014, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

i=0;
    for (i=1; i<7; i++)
        if (person[i].group == num)
        { if (strcmp (person[i].lname, person[i+1].lname) > 0)
    {
        swap = person[i];
        person[i] = person[i+1];
        person[i+1] = swap;
    }
        cout<<num<<endl<<endl<<person[i].lname<<endl<<endl<<person[i].birthday<<endl<<endl<<person[i].sr<<endl<<endl; 
        }

как таковой сортировки я тут не увидел вообще.
Код

for (int i = 0; i < 5; i++)
    for (int j = 0; j < 5 - i; j++)
        if (strcmp(person[j].lname, person[j+1].lname) > 0)
        {
            student tmp;
            memcpy((void *)&tmp, (void *)&person[j], sizeof(student));
            memcpy((void *)&person[j], (void *)&person[j+1], sizeof(student));
            memcpy((void *)&person[j+1], (void *)&tmp, sizeof(student));
         }

for (int i = 0; i < 6; i++)
    if (person[i].group == num)
        cout << ....;


Это сообщение отредактировал(а) konshyn - 17.5.2014, 01:13


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
konshyn
Дата 17.5.2014, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Kseni1995
Код

struct student {
const char * lname;
unsigned short int birthday;
unsigned short int group;
float sr;
} person[6];


Код

const char * lname;

это неправильно. lname не должно быть const в данном случае. и это не просто должен быть указатель, т.к. ты не выделяешь память для lname. объяви так, хотя бы:
Код

 char lname[256];


Добавлено через 5 минут и 14 секунд
Код

person[1].lname = "Potter";
person[2].lname = "Granger";
person[3].lname = "Weasley";
....

так делать нельзя.
используй
Код

strcpy((void *)person[1].lname, "Potter");
...


Это сообщение отредактировал(а) konshyn - 17.5.2014, 01:17


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
konshyn
Дата 17.5.2014, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



P.S. Один совет для будущих программистов. От человека, который сидел на таких же граблях, как Kseni1995. Параллельно изучению какого-нибудь языка программирования, читайте какую-нибудь книгу по архитектуре. И программируйте на ассемблере. Понять, как взаимодействует код с железом ОЧЕНЬ важно. Например, начните изучение из классики - Микроконтроллер 8051. Книга

Добавлено @ 01:34
P.P.S. Напишите хотя бы сложение для микроконтроллера 8051 чисел в диапозоне от 65537 до 2 000 000 000. 

Это сообщение отредактировал(а) konshyn - 17.5.2014, 01:35


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
feodorv
Дата 17.5.2014, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Kseni1995 @  17.5.2014,  00:25 Найти цитируемый пост)
struct student person[6];
И при этом:

Цитата(Kseni1995 @  17.5.2014,  00:25 Найти цитируемый пост)
    person[1].lname = "Potter";
...
    person[2].lname = "Granger";
...
    person[3].lname = "Weasley";
...
    person[4].lname = "Longbottom";
...
    person[5].lname = "Finnigan";
...
    person[6].lname = "Wood";
...
Индекс в C/C++ отсчитывается от 0, не от 1. Поэтому должно быть так:
Код
    person[0].lname = "Potter";
...
    person[1].lname = "Granger";
...
    person[2].lname = "Weasley";
...
    person[3].lname = "Longbottom";
...
    person[4].lname = "Finnigan";
...
    person[5].lname = "Wood";
...

А person[6] - это выход за пределы массива, чреватый перезаписью чужой памяти и падением программы. Аналогично
Цитата(Kseni1995 @  17.5.2014,  00:25 Найти цитируемый пост)
    for (i=1; i<7; i++)
Тогда как цикл должен быть таким:
Код

for (i=0; i<6; i++)




Цитата(konshyn @  17.5.2014,  02:16 Найти цитируемый пост)
так делать нельзя.

Почему? В данном случае Kseni1995 инициализирует поле lname константными строками (видимо, сортировка здесь важнее данных). Соответственно, strcpy не нужна.


Цитата(Kseni1995 @  17.5.2014,  00:25 Найти цитируемый пост)
Список упорядочить по фамилии.

Цитата(Kseni1995 @  17.5.2014,  00:25 Найти цитируемый пост)
        if (person[i].group == num)

Если сортировать чисто по фамилии, то зачем тогда сравнение по номеру группы? И да, пузырьковая сортировка проходит в двойном цикле: http://forum.vingrad.ru/index.php?showtopi...t&p=1441458 smile 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
konshyn
Дата 17.5.2014, 04:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(feodorv @  17.5.2014,  04:22 Найти цитируемый пост)
Почему? В данном случае Kseni1995 инициализирует поле lname константными строками

Точно, вы правы. Не подумал


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
Kseni1995
Дата 17.5.2014, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(feodorv @ 17.5.2014,  04:22)
Если сортировать чисто по фамилии, то зачем тогда сравнение по номеру группы?

не получается все равно!( а номер группы необходим, т.к  фамилии в алфавитном порядке выводит только из указанной пользователем группы!

Добавлено через 1 минуту и 25 секунд
Помогите! По разному пробовали, но не получается, последнего не видит вообще
PM MAIL   Вверх
feodorv
Дата 19.5.2014, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Kseni1995 @  17.5.2014,  17:47 Найти цитируемый пост)
По разному пробовали

Не нравится мне это "по-разному". Хоть код приведите, в котором "последнего не видит вообще".


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
konshyn
Дата 19.5.2014, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Kseni1995 @  17.5.2014,  16:47 Найти цитируемый пост)
Помогите! По разному пробовали, но не получается, последнего не видит вообще 


Чем не устраивает вот этот вариант? Пузырькова сортировка по фамилии, а выводить только людей из нужной группы
Код

for (int i = 0; i < 5; i++)
    for (int j = 0; j < 5 - i; j++)
        if (strcmp(person[j].lname, person[j+1].lname) > 0)
        {
            student tmp;
            memcpy((void *)&tmp, (void *)&person[j], sizeof(student));
            memcpy((void *)&person[j], (void *)&person[j+1], sizeof(student));
            memcpy((void *)&person[j+1], (void *)&tmp, sizeof(student));
         }
for (int i = 0; i < 6; i++)
    if (person[i].group == num)
        cout << ....;



--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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