Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с вводом float при пом. указателей

48K
05 мая 2009 года
Him_G
4 / / 05.05.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;
   
    for(j=(i+1); j<nstud; j++)
      if(VUZik[j].sr_ball > temp_buf.sr_ball)
       {
           VUZik = VUZik[j];
           VUZik[j] = temp_buf;
           temp_buf = VUZik;
       }
  }
}

//******************************************************************
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();
}
1.9K
06 мая 2009 года
GreenRiver
451 / / 20.07.2008
У Вас p это я так понимаю указатель на структуру? А вы ее создаете или только объявляете указатель?
48K
06 мая 2009 года
Him_G
4 / / 05.05.2009
Спасибо, GreenRiver, что ответили!
Структура уже объявлялась ранее, а *р просто указатель
на нее (struct VUZ *p).

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


К сожалению не понял, что надобно сделать, как подправить программу, чтобы работала.
1.9K
06 мая 2009 года
GreenRiver
451 / / 20.07.2008
Извиняюсь, не разобрался сразу... не понял, что внизу это Ваш код, понял так, что это пример какой-то :).
У вас ошибка при передаче массива в функцию. Статический массив это не указатель, а совершенно другой тип данных. Поэтому такие вот приколы получаются. Но даже если объявить массив вот так:
 
Код:
VUZ *VUZik = new VUZik[10];

и передать его в функцию, то заполнится только первый элемент - тогда логичнее было бы вызывать в цикле:
 
Код:
for (int i=0; i < 10; i++)
{
     vvod(&VUZik);
}


P.S.
 
Код:
struct VUZ
      {  
         int n_gruppy;        // Номер группы    
         char  familiya[50];  // Фамилия студента    
         float sr_ball;       // Средний балл  
         
      }[COLOR="#ff0000"]VUZik[n][/COLOR];
[COLOR="Red"]struct VUZ *p;[/COLOR]

Тут что-то страшное... вообще не знал, что компилятор такое проглотит... По-моему лучше так не делать...
Особенно строчка struct VUZ *p; непонятно зачем нужна
87
06 мая 2009 года
Kogrom
2.7K / / 02.02.2008
Вроде нормально в программе все, кроме стиля и надежности (например, если студентов в ведомости будет больше 100 - произойдет сбой). Вероятно, еще компилятор старинный (что-то древнее под ДОС). Проблема с первым вариантом наверно из-за того, что число вводится через запятую типа 4,5 , а не через точку типа 4.5. Вот и вылетает программа. Хотя по уму в таком случае должна прочитать 4.0.

Возможно, поможет, если ввести строку, а потом пытаться ее преобразовать в float.
87
06 мая 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: GreenRiver
P.S.
 
Код:
struct VUZ
      {  
         int n_gruppy;        // Номер группы    
         char  familiya[50];  // Фамилия студента    
         float sr_ball;       // Средний балл  
         
      }[COLOR="#ff0000"]VUZik[n][/COLOR];
[COLOR="Red"]struct VUZ *p;[/COLOR]

Тут что-то страшное... вообще не знал, что компилятор такое проглотит... По-моему лучше так не делать...
Особенно строчка struct VUZ *p; непонятно зачем нужна


Это потому, что используется Си, который без плюсов. Там смысл структур, стиль и синтаксис другой немного.

А указатель struct VUZ *p в том месте действительно только с толку сбивает.

1.9K
06 мая 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: Kogrom
Это потому, что используется Си, который без плюсов. Там смысл структур, стиль и синтаксис другой немного.

А указатель struct VUZ *p в том месте действительно только с толку сбивает.


Тогда прошу не обращать внимания на то, что я писал :) Потому что все это относится к плюсам, как в си обстоит дело я не знаю :)

48K
10 мая 2009 года
Him_G
4 / / 05.05.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;

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

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

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




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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог