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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Структура student, Неправильно выводит данные 
V
    Опции темы
14SatanA88
Дата 30.11.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброе время суток, уважаемые программеры!
Давно не трогал плюсы, но когда понадобилось, натолкнулся на некоторые проблемы

Задание:
1.    Описать структуру с именем STUDENT, содержащую следующие поля:
•    NAME – фамилия и инициалы;
•    Номер группы;
•    Успеваемость (массив из пяти элементов).
2.    Написать программу, выполняющую следующие действия:
•    Ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по возрастанию среднего балла;
•    Вывод на дисплей фамилий и номеров групп для всех студентов, имеющих оценки 7, 8, 9;
•    Если таких студентов нет, вывести соответствующее сообщение.

Код

#include <iostream>
#include <conio>
#include <string>
#include <stdlib>
#include <stdio>

struct student
{
    char name[20];
   char gr[3];
   int mark[5];
};

int main()
{
int i,j,k=0;
float avg[10];
float t;
bool usp[10];
bool u=false;
struct student s[10];
struct student temp;
char m[5];

// ввод данных
for (i=0;i<3;i++)
{
    cout<<"Enter name: "; cin>>s[i].name;
    cout<<"Enter group: "; cin>>s[i].gr;
    cout<<"Enter marks: ";
   for (j=0;j<5;j++)
   {
    cin>>s[i].mark[j];
      avg[i]+=s[i].mark[j];
      m[j]=(char)s[i].mark[j]+48;
   }
   avg[i]/=5;
    if ((strchr(m,'7')!=0) && (strchr(m,'8')!=0) && (strchr(m,'9')!=0))
   {
    usp[i]=true;
      k++;
   }
   else {usp[i]=false;}
}
cout<<endl<<endl;

// сортировка данных по среднему баллу
for (j=0;j<10;j++)
{
    for (i=0;i<2;i++)
    {
        if (avg[i]>avg[i+1])
       {
        temp=s[i];
          s[i]=s[i+1];
          s[i+1]=temp;
            t=avg[i];
          avg[i]=avg[i+1];
          avg[i+1]=t;
         u=usp[i];
         usp[i]=usp[i+1];
         usp[i+1]=u;
    }
    }
}

// вывод данных
if (k!=0)
{
    for (i=0;i<3;i++)
   {
    if (usp[i]=true)
      {
       cout<<"FIO: "<<s[i].name<<" Gruppa: "<<s[i].gr<<" Sr.ball: "<<avg[i]<<endl;
      }
   }
}
else cout<<"Studentov s ocenkami 7,8,9 net."<<endl;

getch();
return 0;
}


Вопросы:
1. Почему в строку m записываются не только введенные числа (оценки), но и "левые символы"? Например, при вводе 1 2 3 4 5 в m записывается 12345BA. Как это исправить и почему так происходит?
2. Если ввести некоторые данные, не удовлетворяющие критериям задания, прога их выводит, хотя не должна. Где я допустил ошибку?
PM MAIL ICQ   Вверх
mes
Дата 30.11.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(14SatanA88 @  30.11.2010,  11:34 Найти цитируемый пост)
1. Почему в строку m записываются не только введенные числа (оценки), но и "левые символы"? Например, при вводе 1 2 3 4 5 в m записывается 12345BA. Как это исправить и почему так происходит?

код не смотрел, но явно не хватает нуль-терминатора .. или обнуляйте перед заполнением, либо после заполнения в конце ставьте 0.. 



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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(14SatanA88 @  30.11.2010,  12:34 Найти цитируемый пост)
Давно не трогал плюсы,
Судя по стилю написания программы - я бы сказал не 'давно', а скорее 'никогда'  smile 

Цитата(14SatanA88 @  30.11.2010,  12:34 Найти цитируемый пост)
Почему в строку m записываются не только введенные числа (оценки), но и "левые символы"?
Строку надо терминировать нулем, а еще лучше использовать std::string, раз уж на плюсах пишешь

Цитата(14SatanA88 @  30.11.2010,  12:34 Найти цитируемый пост)
Где я допустил ошибку? 
Где то между 14 и 82 строками  smile 
Код

#include <map>
#include <string>

using namespace std;

struct Student {
 string name;
 int group;
 int marks[5];
};

int main()
{
 multimap<int,Student> students;

 for(int i=0;i<10;++i)
  {
   Student s;
   cout<<"Name: "; cin>>s.name;
   cout<<"Group: "; cin>>s.group;
   cout<<"Marks: ";
   int acc=0;
   for(int j=0;j<5;++j) {cin>>s.marks[j]; acc+=s.marks[j];}
   students.insert(pair<int,Student>(acc,s));
  }

 for(multimap<int,Student>::iterator iter=students.begin();iter!=students.end();++iter)
  {
   Student& S=iter->second;
   for(int i=0;i<5;++i)
    if (S.marks[i]>=7 && S.marks[i]<=9) 
     {
      cout << S.name << ", Group "<<S.group << endl;
      break;
     }
  }

 return 0;
}



Добавлено через 1 минуту и 54 секунды
Ошибка в строке 72: сравнение в С это '==', а не '='  smile 

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


Опытный
**


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

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



Цитата

Судя по стилю написания программы - я бы сказал не 'давно', а скорее 'никогда'   


Да не, было время, приходилось и на плюсах писать ) 
Кстати, что не так со стилем? Просвяти, а то я новичек в плюсах, всего за свою жизнь пару лаб сделал. Причем давно.

Цитата

Где то между 14 и 82 строками   


Ну ты и тролль )

Цитата

Ошибка в строке 72: сравнение в С это '==', а не '='   


Огромное спасибо. Упустил.
PM MAIL ICQ   Вверх
xvr
Дата 30.11.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(14SatanA88 @  30.11.2010,  13:37 Найти цитируемый пост)
Кстати, что не так со стилем? 
Ничего. Просто это не программа на С++, это программа на С, завернутая в С++ файл  smile 


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


Эксперт
****


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

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



Цитата(14SatanA88 @  30.11.2010,  14:37 Найти цитируемый пост)
Кстати, что не так со стилем?

Оформление кода
PM   Вверх
14SatanA88
Дата 30.11.2010, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Строку надо терминировать нулем


Как это сделать, используя как строку char m[5]?

Добавлено через 6 минут и 19 секунд
bsa, так нормально у меня код оформлен.

Добавлено через 9 минут и 16 секунд
все, с нуль-терминатором разобрался.
Всем огромное спасибо!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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