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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не вводятся float данные в структуру, Не вводится этот тип данных 
V
    Опции темы
Him
Дата 6.5.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уважаемые форумчане! Помогите!
Не могу понять один момент:
мне надобно ввести средний балл студентов, как я понимаю, это число с запятой,
значит тип float, однако, при попытке описать в структуре VUZ
...
float sr_ball;
...

а затем осуществить ввод с клавиатуры при помощи
...
printf(" Средний балл: ");
scanf("%f", &(*p).sr_ball); //Ввод с клавиатуры среднего балла
fflush(stdin); //Сбрасываем входной поток
...

компилятор выдает ошибку по поводу плавающей запятой.
scanf: floating point formats not linked и далее аварийное завершение
программы. Abnormal program termination.
(программа начинает работать, но при попытке ввести средний
балл слетает)

Меняю:
...
printf(" Средний балл: ");
scanf("%6.2f", &(*p).sr_ball); //Ввод с клавиатуры среднего балла
fflush(stdin); //Сбрасываем входной поток
...

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

Какая хитрость есть при вводе адреса числа с плавающей запятой?

Как же тогда надо вводить?
Я не сумел найти ответ в тех литературах, что у меня есть...
Можно сделать по образцу встроенного хелпа, но там не учитываются процедуры (функции).

Код

#include <stdio.h>
#include <conio.h>
#define n 100

struct VUZ
      {  
         int n_gruppy;        // Номер группы     
         char  familiya[50];  // Фамилия студента    
         float sr_ball;       // Средний балл  
         
      }VUZik[n];
struct VUZ *p;

int nstud, gruppa;

//Заполнение структуры VUZ данными введенными с клавиатуры
void vvod(struct VUZ *p)
{
 clrscr();                                  // Чистим экран
 int i=0;                            //Нач. знач для послед цикла ввода данных

 printf("Количество студентов в ведомости: ");
 scanf("%d", &nstud);                        //Ввод с клавиатуры количества студентов
 fflush(stdin);                             //Сбрасываем входной поток

  for (i=0; i<nstud; i++)                     //Заполнение структуры VUZ
  {
   printf("\n %d\n",i+1);  // Ввод порядкового номера строки
      
   printf(" Номер группы: ");
   scanf("%d", &(*p).n_gruppy);             //Ввод с клавиатуры номера группы
   fflush(stdin);                           //Сбрасываем входной поток
     
   
   printf("  Средний балл: ");
   scanf("%f", &(*p).sr_ball);               //Ввод с клавиатуры среднего балла
   fflush(stdin);                           //Сбрасываем входной поток
   

   printf(" Фамилия студента: ");
   scanf("%49s", (*p).familiya);                 //Ввод с клавиатуры фамилии
   fflush(stdin);                           //Сбрасываем входной поток
   p++;                                     //Переводим указатель на следующий элемент структуры
   
  }
}

// Вывод на экран таблицы списка студентов
void vyvod(struct VUZ *p, int c, int gruppa)    
{
 int i=0;
 if (c==1) printf("\nСписок студентов: %d",gruppa); // Вывод на экран строки, вывод по номеру группы
 printf("\n---------------------------------------------------------------------------");
 printf("\n Группа  |    Фамилия студента                     | Средний балл ");
 printf("\n---------------------------------------------------------------------------\n");

 if (c==0)                // предустановленное значение для вывода всех записей
    for (i=0; i<nstud; i++)
     {
       printf("|%6d | %50s |%f |\n",(*p).n_gruppy,(*p).familiya,(*p).sr_ball);
       p++;
     }
 else                      //Иначе - выводим на экран список по заданной группе
     for (i=0; i<nstud; i++)
      {
          if ((*p).n_gruppy==gruppa)      
          printf("|%6d | %50s |%f |\n",(*p).n_gruppy,(*p).familiya,(*p).sr_ball);       
          p++;
      }
 printf("---------------------------------------------------------------------------\n");
}

// Сортировка структуры по убыванию среднего балла
void sort(struct VUZ *p)
{
  struct VUZ temp_buf;
  int i, j;
  for (i=0; i<(nstud-1); i++)
  {
    temp_buf = VUZik[i];
    
    for(j=(i+1); j<nstud; j++)
      if(VUZik[j].sr_ball > temp_buf.sr_ball)
       {
           VUZik[i] = VUZik[j];
           VUZik[j] = temp_buf;
           temp_buf = VUZik[i];
       }
  }
}

//******************************************************************
void main(void)
{
 vvod(VUZik);                      //Ввод данных о студентах
 vyvod(VUZik, 0, 0);                 //Вывод на экран введенной информации
 sort(VUZik);                      //Сортировка структуры по убыванию среднего балла
 printf("Введите номер группы: ");
 scanf("%d", &gruppa);                //Ввод с клавиатуры номера группы, для получения отчета
 fflush(stdin);                  //Сбрасываем входной поток
 vyvod(VUZik, 1, gruppa);                //Вывод на экран инфрмации о составе группы (gruppa)

printf("\n Для выхода нажмите любую клавишу...");
getch();
}

PM MAIL   Вверх
J0ker
Дата 6.5.2009, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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





--------------------
user posted image
PM MAIL   Вверх
Him
Дата 6.5.2009, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



J0ker,  Посмотрел я эту ссылочку, перевел, но собственно как эту проблему все-таки решить.
Как создать обходной путь - не понял...
А так - спасибо и за это.
PM MAIL   Вверх
J0ker
Дата 6.5.2009, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



по видимому в вашей CRT либо вообще отсутствует поддержка FP, либо ее можно включать и выключать
ошибка, которую вы получаете - это заглушка на соответствующую функциональность scanf
что делать - читать доку по компилятору и библиотекам
для контроля попробуйте выполнить простейший код

Код

float f;
scanf("%f", &f);
printf("%f\n", f);


если будет та-же ошибка - проблемма определенно в сказанном выше

Это сообщение отредактировал(а) J0ker - 6.5.2009, 09:11


--------------------
user posted image
PM MAIL   Вверх
Him
Дата 10.5.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо ВАМ всем огромное за помощь.

Пришлось ввести средний балл строкой символов, а потом конвертировать в float.
Вот условие и листинг конечной программы:
  
      Написать программу формирования ведомости об успеваемости студентов. Каждая запись этой ведомости должна содержать номер группы, фамилию студента, средний балл за последнюю сессию. Необходимо распечатать списки студентов по группам. В каждой группе фамилии студентов разместить в порядке убывания среднего балла.

Код

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define n 100                                // Максимальное число записей

struct VUZ
      {
         int n_gruppy;                       // Номер группы
         char  familiya[40];                 // Фамилия студента
         float sr_ball;                      // Средний балл

      }VUZik[n];
struct VUZ *p;

int nstud, gruppa;

// Заполнение структуры VUZ данными введенными с клавиатуры
void vvod(struct VUZ *p)
 {
    clrscr();                                // Чистим экран
    int i=0;                                 // Нач. знач для послед цикла ввода данных
    float temp_f;                            // Временная переменная
    char temp_string[10];                    // Временная строка для конвертации


    printf("Количество студентов в ведомости: ");
    scanf("%d", &nstud);                     // Ввод с клавиатуры количества студентов

    for (i=0; i<nstud; i++)                  // Заполнение структуры VUZ
     {
        printf("\n %d.   ",i+1);             // Ввод порядкового номера строки

        printf("Номер группы: ");
        scanf("%d", &(*p).n_gruppy);         // Ввод с клавиатуры номера группы

        printf("      Средний балл: ");
        gets(temp_string);                   // Ввод с клавиатуры среднего балла
        scanf("%s", &temp_string);           // Получение адреса значения среднего балла
          char *str= temp_string;              // Ковертация типа строка в тип float
        temp_f = atof(str);                  // Напрямую ч/з scanf("%f", &...) компилятор не понимает
        (*p).sr_ball = temp_f;               // Присваивание конвертированного значения

        printf("      Фамилия студента: ");
        scanf("%39s", (*p).familiya);        // Ввод с клавиатуры фамилии

        p++;                                 // Переводим указатель на следующий элемент структуры
     }
 }

// Вывод на экран таблицы списка студентов
void vyvod(struct VUZ *p, int c, int gruppa)
 {
    int i=0;
    if (c==1) printf("\nСписок студентов %d-й группы: ", gruppa); // Вывод строки на экран
    printf("\n-------------------------------------------------------------------------");
    printf("\n| Группа |            Фамилия студента             |    Средний балл    |");
    printf("\n-------------------------------------------------------------------------\n");

    if (c==0)                                // Предустановленное значение для вывода всех записей
       for (i=0; i<nstud; i++)
           {
             printf("|%7d | %39s |%12.2f        |\n",(*p).n_gruppy,(*p).familiya,(*p).sr_ball);
             p++;
           }
       else                                  // Иначе - выводим на экран список по заданной группе
          for (i=0; i<nstud; i++)
           {
              if ((*p).n_gruppy==gruppa)
                printf("|%7d | %39s |%12.2f        |\n",(*p).n_gruppy,(*p).familiya,(*p).sr_ball);
                p++;
           }
     printf("-------------------------------------------------------------------------\n");
 }

// Сортировка структуры по убыванию среднего балла
void sort(struct VUZ *p)
 {
    struct VUZ temp_buf;
    int i, j;
    for (i=0; i<(nstud-1); i++)
      {
         temp_buf = VUZik[i];

         for(j=(i+1); j<nstud; j++)
         if(VUZik[j].sr_ball > temp_buf.sr_ball)
           {
                VUZik[i] = VUZik[j];
                VUZik[j] = temp_buf;
                temp_buf = VUZik[i];
           }
      }
 }

//******************************************************************
void main(void)
 {
    vvod(VUZik);                             // Ввод данных о студентах
    vyvod(VUZik, 0, 0);                      // Вывод на экран введенной информации
    sort(VUZik);                             // Сортировка структуры по убыванию среднего балла
    printf("Введите номер группы: ");
    scanf("%d", &gruppa);                    // Ввод с клавиатуры номера группы, для получения отчета
    vyvod(VUZik, 1, gruppa);                 // Вывод на экран инфрмации о составе группы (gruppa)

    printf("\n Для выхода нажмите любую клавишу...");
    getch();
 }
 

ТЕМА ЗАКРЫТА, ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ


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

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

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

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

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


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

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


 




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


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

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