#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();
}
Проблема с вводом float при пом. указателей
Не могу понять один момент:
мне надобно ввести средний балл студентов, как я понимаю, это число с запятой,
значит тип 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); //Сбрасываем входной поток
...
проходит, но ввод среднего балла становится просто невозможным, она
предлагает сразу вводить фамилию, а потом при выводе таблицы
появляются вместо среднего балла нули! т.е. не вводятся
значения...
Какая хитрость есть при вводе адреса числа с плавающей запятой?
Как же тогда надо вводить?
Я не сумел найти ответ в тех литературах, что у меня есть...
Можно сделать по образцу встроенного хелпа, но там не учитываются процедуры (функции).
****************************************************************
Код:
У Вас p это я так понимаю указатель на структуру? А вы ее создаете или только объявляете указатель?
Структура уже объявлялась ранее, а *р просто указатель
на нее (struct VUZ *p).
Вот ее объявление:
Код:
struct VUZ
{
int n_gruppy; // Номер группы
char familiya[50]; // Фамилия студента
float sr_ball; // Средний балл
}VUZik[n];
{
int n_gruppy; // Номер группы
char familiya[50]; // Фамилия студента
float sr_ball; // Средний балл
}VUZik[n];
К сожалению не понял, что надобно сделать, как подправить программу, чтобы работала.
У вас ошибка при передаче массива в функцию. Статический массив это не указатель, а совершенно другой тип данных. Поэтому такие вот приколы получаются. Но даже если объявить массив вот так:
Код:
VUZ *VUZik = new VUZik[10];
и передать его в функцию, то заполнится только первый элемент - тогда логичнее было бы вызывать в цикле:
Код:
for (int i=0; i < 10; i++)
{
vvod(&VUZik);
}
{
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]
{
int n_gruppy; // Номер группы
char familiya[50]; // Фамилия студента
float sr_ball; // Средний балл
}[COLOR="#ff0000"]VUZik[n][/COLOR];
[COLOR="Red"]struct VUZ *p;[/COLOR]
Тут что-то страшное... вообще не знал, что компилятор такое проглотит... По-моему лучше так не делать...
Особенно строчка struct VUZ *p; непонятно зачем нужна
Возможно, поможет, если ввести строку, а потом пытаться ее преобразовать в float.
Цитата: GreenRiver
P.S.
Тут что-то страшное... вообще не знал, что компилятор такое проглотит... По-моему лучше так не делать...
Особенно строчка struct VUZ *p; непонятно зачем нужна
Код:
struct VUZ
{
int n_gruppy; // Номер группы
char familiya[50]; // Фамилия студента
float sr_ball; // Средний балл
}[COLOR="#ff0000"]VUZik[n][/COLOR];
[COLOR="Red"]struct VUZ *p;[/COLOR]
{
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 в том месте действительно только с толку сбивает.
Цитата: Kogrom
Это потому, что используется Си, который без плюсов. Там смысл структур, стиль и синтаксис другой немного.
А указатель struct VUZ *p в том месте действительно только с толку сбивает.
А указатель struct VUZ *p в том месте действительно только с толку сбивает.
Тогда прошу не обращать внимания на то, что я писал :) Потому что все это относится к плюсам, как в си обстоит дело я не знаю :)
Пришлось ввести средний балл строкой символов, а потом конвертировать в 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();
}
#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();
}
ТЕМА ЗАКРЫТА, ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ