Страница: 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
int
1,2,3,4,5
да
Номер ответа: 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
Тебе что-то типа такого видимо надо?
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)
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 глянте зелёненькое!!!!
и
навЭроно подсветка синтакиса касит однако... ж)
всё, всё, иду спать, не беньте меня
Номер ответа: 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, но для маленьких массивов лучше как тут.