Перевод из С++ в С. Структура "Студент" - C (СИ)
Формулировка задачи:
Кто подскажет что нужно изменить чтобы перевести этот код на язык С
#include "stdafx.h"
#include <iostream>
#include <cstring>
#include <windows.h>
#include <fstream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
using namespace std;
char way[80];
char *file;
double x;
int p;
char s;
struct student
{
char fio[50];
char adr[50];
int gr;
double rat;
void input();
};
void tabl()
{
int z;
for (z = 0; z<80; z++)
cout << '-';
}
void print(student *s, int n)
{
int i;
tabl();
cout.setf(ios::left);
cout << '|' << ' ' << setw(22) << "ФИО";
cout << '|' << ' ' << setw(34) << "Домашний адрес";
cout << '|' << ' ' << setw(7) << "Группа";
cout << '|' << ' ' << setw(8) << "Рейтинг";
cout << '|';
tabl();
for (i = 0; i<n; i++)
{
cout.setf(ios::left);
cout << '|' << ' ' << setw(22) << s[i].fio << '|';
cout << ' ' << setw(34) << s[i].adr << '|';
cout << ' ' << setw(7) << s[i].gr << '|';
cout << ' ' << setw(8) << s[i].rat;
cout << '|';
tabl();
}
}
void student::input()
{
cout << "Введите фамилию, имя, отчество студента -> ";
cin.clear();
_flushall();
cin.getline(fio, 79);
cout << "Введите домашний адрес -> ";
cin.clear();
_flushall();
cin.getline(adr, 79);
cout << "Введите группу -> ";
cin >> gr;
cout << "Введите рейтинг -> ";
cin >> rat;
}
void main()
{ setlocale(LC_ALL, "rus");
student *s;
int n, i, o = -1;
cout << "Введите количество студентов -> ";
cin >> n;
s = new student[n];
for (; o;)
{
cout << "1.Ввод с клавиатуры в консольном режиме\n2.Вывод на экран в консольном режиме\n3.Создать файл и записать в него структурированные данные\n";
cout << "4.Вывести созданный файл на экран\n5.Удалить все элементы у которых рейтинг меньше заданного\n";
cout << "6.Добавить элемент с заданным номером\n7.Выход\n";
cout << "\nВыберите нужный вам пункт -> ";
cin >> o;
cout << "\n";
if (o == 1)
{
/*cout << "Введите количество студентов -> ";
cin >> n;
s = new student[n];*/
for (i = 0; i<n; ++i)
{
s[i].input();
}
}
if (o == 2)
{
cout << "\nВведенные данные:\n";
print(s, n);
}
if (o == 3)
{
cout << "Введите путь к файлу или название файла для записи в него данных -> \n";
cin.clear();
_flushall();
cin.getline(way, 80);
ofstream output(way, ios::out | ios::trunc);
output.setf(ios::left);
if (!output.is_open())
{
cout << "/nОшибка!\n";
return;
}
for (i = 0; i<n; i++)
{
output.setf(ios::left);
output << setw(22) << s[i].fio;
output << setw(34) << s[i].adr;
output << setw(7) << s[i].gr;
output << setw(8) << s[i].rat << "\n";
}
output.close();
}
if (o == 4)
{
cout << "Введите путь к файлу или название файла для чтения из него данных -> \n";
cin.clear();
_flushall();
cin.getline(way, 80);
ifstream input(way, ios::in);
const int buffer = 4096;
file = new char[buffer];
if (!input.is_open())
{
cout << "Ошибка\n";
return;
}
cout << "\nПрочитанные данные из файла:\n";
tabl();
while (input.peek() != EOF)
{
input.getline(file, buffer);
cout << file << "\n";
}
tabl();
input.close();
}
if (o == 5)
{
cout << "Введите путь к файлу или название файла для чтения из него данных\n";
cin.clear();
_flushall();
cin.getline(way, 80);
ofstream output(way, ios::out | ios::trunc);
if (!output.is_open())
{
cout << "Ошибка\n";
return;
}
cout << "Удалить из файла элементы рейтинг которых меньше -> ";
cin >> x;
for (i = 0; i<n; i++)
{
if (x<s[i].rat)
{
output.setf(ios::left);
output << setw(22) << s[i].fio;
output << setw(34) << s[i].adr;
output << setw(7) << s[i].gr;
output << setw(8) << s[i].rat;
output.put(13);
output.put(10);
}
}
}
if (o == 6)
{
cout << "Введите путь к файлу или название файла для чтения из него данных\n";
cin.clear();
_flushall();
cin.getline(way, 80);
ofstream output(way, ios::app);
cout << "Введите номер элемента, который следует добавить -> ";
cin >> p;
student r;
cout << "Введите фамилию, имя, отчество студента -> ";
cin.clear();
_flushall();
cin.getline(r.fio, 79);
cout << "Введите домашний адрес -> ";
cin.clear();
_flushall();
cin.getline(r.adr, 79);
cout << "Введите группу -> ";
cin >> r.gr;
cout << "Введите рейтинг -> ";
cin >> r.rat;
output.seekp(p * sizeof(s[0]), ios::beg);
output.setf(ios::left);
output << setw(22) << r.fio;
output << setw(34) << r.adr;
output << setw(7) << r.gr;
output << setw(8) << r.rat;
}
if (o == 7)
return;
}
delete[]s;
}
}*/Решение задачи: «Перевод из С++ в С. Структура "Студент"»
textual
Листинг программы
int ch;
int result;
//...
do
{
printf("Введите количество студентов -> ");
result = scanf("%d", &n);
if (1 != result)
{
system("CLS");
printf("Вы ввели не верное значение: ");
while ((ch = getchar()) != '\n')
putchar(ch);
putchar(ch);
}
} while (1 != result);
Объяснение кода листинга программы
- Объявлены две переменные:
chиresultтипаint - В теле цикла
do-whileпроисходит следующее:- Выводится сообщение
Введите количество студентов -> - Происходит попытка чтения количества студентов с помощью функции
scanf, в которую передается адрес переменнойnи строка формата%d - Если
scanfвернула значение 1, то есть количество студентов успешно введено, то цикл прекращается - Если
scanfвернула значение 0, то есть произошла ошибка при вводе, то выполняется следующий блок кода:- Система выводит сообщение
Вы ввели не верное значение: - С помощью цикла
whileпроисходит пропуск символа новой строки, чтобы дать возможность пользователю исправить ошибку ввода
- Система выводит сообщение
- Выводится сообщение
- Цикл
do-whileвыполняется до тех пор, покаscanfне вернет значение 1