Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Олимпиады

Страница: 1 | 2 | 3 | 4 | 5 |

 

  Вопрос: VC++ Help Please ! (задачка) Добавлено: 08.11.05 23:06  

Автор вопроса:  HACKER
Структуры... задач по ним тоже несколько, но было бы решена хотя бы одна, остальные бы я по примеру...

Итак, струкрута "STUDENT":
- ФИО
- номер группы
- успеваемость (массив из 5-ти эл.)

Нужно:
- Ввести данные в массив из 10-ти струкрут типа "STUDENT"
- Упорядочить записи по алфавиту

А ещё лучше как то функцией организовать...
Типа передал функции стрктуру и имя поля по которому сортировать, а она бац и отсортировала :) Может кто нибуть такое забацать?

P.S.
И ещё, как бы всё это красиво? Ну мы пока пишем в консольном режиме, но должны ж быть какие нибуть граф. ф-ции? Я хотел линиями разленеять таблицу (массив структур), т.е. вывести на экран таблицу и разленеять её линиями для наглядности...

Ответить

  Ответы Всего ответов: 67  

Номер ответа: 1
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #1 Добавлено: 08.11.05 23:48
Сортировать по тому или иному признаку несложно.
Вот только два вопроса: успеваемость - массив какого типа? char, int или что? Что может быть оценкой успеваемости?
И как вводятся данные в массив структур STUDENT? С клавы?

Ответить

Номер ответа: 2
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #2 Добавлено: 09.11.05 01:06
успеваемость - массив какого типа? char, int или что?


int

Что может быть оценкой успеваемости?


1,2,3,4,5

И как вводятся данные в массив структур STUDENT? С клавы?

да

Ответить

Номер ответа: 3
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #3 Добавлено: 09.11.05 01:16
А зачем ты придумал сюда массив? успеваемость можно одним элементом (тем же int или char) обозначить.
А если массив, то как должен он выглядеть, нарисуй.
Если например успеваемость студента 3, то массив как выглядит?
{XX3XX} или {00300} или как?
Или в массиве должно быть пять разных оценок?

Ответить

Номер ответа: 4
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #4 Добавлено: 09.11.05 01:18
Или в массиве должно быть пять разных оценок?

ага!

Ответить

Номер ответа: 5
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #5 Добавлено: 09.11.05 02:18
Тебе что-то типа такого видимо надо?

#include <iostream>


    using namespace std;
    
//============= struct =====================================
typedef struct STUDENT{
    char            name[128];
    int             group_ID;
    int             mark[5];
}STUDENT, *pSTUDENT;


//============= data =======================================
    //STUDENT*        Table[10];
//==========================================================
static void Fill_Array( STUDENT* array, int count )
{
    char    buffer[128];
    
    for ( int i=0; i<count; i++ )
    {
        printf ( "\n========= Student No %lu ==========\n\n", i+1 );
        printf ( "Input student's name: " );
        cin >> array[i].name;
        printf ( "Input student's group ID: ";);
        cin >> buffer;
        array[i].group_ID = atoi(buffer);
        printf ( "Input five comma-separated marks /for example: 1,5,3,4,2/: " );
        cin >> buffer;
        for ( int j=1; j<6; j++ )
            array[i].mark[j-1] = (int) buffer[;(j-1)*2]-0x30;
    }

}

//==========================================================
static void Show_Array( STUDENT* array, int count )
{
    printf ("\n\n============================================\n";);
    for ( int i=0; i<count; i++ )
    {
        printf ( "\n\n--------- Student No %lu ---------\n\n", i+1 );
        printf ( "Name: %s\t group ID: %lu\t marks: ", \
                  array[i].name, array[i].group_ID );
        for ( int j=0; j<5; j++ )
            printf ( "%lu ", array[i].mark[j] );
    }
    printf ("\n\n";);
}

//==========================================================
int main()
{
    char            buffer[128];
    STUDENT*        array;
    
    array = new STUDENT[10];
    Fill_Array ( array, 10 );
    Show_Array ( array, 10 );
    
    printf ( "Press any key to exit" );
    
    cin >> buffer;
    
    delete[] array;
    
    return 0;
}


Или как-то по другому?

Ответить

Номер ответа: 6
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #6 Добавлено: 09.11.05 03:11
Спасибо большое, я щас даже затестю, но если у меня и будут вопрос - оставим наверное их на завтра (точнее уже на сегодня)... Я отрубаюсь просто уже...

Ответить

Номер ответа: 7
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #7 Добавлено: 09.11.05 03:21
Эх... лана не спать! :)

1)
array = new STUDENT[2];
а чё массив структур разве не с нуля?

2) А где сама ф-ция сортировки :) ?

P.S. Собственно в этом и был смысл вопроса, т.е. нужна ф-ция сортировки, которая бы сортировала структуру по указанному полю.

Ответить

Номер ответа: 8
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #8 Добавлено: 09.11.05 03:23
array = new STUDENT[2];
ой, ну то я 2 для теста ставил, смысл тот же, если 2 то спршивает 2 студента если 10 - спрашивает 10... а вроде ж с нуля надо? типа 0 1 2 в итоге 3

Или просто пойти выспаться?

Ответить

Номер ответа: 9
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #9 Добавлено: 09.11.05 03:28
о!!!!!1 глянте зелёненькое!!!!
printf ( "Input student's name: " );

и
printf ( "Input student's group ID: ";);


навЭроно подсветка синтакиса касит однако... ж)

всё, всё, иду спать, не беньте меня :)

Ответить

Номер ответа: 10
Автор ответа:
 AASoft



Вопросов: 86
Ответов: 920
 Профиль | | #10 Добавлено: 09.11.05 03:29
2 eto kolichestvo elementov a ne poslednij index massiva(ne taka kak v BV6)

Ответить

Номер ответа: 11
Автор ответа:
 AASoft



Вопросов: 86
Ответов: 920
 Профиль | | #11 Добавлено: 09.11.05 03:29
навЭроно подсветка синтакиса касит однако... ж)


a ona tol`ko pod VB sdelana....

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 09.11.05 03:33
всёравно зелёненькое!!!!!!!
ааааааа.........
прёт!!!!!11 :)))))))))))) Нет, я с моментом не дружу, просто уже четвёртый час подряд собираюсь дойти до кровати...

Ответить

Номер ответа: 13
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #13 Добавлено: 09.11.05 03:35
...(ne taka kak v BV6)
Borland Visual 6 ?

(Вывод: ночью лучше не постить) :)

Ответить

Номер ответа: 14
Автор ответа:
 AASoft



Вопросов: 86
Ответов: 920
 Профиль | | #14 Добавлено: 09.11.05 03:54
VB blin....nedosmotrel :/

P.S. i v Kanade shas ne noch

Ответить

Номер ответа: 15
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #15 Добавлено: 09.11.05 07:39

    #include <iostream>


    using namespace std;                 /* вместо std::cin будем писать просто cin */
    
//============= constants =======================================
    #define         STUDENT_COUNT 10     /* константа - кол-во элементов в массиве */
      
//============= structures ======================================
typedef struct STUDENT{
    char            name[128];
    int             group_ID;
    int             mark[5];
}STUDENT, *pSTUDENT;


    
//============= variables =======================================
    STUDENT*        array;              /* указатель на массив элементов типа STUDENT */
    int             sort_field_id;      /* переменная, указывающая по какому полю сортировать */
    
    
//===============================================================
int compare (STUDENT* index1, STUDENT* index2)  /* сравнение двух элементов */
{
    int             result=0;
    int             m1=0, m2=0;
    
    if ( sort_field_id==0 )
        result = _stricoll( index1->name, index2->name ); /*_stricoll - ф-ция сравнения строк*/

    else if ( sort_field_id==1 && index1->group_ID > index2->group_ID )
        result = 1;
    
    else if ( sort_field_id==2 )
    {
        /* считаем сумму оценок двух элементов и сравниваем их */
        for ( int i=0; i<5; i++ )
        {
            m1 += index1->mark[i];
            m2 += index2->mark[i];
        }
        if ( m1 > m2 ) result = 1;
    }
    
    /* если index1 > index2, возвращаем 1 (будем переставлять) */
    return result;

}

//==========================================================
void swap_index(STUDENT* index1, STUDENT* index2)   /* перестановка двух элементов */
{
    STUDENT     item;
    memcpy (&item, index1, sizeof(STUDENT));
    memcpy (index1,index2, sizeof(STUDENT));
    memcpy (index2, &item, sizeof(STUDENT));
}

//==========================================================
void sort( STUDENT* pArray, int count )     /* функция сортировки */
{
    int     swap;
    
    do
    {
        swap = 0;   /* флаг обмена */
        /* просмотр массива со сравнением соседних элементов */
        for ( int i=0; i<count-1; i++ )
        {
            if ( compare(&pArray[i], &pArray[i+1];) > 0 )
            {
                /*если элемент с меньшим индексом оказался больше,
                  переставляем их местами и взводим флаг */
                swap_index(&pArray[i], &pArray[i+1];);
                swap = 1;
            }
        }
    }
    /* повторяем цикл do - while пока были перестановки */
    while ( swap );
    
}

//==========================================================
static void fill_array( STUDENT* pArray, int count )
{
    char    buffer[128];
    
    /* заполнение массива */
    for ( int i=0; i<count; i++ )
    {
        printf ( "\n========= Student No %lu ==========\n\n", i+1 );
        printf ( "Input student's name: " );
        cin >> pArray[i].name;
        printf ( "Input student's group ID: ";);
        cin >> buffer;
        pArray[i].group_ID = atoi(buffer);  /* atoi - перевод строки в число int */
        printf ( "Input five comma-separated marks /for example: 1,5,3,4,2/: " );
        cin >> buffer;
        /* нечетные символы отметок преобразуем в цифры и в массив отметок */
        for ( int j=1; j<6; j++ )
            pArray[i].mark[j-1] = buffer[;(j-1)*2]-0x30;
    }

}

//==========================================================
static void show_array( STUDENT* pArray, int count )    
{
    float   average;
    
    /* показываем массив со всеми полями + среднюю оценку */
    printf ("\n\n============================================\n";);
    for ( int i=0; i<count; i++ )
    {
        average = 0;
        printf ( "\n\n--------- Student No %lu ---------\n", i+1 );
        printf ( "Name: %s\t group ID: %lu\t marks: ", \
                 pArray[i].name, pArray[i].group_ID );
        for ( int j=0; j<5; j++ )
        {
            printf ( "%lu ", pArray[i].mark[j] );
            average += pArray[i].mark[j];
        }
        printf ( " average mark: %f", average/5 );
            
    }
    printf ("\n\n";);
}

//==========================================================
char get_action()           /* получение выбора действия от юзера*/
{
    char    buffer[128];
    
    printf ("\n\n\t===========================================\n";);
    printf ("\t=      Select action then press ENTER     =\n";);
    printf ("\t=             sort by name  - 0           =\n";);
    printf ("\t=             sort by group - 1           =\n";);
    printf ("\t=             sort by mark  - 2           =\n";);
    printf ("\t=             exit program  - 3           =\n";);
    printf ("\t===========================================\n";);
    
    /* запуск юзера по кольцу, пока не сделает выбор от 0 до 3*/
    while ( buffer[0]<'0' || buffer[0]>'3' )
        cin >> buffer;
    /* возвращаем выбор юзера */
    return ( buffer[0]-0x30 );
    
}

//==========================================================
int main()
{
    /* создаём, очищаем, заполняем и показываем массив*/
    array = new STUDENT[STUDENT_COUNT];    
    memset ( array, 0, STUDENT_COUNT*sizeof(STUDENT) );
    fill_array ( array, STUDENT_COUNT );
    show_array ( array, STUDENT_COUNT );
    
    /* пока юзер не нажмет 3, будем сортировать и показывать результат */
    while ( ( sort_field_id = get_action() ) != 3 )
    {
        /* sort_field_id заполнена выбором юзера и показывает,
           по какому полю сортировать */
        sort ( array, STUDENT_COUNT );
        show_array ( array, STUDENT_COUNT );
    }
    
    /* уничтожаем массив, освобождая память*/
    delete[] array;
    
    /* выход из программы*/
    return 0;
}


Можешь доделать какие-нибудь навороты, типа проверки диапазона отметок, введенных юзером, проверки, чтобы юзер не пихал в номер группы буквы вместо цифр, передачу всех параметров через стек, без глобальных переменных и т.д.

Если количество элементов большое, лучше применить другой алгоритм сортировки, например quickSort, но для маленьких массивов лучше как тут.

Ответить

Страница: 1 | 2 | 3 | 4 | 5 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам