Новичок
Профиль
Группа: Участник
Сообщений: 19
Регистрация: 26.10.2014
Репутация: нет Всего: нет
|
Доброго времени суток! Имеется код, всё работает нормально, но функция void obrabotka2() выводит некорректные результаты. В общем, составляется таблица оценок за сессию, 4 предмета. obrabotka2() должна записать в файл список студентов, сдавших выбранный экзамен, введённый с клавиатуры, на "5"; либо файл остаётся пустым, либо выводятся не те ученики, которые имеют "5" по другим предметам. Заранее большое спасибо! | Код | #include<conio.h> #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<windows.h> void create(); void menu(); void menu2(); void view(); void obrabotka1(); void obrabotka2(); void obrabotka3(); int check(int a); int x, y; using namespace std; struct sess { char name[10];// имя студента int math;// оценка по математике int progr; // оценка по программированию int phys;//оценка по физике int discr;//оценка по дискретной математике }; sess* read(char name[8]);//функция считывает из файла name массив строк типа sess и возвращает его void main() { setlocale(LC_ALL, "Russian"); menu(); } void gotoxy(int xpos, int ypos) { COORD scrn; HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE); scrn.X = xpos; scrn.Y = ypos; SetConsoleCursorPosition(hOuput, scrn); } void menu() { system("cls"); while (1) { system("cls"); cout << "-------------------- MENU -----------\n"; cout << "=======================================\n"; cout << " 1- Создать новый файл" << endl; cout << " 2- Открыть файл" << endl; cout << " 3- Обработать файл" << endl; cout << " 4- Выход" << endl; switch (getch()) { case '1': create(); break; case '2': view(); break; case '3': menu2(); break; case '4': exit(0); } } } void menu2() { setlocale(LC_ALL, "Russian"); system("cls"); while (1) { system("cls"); cout << "------------------------------------- MENU -----------------------------------\n"; cout << "================================================================================\n"; cout << " 2- Создать список студентов, сдавших экзамены на 5 по выбранной дисциплине" << endl; cout << " 4- Выйти в главное меню" << endl; switch (getch()) { case '2': obrabotka2(); break; case '4': menu(); break; } } } void create() { setlocale(LC_ALL, "Russian"); int n, i; char name[5]; system("cls"); cout << "Введите имя файла: \n"; gets(name);// ввод имени файла для записи FILE*f = fopen(name, "w"); system("cls"); cout << "Введите количество студентов: "; cin >> n;// ввод количества записей sess *session;//создание массива строк типа sess session = new sess[n]; system("cls"); cout << "========================================\n"; cout << "| Name | Math | Progr | Phys | Discr|\n"; cout << "----------------------------------------\n"; for (i = 0; i<n; i++) { if (i != n - 1) { cout << "| | | | | |\n"; cout << "----------------------------------------\n"; } else { cout << "| | | | | |\n"; cout << "========================================\n"; } } //запись количества строк в файл fwrite(&n, sizeof(n), 1, f); y = 3; //начало цикла ввода исходных данных for (int i = 0; i<n; i++) { x = 1; gotoxy(x, y); cin>>(session[i].name); x += 12; gotoxy(x, y); cin >> session[i].math; while (check(session[i].math) == 0) { gotoxy(x, y); cin >> session[i].math; } x += 8; gotoxy(x, y); cin >> session[i].progr; while (check(session[i].progr) == 0) { gotoxy(x, y); cin >> session[i].progr; } x += 8; gotoxy(x, y); cin >> session[i].phys; while (check(session[i].phys) == 0) { gotoxy(x, y); cin >> session[i].phys; } x += 8; gotoxy(x, y); cin >> session[i].discr; while (check(session[i].discr) == 0) { gotoxy(x, y); cin >> session[i].discr; } fwrite(&session[i], sizeof(session[i]), 1, f); x = 2; y += 2; } fclose(f); } int check(int a)// функция проверки оценки на корректность { if (2 <= a && a <= 5) return 1; else return 0; } void view() { setlocale(LC_ALL, "Russian"); system("cls"); char name[5]; int n; cout << "Введите имя файла: \n"; gets(name); FILE*f = fopen(name, "r"); while(fopen(name, "r") == 0) { gets(name); f = fopen(name, "r"); } fread(&n, sizeof(n), 1, f); fclose(f); sess *session = new sess[n]; //чтение массива строк из файла session = read(name); system("cls"); cout << "========================================\n"; cout << "| Name | Math | Progr | Phys | Discr|\n"; cout << "----------------------------------------\n"; for (int i = 0; i<n; i++) { if (i != n - 1) { cout << "| | | | | |\n"; cout << "----------------------------------------\n"; } else { cout << "| | | | | |\n"; cout << "========================================\n"; } } y = 3; x = 2; //запись введенных данных в файл for (int i = 0; i<n; i++) { x++; gotoxy(x, y); printf("%s", session[i].name); x += 13; gotoxy(x, y); printf("%d", session[i].math); x += 7; gotoxy(x, y); printf("%d", session[i].progr); x += 8; gotoxy(x, y); printf("%d", session[i].phys); x += 7; gotoxy(x, y); printf("%d", session[i].discr); y += 2; x = 2; } delete session;//очисткапамяти while (!kbhit()); } void obrabotka2() { setlocale(LC_ALL, "Russian"); system("cls"); char name[8], name2[8], predmet[8]; int n, p = 0, k = 0; cout << "Введите имя файла: \n"; gets(name); FILE*f = fopen(name, "r"); while (fopen(name, "r") == 0) { gets(name); f = fopen(name, "r"); } cout << "Введите имя файла для записи: \n"; gets(name2); FILE*f2 = fopen(name2, "w"); fread(&n, sizeof(n), 1, f); fclose(f); sess *session = new sess[n]; //чтение массива строк из файла session = read(name); cout << "Введите предмет(math, progr, phys, discr): \n"; //ввод названия дисциплины gets(predmet); //поиск студентов, сдавших указанную дисциплину на 5 if (!strcmp(predmet, "math")) { p = 0; } if (!strcmp(predmet, "progr")) { p = 1; } if (!strcmp(predmet, "phys")) { p = 2; } if (!strcmp(predmet, "discr")) { p = 3; } p = 5 + p; for (int i = 0; i<n; i++) { if (*((int*)(session + i) + p) == 5) k++; } //запись результата в файл fwrite(&k, sizeof(k), 1, f2); for (int i = 0; i<n; i++) if (*((int*)(session + i) + p) == 5) fwrite(&session[i], sizeof(session[i]), 1, f2); fclose(f2); } sess* read(char name[8]) { system("cls"); int n; FILE*f = fopen(name, "r"); fread(&n, sizeof(n), 1, f); sess *session = new sess[n]; for (int i = 0; i<n; i++) fread(&session[i], sizeof(sess), 1, f); fclose(f); return session; }
|
|