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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Требуется помощь в написании программы на языке C, Подсчёт и сортировка оценок студентов 
:(
    Опции темы
Twilight
Дата 20.12.2007, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть задание:

"Задан массив, содержащий оценки студентов за рубежный контроль. Элементы массива - целые числа. Значения - от 2 до 5 и 0 в случае неявки. Вычислить число студентов, получивших отлично, хорошо, удовлетворительно, неудовлетворительно, любую оценку больше двух, число явившихся и неявившихся студентов. Вывести эти числа отсортированными по числу студентов."

Написал вот такой прототип:

Код

#include <stdio.h>

int main()
{
    int students[25] = {2,3,5,2,3,5,2,3,4,0,2,0,3,4,0,5,2,0,3,3,2,0,4,5,3};
    int results[6] = {0,0,0,0,0,0};
    int i;
    int x;
    int temp;
    for(i = 0; i < 25; i++)
    {
        results[students[i]] = results[students[i]] + 1;
    }
    for(x = 1; x < 5; x++)
    {
        for(i = 0; i < 4; i++)
        {
            if(results[i] < results[i + 1])
            {
                temp = results[i];
                results[i] = results[i + 1];
                results[i + 1] = temp;
            }
        }
    }
    printf("Results: ");
    for(i = 0; i < 5; i++)
    {
        printf("%5d",results[i]);
    }
    printf("\n");
}


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

Что я делаю не так? Нужно ещё каким-то образом исключить из массива results элемент с индексом 1. Никак не могу придумать разумное решение.

Желательно вывести на экран результат вида...

Цитата
Отлично:
Хорошо:
Удовлетворительно:
Неудовлетворительно:
Не явилось:
Любую оценку больше двух получили:
Явилось:


...а не голые числа. Только это нужно в отсортированном виде.

Я новичок в C, поэтому прошу не ругать. Раньше приходилось писать только на Lua.

P.S. Как можно заставить программу корректно отображать русские буквы в консоли? Система Mac OS.
PM   Вверх
Silent_s
Дата 20.12.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Прикольно! У меня в лабораторной почти такое задание! 
В начале идут два заголовочных файла
1)
Код

#ifdef DIALOGS_H
#define DIALOGS_H
typedef struct{
    char sname[30];
    char name[30];
    int group;    
    int mark1;
    int mark2;
    int mark3;
    int mark4;    
} student_t;

void _outputone(student_t onestudent);
void _dialog_output(void);    
void _dialog_input(void);
void _dialog_edit(void);
void _dialog_main(void);

#endif 

2)
Код

#ifdef SORTGROUP_H
#define SORTGROUP_H
typedef struct{
    char sname[30];
    char name[30];
    int group;    
    int mark1;
    int mark2;
    int mark3;
    int mark4;    
} student_t;

void _outputone(student_t onestudent);
void _dialog_output(void);    
void _dialog_input(void);
void _dialog_edit(void);
void _dialog_main(void);

#endif 

Потом два модуля
1)
Код

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

typedef struct {
    char sname[30];
    char name[30];
    int group;    
    int marks[4];
    
} student_t;


char Subjects[4][12]={"Maths","Biology","Chemistry","Phisics"};
const countsubject=4;

extern student_t arr_student[100];
extern count;


void _outputone(student_t onestudent){
   printf("%10s %11s %6d %9d %10d %10d %9d\n",onestudent.sname,onestudent.name,
    onestudent.group,onestudent.marks[0],onestudent.marks[1],onestudent.marks[2],onestudent.marks[3]);
}

void _dialog_output(void){
    int i;
    printf("\n   Surname   |   Name  | Groupe |%8s |%10s |%10s |%8s |\n",&Subjects[0][0],&Subjects[1][0],
        &Subjects[2][0],&Subjects[3][0]);
    printf("-------------------------------------------------------------------------------\n");
    for(i=0;i<count;++i){        
        printf("%d",i+1);
        _outputone(arr_student[i]);    
    }    
}

void _dialog_input(void){
    ++count;
    printf("Input surname of student:          ");scanf("%s",arr_student[count-1].sname);
    printf("Input name of student:             ");scanf("%s",arr_student[count-1].name);
    printf("Input number of groupe of student: ");scanf("%d",&arr_student[count-1].group);
    printf("Input mark on %10s:",&Subjects[0][0]);scanf("%d",&arr_student[count-1].marks[0]);
    printf("Input mark on %10s:",&Subjects[1][0]);scanf("%d",&arr_student[count-1].marks[1]);
    printf("Input mark on %10s:",&Subjects[2][0]);scanf("%d",&arr_student[count-1].marks[2]);
    printf("Input mark on %10s:",&Subjects[3][0]);scanf("%d",&arr_student[count-1].marks[3]);    
    
    _dialog_output();
}

void _dialog_edit(void){
    int numedit;
    _dialog_output();
    printf("Input number of student in list for editing:  ");
    if ((scanf("%d",&numedit)==1)&&(numedit>0)&&(numedit<=count)){
        printf("Input surname of student:          ");scanf("%s",arr_student[numedit-1].sname);
        printf("Input name of student:             ");scanf("%s",arr_student[numedit-1].name);
        printf("Input number of groupe of student: ");scanf("%d",&arr_student[numedit-1].group);
        printf("Input mark on %10s:",&Subjects[0][0]);scanf("%d",&arr_student[numedit-1].marks[0]);
        printf("Input mark on %10s:",&Subjects[2][0]);scanf("%d",&arr_student[numedit-1].marks[1]);
        printf("Input mark on %10s:",&Subjects[3][0]);scanf("%d",&arr_student[numedit-1].marks[2]);
        printf("Input mark on %10s:",&Subjects[4][0]);scanf("%d",&arr_student[numedit-1].marks[3]);
    }
    else printf("%s","Wrong number!");
    
    _dialog_output();
}



void _dialog_main(void){
    int numop = 0;
    printf("\nInput number of operation:\n");
    printf("1)Output information about students\n");
    printf("2)Input new student\n");
    printf("3)Edit information about students\n");
    printf("4)Get statistic about student\n");

    if ((scanf("%d",&numop)==1)&&(numop>0)&&(numop<5))
        switch (numop){
            case 1:
                _dialog_output();                
                break;
            case 2:                
                _dialog_input();
                break;
            case 3:
                _dialog_edit();
                break;
            case 4:
                _get_statistic();
                break;
        }
    else printf("\n%s\n","Wrong number");
}

2)
Код
typedef struct {
    char sname[30];
    char name[30];
    int group;    
    int marks[4];
    
} student_t;

typedef struct {
    int numgroup;
    float quality;
} qualgroup;

extern student_t arr_student[100];
extern count;
extern const countsubject;
char Subjects1[4][12]={"Maths","Biology","Chemistry","Phisics"};

int _getbestsub(void){
    int i,j,k,bestsum=0,retval;
    for (j=0;j<countsubject;++j){    
        k = 0;
        for (i=0;i<count;++i)            
            k += arr_student[i].marks[j];
        if (bestsum < k){
            bestsum = k    ;
            retval = j;
        }
    }
    return retval;
}

int _make_sum(qualgroup *arr){
    int retval,i,j,cStudGr=0,nowgr;
    retval = count;
    for (i=0;i<retval;++i){
        nowgr = (arr+i)->numgroup;
        cStudGr = 1;
        for(j=i;j<retval;++j)
            if (((arr+i)->numgroup==(arr+j)->numgroup)&&(i!=j)){
                ++cStudGr;
                (arr+i)->quality += (arr+j)->quality;
                (arr+j)->numgroup = (arr+retval-1)->numgroup;
                (arr+j)->quality = (arr+retval-1)->quality;
                (arr+retval-1)->numgroup = 0;
                --retval;
            }            
        (arr+i)->quality = (arr+i)->quality/cStudGr;
    }
    return retval;
}

void SortingSwap(qualgroup *x,qualgroup *y){
    qualgroup a;
    a = *x; 
    *x = *y; 
    *y = a;
}

void _sort(qualgroup *arr,int countarr){
    int i,j;    
    for (i=0;i<countarr;++i) 
        for (j=0;j<countarr;++j){       
            if ((arr+j)->quality < (arr+i)->quality){ 
              SortingSwap((arr+j),(arr+i));
           } 
        }
}

qualgroup *_sortqualgroup(void){
    qualgroup *retval;
    int i,j,k;
    retval = (qualgroup *)calloc(count,sizeof(int));
    for (i=0;i<count;++i) {
        (retval+i)->numgroup=arr_student[i].group;
        (retval+i)->quality = 0;
        for(j=0;j<countsubject;++j)
            (retval+i)->quality += arr_student[i].marks[j];
    }
    k = _make_sum(retval);
    _sort(retval,k);
    //free(retval);
    return retval;
}

void _get_statistic(void){
    int i,j,k=0,notqual,countqual=0;
    qualgroup *arr;
    for (i=0;i<count;++i){
        notqual = 0;
        for (j=0;j<countsubject;++j){            
            if ((arr_student[i].marks[j]!=4)&&(arr_student[i].marks[j]!=5))
                ++notqual;

            if (arr_student[i].marks[j] == 0){
                ++k;
                printf("\n%d. %s\n",k,arr_student[i].sname);
                break;
            }
        }
        if (notqual==0) ++countqual;
    }
    printf("\nPercent of quality: %1.2f",100*(float)countqual/count);
    printf("\nThe best quality subject: %10s",&Subjects1[_getbestsub()][0]);
    arr = _sortqualgroup();
    printf("\nSorting group on quality knowledge: \n");
    i = 0;
    printf("\n| Number | Group | Quality\n");
    printf("------------------------------\n");

    while((arr+i)->numgroup!=0&&i!=count){
        printf("%5d. %7d  %8.2f \n",i+1,(arr+i)->numgroup,(arr+i)->quality/countsubject);
        ++i;
    }    
}


И наконец главный
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dialogs.h"

typedef struct {
    char sname[30];
    char name[30];
    int group;    
    int marks[4];

} student_t;

student_t arr_student[100]={{"Nevlyutov","Airat",441,4,3,5,4},
                            {"Glinka","Mihail",123,4,4,4,3},
                            {"Putin","Vladimir",214,5,5,5,4},
                            {"Pushkin","Aleksandr",441,5,4,3,5},
                            {"Pasternak","Boris",211,3,5,5,3}};

int count = 5;
char filename[] = "D:\\temp2.csv";
/*===============================================================================================*/
int main(void){    
    char str[10];
    printf("Information about students\n");    
    //ReadFromFile(filename,arr_student);
    do{
        _dialog_main();
        scanf("%s",str);
    } while (strcmp(str,"exit")!=0);
    /*printf("Do you want to save information in file?(y/n)");
    if (getch()=='y')  WriteToFile(filename,arr_student);*/
}





Это сообщение отредактировал(а) Silent_s - 20.12.2007, 18:34
--------------------
Мой блог
PM MAIL   Вверх
Twilight
Дата 21.12.2007, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Silent_s, ты мне подал идею. Уже пишу код. Вечером выложу, если закончу.
PM   Вверх
Silent_s
Дата 21.12.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Twilight @ 21.12.2007,  10:54)
Silent_s, ты мне подал идею. Уже пишу код. Вечером выложу, если закончу.

Ждем smile 
--------------------
Мой блог
PM MAIL   Вверх
Twilight
Дата 21.12.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот ещё один набросок. Может быть и на вопрос в комментариях сможешь ответить...

Код

#include <stdio.h>

int main()
{
    int students[25] = {2,3,5,2,3,5,2,3,4,0,2,0,3,4,0,5,2,0,3,3,2,0,4,5,3};
    int results[6] = {0,0,0,0,0,0};
    int results_all[2] = {0,0};
    char* name[6] = {"Ne yavilos': ","0", "Neudovletvoritel'no: ","Udovletvoritel'no: ","Horosho: ","Otlichno: "};
    char* name_all[2] = {"Любую оценку больше двух получило: ","Явилось: "};
    int i;
    int x;
    int temp;
    for(i = 0; i < 25; i++)
    {
        results[students[i]] = results[students[i]] + 1; // Оценка студента равна индексу массива results. Прибавляем 1.
        if(students[i] > 2)
        {
            results_all[1] = results_all[1] + 1;
        }
        if(students[i] > 0)
        {
            results_all[2] = results_all[2] + 1;
        }
    }
    printf("Results: ");
    for(i = 0; i < 6; i++)
    {
        printf("%5d",results[i]); // Откуда берётся единица в результатах?.. Мы ведь просто ингнорируем элемент массива results с индексом 1.
    }
    printf("\n");
    for(x = 1; x < 6; x++)
    {
        for(i = 0; i < 5; i++)
        {
            if(results[i] < results[i + 1])
            {
                temp = results[i];
                results[i] = results[i + 1];
                results[i + 1] = temp;
            }
        }
    }
}

PM   Вверх
Silent_s
Дата 21.12.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ты ее пробовал запускать?
--------------------
Мой блог
PM MAIL   Вверх
Twilight
Дата 21.12.2007, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Silent_s @ 21.12.2007,  11:43)
Ты ее пробовал запускать?

Конечно пробовал! Поэтому и написал вопрос в комментариях. smile
PM   Вверх
Silent_s
Дата 21.12.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну да я уже понял)) Вот только у меня она не запускается и пока не пойму из за чего...
--------------------
Мой блог
PM MAIL   Вверх
Twilight
Дата 21.12.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот, сваял...

Код

#include <stdio.h>

int main()
{
    int students[25] = {2,3,5,2,3,5,2,3,4,0,2,0,3,4,0,5,2,0,3,3,2,0,4,5,3};
    int results[7] = {0,0,0,0,0,0,0};
    char* name[7] = {"Не явилось: ","Явилось", "Неудовлетворительно: ","Удовлетворительно: ","Хорошо: ","Отлично: ","Любую оценку больше двух получило: "};
    int i;
    int x;
    int temp;
    for(i = 0; i < 25; i++)
    {
        results[students[i]] = results[students[i]] + 1;
        if(students[i] > 2)
        {
            results[6] = results[6] + 1;
        }
        if(students[i] > 0)
        {
            results[1] = results[1] + 1;
        }
    }
    for(x = 1; x < 6; x++)
    {
        for(i = 0; i < 7; i++)
        {
            if(results[i] < results[i + 1])
            {
                temp = results[i];
                results[i] = results[i + 1];
                results[i + 1] = temp;
                temp = name[i];
                name[i] = name[i + 1];
                name[i + 1] = temp;
            }
        }
    }
    printf("Results: ");
    for(i = 0; i < 7; i++)
    {
        printf("%s%d\n",name[i],results[i]);
    }
    printf("\n");
}



Как исправить ситуацию с крякозяблами вместо русских букв в командной строке? Система Windows XP Professional Service Pack 2. Компилятор Visual Studio C++ 6.0
PM   Вверх
Silent_s
Дата 22.12.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня лично работает вот так->
Код

#include <stdio.h>
#include <locale.h> 
int main()
{
    int students[25] = {2,3,5,2,3,5,2,3,4,0,2,0,3,4,0,5,2,0,3,3,2,0,4,5,3};
    int results[7] = {0,0,0,0,0,0,0};
    char* name[7] = {"Не явилось: ","Явилось", "Неудовлетворительно: ","Удовлетворительно: ","Хорошо: ","Отлично: ","Любую оценку больше двух получило: "};
    int i;
    int x;
    int temp;
    setlocale(LC_ALL, "Russian");
    for(i = 0; i < 25; i++)
    {
        results[students[i]] = results[students[i]] + 1;
        if(students[i] > 2)
        {
            results[6] = results[6] + 1;
        }
        if(students[i] > 0)
        {
            results[1] = results[1] + 1;
        }
    }
    for(x = 1; x < 6; x++)
    {
        for(i = 0; i < 7; i++)
        {
            if(results[i] < results[i + 1])
            {
                temp = results[i];
                results[i] = results[i + 1];
                results[i + 1] = temp;
                temp = name[i];
                name[i] = name[i + 1];
                name[i + 1] = temp;
            }
        }
    }
    printf("Results: ");
    for(i = 0; i < 7; i++)
    {
        printf("%s%d\n",name[i],results[i]);
    }
    printf("\n");
}

--------------------
Мой блог
PM MAIL   Вверх
Twilight
Дата 22.12.2007, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Silent_s @ 22.12.2007,  00:18)
У меня лично работает вот так->

А у меня всё равно крякозабли.

Да и пара warning'ов есть.

Цитата
C:\Documents and Settings\Twilight\Рабочий стол\My Projects\Labs\lab1\lab1.c(34) : warning C4047: '=' : 'int ' differs in levels of indirection from 'char *'
C:\Documents and Settings\Twilight\Рабочий стол\My Projects\Labs\lab1\lab1.c(36) : warning C4047: '=' : 'char *' differs in levels of indirection from 'int '

PM   Вверх
Silent_s
Дата 22.12.2007, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А у меня компилятор Visual Studio 2005 и меня работает, а для своего как сделать посмотри здесь http://www.rsdn.ru/Forum/Message.aspx?mid=2472236
--------------------
Мой блог
PM MAIL   Вверх
Новичок 
Дата 14.9.2008, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

А у меня компилятор Visual Studio 2005 и меня работает, а для своего как сделать посмотри здесь http://www.rsdn.ru/Forum/Message.aspx?mid=2472236


Спасибо за ресурс  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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