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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите найти ошибку в коде. 
V
    Опции темы
mycodeurnightmare
Дата 26.10.2014, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
}

PM MAIL   Вверх
borisbn
Дата 27.10.2014, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Мдаааа... по "progr" у тебя точно не 5.
1) Если что-то не получается - выдели минимальный участок кода и экспериментируй с ним. Зачем здесь на форуме все твои вирши ?
2) 
Цитата(mycodeurnightmare @  26.10.2014,  20:48 Найти цитируемый пост)
 p = 5 + p;

откуда 5 взялось ?
3) 
Цитата(mycodeurnightmare @  26.10.2014,  20:48 Найти цитируемый пост)
 fwrite(&k, sizeof(k), 1, f2);
    for (int i = 0; i<n; i++)

почему сначала k, а потом n ?

Короче, я бы сделал как-то так

Код
    //поиск студентов, сдавших указанную            дисциплину на 5
    typedef int sess::*score_ptr;
    score_ptr ptr = NULL;

    if (!strcmp(predmet, "math"))  { ptr = & sess::math; }
    if (!strcmp(predmet, "progr")) { ptr = & sess::progr; }
    if (!strcmp(predmet, "phys"))  { ptr = & sess::phys; }
    if (!strcmp(predmet, "discr")) { ptr = & sess::discr; }
    k = 0;
    fwrite(&k, sizeof(k), 1, f2);
    for (int i = 0; i<n; i++)
    {
        if ( session[ i ].*ptr == 5 )
        {
            k++;
            fwrite(&session[i], sizeof(session[i]), 1, f2);
        }
    }
    fseek( f2, 0, SEEK_SET );
    fwrite(&k, sizeof(k), 1, f2);
    fclose( f2 );



Это сообщение отредактировал(а) borisbn - 27.10.2014, 11:31


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mycodeurnightmare
  Дата 27.10.2014, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нууу, если бы было 5, я бы такие глупые вопросы не задавал. 
Выложил весь код, чтобы можно было протестировать, мало ли.
Спасибо, в общем.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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