Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [3] 4 5 6   Вниз
  Печать  
Автор Тема: Процессы  (Прочитано 112168 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #60 : 21-12-2008 17:05 » 

Код:
int n,i,j,k,fl,max;

// а потом
inputstfile(a, n);
    in.close();
    outputst(a, n);
Ты не устанавливаешь значение для n - соответственно, там будет 0, вот и не выведет ничего.

Код:
STask tasks[3];
ещё раз: тут должно быть 4 - тебе ведь 4 элемента надо? То, что элементы будут иметь номера 0,1,2,3 - это детали индексирования.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #61 : 21-12-2008 17:09 » 

но в старой программе это каким-то образом работало. Предлагаешь заменить буквы n на N?

Вад, какое значение установить для n?
« Последнее редактирование: 05-01-2009 11:31 от RXL » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #62 : 21-12-2008 21:36 » 

v.korleone, я не знаю, что ты под этой переменной имел в виду - так что это к тебе вопрос Улыбаюсь Лично мне показалось, что под n и N подразумевалось одно и то же - количество студентов. Только вот в C++ n и N - это разные имена (ты случайно не на pascal до этого программировал?)
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #63 : 22-12-2008 07:06 » 

Вад, я не писал старую программу, поэтому имею о ней поверхностное представление. Но меня очень, смущает то, что при
Код: (C++)
const int N = 100;
student a[N];
int n,i,j,k,fl,max;
она исправно работает. Вот текст программы:
Код: (C++)
#include <iostream>//библиотека для ввода, вывода
#include <fstream>//библиотека для работы с файлами
#include <string.h>//библиотека для строковых данных
#include <stdlib.h>//библиотека для выхода из программы
#include <conio.h>//библиотека для задержки на экране
#include <stdio.h>
#include <iomanip>//библиотека для выравнивания столбцов в таблице данных
#include <windows.h>//библиотека для отображения русской кодировки

using namespace std;

const int l = 31;//наибольшее возможное количество символов в строке

struct fio
{ //структура fio включает данные студентов:
    char fam[l];//фамилии
    char im[l];//имена
    char ot[l];//отчества
};

struct student
{ //структура student включает данные студентов:
    fio f; //ФИО
    int col1;//количество баллов по философии
    int col2;//количество баллов по СУБД
    int col3;//количество баллов по ТАУ
    int col; //количество баллов по математике
};

//==========================================Перечисление функций, которые используются в программе======================================//

void inputstfile(student s[],int &m);//ввод из файла
void outputst(student s[],int m); //вывод на экран массива студентов
void outputstfile(student s[],int m);//сохранение в файле массива студентов
void srstud(student s[], int m);//расчет и вывод среднего балла для каждого студента
float srbal(student s[]);//средний балл по предмету

ifstream in;
ofstream out;

//==========================================Описание функций, которые используются в программе==========================================//

//------------------------------------------------------Подпрограмма ввода из файла-----------------------------------------------------//
void inputstfile(student s[], int &m)//ввод из файла
{
    m = 0;
    in >> s[m].f.fam >> s[m].f.im >> s[m].f.ot >> s[m].col1 >> s[m].col2 >> s[m].col3 >> s[m].col;
    while (in.good())//пока не прекратятся записи в файле
    {
    m++;
    in >> s[m].f.fam >> s[m].f.im >> s[m].f.ot >>s[m].col1 >> s[m].col2 >> s[m].col3 >> s[m].col;/*ввод из файла ФИО,количества баллов по философии,
    СУБД, математике*/

    }
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//----------------------------------------Подпрограмма вывода на экран массива студентов------------------------------------------------//
void outputst(student s[], int m)//вывод на экран массива студентов
{
    int i;
    for(i = 0; i < m; i++)
    {
   cout << "|" << setw(12) << setiosflags(ios::left)  << s[i].f.fam//вывод на экран фамилий,
        << "|" << setw(10) << setiosflags(ios::left) << s[i].f.im//имен,
        << "|" << setw(14) << setiosflags(ios::left) << s[i].f.ot//отчеств,
        << "|" << setw(12) << setiosflags(ios::left) << s[i].col1//количества баллов по философии,
        << "|" << setw(6) << setiosflags(ios::left) << s[i].col2//количества баллов по СУБД,
        << "|" << setw(5) << setiosflags(ios::left) << s[i].col3//количества баллов по ТАУ,
        << "|" << setw(6) << setiosflags(ios::left) << s[i].col << "      |" << endl;//количества баллов по математике
        if((i+1)%10==0) getch();//задержка на экране
    }
    getch();
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//--------------------------------------------Подпрограмма сохранения в файле массива студентов-----------------------------------------//
void outputstfile (student s[], int m)//сохранение в файле массива студентов
{
    int i;
    out << "familiya " << "imya " << "otchestvo " << "gruppa " << "Kolichestvo ballov" << endl;
    for(i = 0; i < m; i++)
        out << setw(14) << setiosflags(ios::left) << s[i].f.fam//запись в файл фамилий,
        << setw(11) << setiosflags(ios::left) << s[i].f.im//имен,
        << setw(16) << setiosflags(ios::left) << s[i].f.ot//отчеств,
        << setw(4) << setiosflags(ios::left) << s[i].col1//количества баллов по философии,
        << setw(4) << setiosflags(ios::left) << s[i].col2//количества баллов по СУБД,
        << setw(4) << setiosflags(ios::left) << s[i].col3//количества баллов по ТАУ,
        << setw(4) << setiosflags(ios::left) << s[i].col<<endl;//количества баллов по математике
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//-------------------------Подпрограмма вывода на экран массива студентов и среднего балла для каждого студента-------------------------//
void srstud(student s[], int m)
{
    int i;
    for(i = 0; i < m; i++)
    {
    cout<<"|"<<setw(12)<<setiosflags(ios::left)<<s[i].f.fam//вывод на экран фамилий,
        <<"|"<<setw(10)<<setiosflags(ios::left)<<s[i].f.im//имен,
        <<"|"<<setw(14)<<setiosflags(ios::left)<<s[i].f.ot//отчеств,
        <<"|"<<setw(10)<<setiosflags(ios::left)<<(s[i].col1+s[i].col2+s[i].col3+s[i].col)/4.00<<"                          |"<< endl;
        if((i+1)%10==0) getch();//задержка на экране
    }
    getch();
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//----------------------------------------Подпрограмма для нахождения среднего балла по философии---------------------------------------//
float srbal1(student s[])
{
    int i,sum1;
    student t;
    sum1 = 0;
    for(i = 0; i < 20; i++)
    sum1 = s[i].col1+sum1;//сумма балов по математике
    return (sum1/20.0);
    }
//--------------------------------------------------------------------------------------------------------------------------------------//

//-----------------------------------------Подпрограмма для нахождения среднего балла по СУБД-------------------------------------------//
float srbal2(student s[])
{
    int i,sum2;
    student t;
    sum2 = 0;
    for(i = 0; i < 20; i++)
    sum2 = s[i].col2+sum2;//сумма балов по математике
    return (sum2/20.0);
    }
//--------------------------------------------------------------------------------------------------------------------------------------//

//------------------------------------------Подпрограмма для нахождения среднего балла по ТАУ-------------------------------------------//
float srbal3(student s[])
{
    int i,sum3;
    student t;
    sum3 = 0;
    for(i = 0; i < 20; i++)
    sum3 = s[i].col3+sum3;//сумма балов по математике
    return (sum3/20.0);
    }
//--------------------------------------------------------------------------------------------------------------------------------------//

//------------------------------------------Подпрограмма для нахождения среднего балла по математике------------------------------------//
float srbal(student s[])
{
    int i,sum;
    student t;
    sum = 0;
    for(i = 0; i < 20; i++)
        sum = s[i].col+sum;//сумма балов по математике
    return (sum/20.0);
    }
//--------------------------------------------------------------------------------------------------------------------------------------//

//============================================================Главная программа=========================================================//
const int N = 100;
int main()
{
    student a[N];
    int n,i,j,k,fl,max;
    char file[l];
    SetConsoleOutputCP(1251);
    cout << endl << "Вкажiть шлях до файлу: ";
    cin >> file;
    in.open(file);
    if(in == NULL)
    {//если не указан путь к файлу, то вывести сообщение "файл не найден"
        cout << "Файл не був знайдений";
        getch();
        exit(1);
    }
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------|"<<"------|"<<"-----|"<<"------------|"<<"\n";
    cout<<"|  Прізвище  |"<<"  Ім'я    |"<<"  По батькові |"<<" Філософія  |"<<" СУБД |"<<" ТАУ |"<<" Математика |"<<"\n";
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------|"<<"------|"<<"-----|"<<"------------|"<<"\n";
    inputstfile(a, n);
    in.close();
    outputst(a, n);
    max = a[0].col;
    k = 0;
    for(i = 1; i < n; i++)
        if (a[i].col>max) max = a[i].col;
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------|"<<"------|"<<"-----|"<<"------------|"<<"\n";
    cout<<"\n";
//***Расчет и вывод средних баллов по предметам для всех студентов***//
    cout << "\nСередній бал по філософії: "<<srbal1(a);
    cout << "\nСередній бал по СУБД: "<<srbal2(a);
    cout << "\nСередній бал по ТАУ: "<<srbal3(a);
    cout << "\nСередній бал по математиці: "<<srbal(a);
//***Расчет и вывод средних баллов по предметам для каждого студента***//
    cout << " \n \n";
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------------------------------|"<<"\n";
    cout<<"|  Прізвище  |"<<"  Ім'я    |"<<"  По батькові |"<<" Середній бал для кожного студента  |"<<"\n";
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------------------------------|"<<"\n";
    srstud(a,n);
    out.open("resultst.txt");
    if(out==NULL) {
                cout<<"Файл не створений";
                getch();
                exit(1);
               }
    outputstfile(a,n);
    out.close();
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------------------------------|"<<"\n";
}
вот данные файла-ведомости о студентах:
Андрєєв       Андрій     Андрійович      5   4   4   5   
Аскаров       Ельдар     Муратович       3   4   5   5   
Басова        Юлія       Дмитрівна       3   4   4   3   
Баширов       Сергій     Олександрович   4   5   5   4   
Блінов        Павло      Сергійович      5   4   5   4   
Бурєєва       Ксенія     Михайлівна      3   5   3   3   
Васильєв      Євген      Гаврилович      4   4   5   4   
Васильєв      Петро      Вадимович       4   4   5   5   
Ганєєв        Ренат      Муратович       4   4   3   3   
Гарбуз        Світлана   Василівна       5   5   4   3   
Дужка         Ольга      Петрівна        5   5   5   3   
Іванов        Іван       ІВанович        3   4   3   5   
Іванов        Петро      Сергійович      4   5   3   5   
Кадиров       Микола     Вікторович      5   4   4   4   
Курочкін      Іван       Васильович      5   4   5   4   
Підбільска    Ольга      Сергіївна       4   5   5   3   
Піддубний     Олексій    Вікторович      5   4   5   4   
Петров        Павло      Олександрович   3   5   4   4   
Приходько     Каміла     Петрівна        3   4   5   5   
Реднікова     Катерина   Дмитрівна       5   4   4   5   
Самойлов      Федір      Миколайович     3   4   4   5   
Старовойт     Артем      ВАдимович       4   4   5   5   
Супрунова     Світлана   Миколаївна      3   4   4   5   
Чорний        Максим     Анатолійович    4   4   5   5   
Шиянова       Аліна      Володимирівна   5   5   5   3   
Шиянова       Каріна     Володимирівна   4   5   5   4   
Юдін          Олександр  Олександрович   3   4   5   4   
Юдіна         Анастасія  Валеріївна      4   4   4   3 
******************************************************
Мне кажется, что может быть проблема со структурами т.к., например, в старой программе,в  ф-и void inputstfile(student s[], int &m)//ввод из файла
   
Код: (C++)
m = 0;
    in >> s[m].f.fam >> s[m].f.im >> s[m].f.ot >> s[m].col1 >> s[m].col2 >> s[m].col3 >> s[m].col;
здесь
Код: (C++)
s[m].f.fam
стоит массив s[] типа студент, потом идет указание на структуру f и непосредственно на фамилию fam.
Я же, эту ф-ю записал, так
Код: (C++)
s[m].lastname
(где s[m] это тобой предложенный массив студентов students
Код: (C++)
Student s[20];
,s взял для сокращения названий), может быть по аналогии со старой программой указать струтуру?
Например, Student?
Код: (C++)
struct Student
{
char lastname[l];// фамилия
char name[l];// имя
char ot[l];//отчествo
int col[3];  // массив оценок за 4 дисциплины.
};
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #64 : 22-12-2008 07:19 » 

Может, я что-то упускаю, но не представляю, как это могло работать - не вижу, где n устанавливается.
Нашёл, у тебя эта n устанавливается, когда студенты из файла читаются. Значит, таки да - неправильно читается из файла. Вернись к исходному варианту по части имён студентов - всё должно заработать. Ну и col[i] вместо col, col1, col2,col3.
« Последнее редактирование: 22-12-2008 07:22 от Вад » Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #65 : 22-12-2008 07:22 » 

Зделаные мною изменения:
Добавил структуру:
Код: (C++)
struct fio
{ //структура fio включает данные студентов:
char lastname[l];// фамилия
char name[l];// имя
char ot[l];//отчествo
};
Соответственно структура студент имеет вид:
Код: (C++)
struct Student
{
fio f; //ФИО
int col[3];  // массив оценок за 4 дисциплины.
};
Дальше, во всех функция пишу так:
Код: (C++)
in >> s[m].f.lastname >> s[m].f.name >> s[m].f.ot >> s[m].col[0] >> s[m].col[1] >> s[m].col[2] >> s[m].col[3];
Компилится, и даже выводит импровизированую таблицу с записями, вот только вместо записей пишет 0. (Добавил бы скриншот, но не знаю как вставлять картинки.) Что это может быть?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #66 : 22-12-2008 08:26 » 

v.korleone, пользуйся отладкой Улыбаюсь Убедись, что значения считываются в col.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #67 : 24-12-2008 17:15 » 

Вад, по прежнему разбираюсь с проблемой вывода студентов на экран. Хочу спросить, что ты здесь имел ввиду(и дальше она типа как-то заполняется)?:
Цитата
Есть массив таких структур
Код: (C++)
Student students[20];
// и дальше она типа как-то заполняется
(Ответ#52)
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #68 : 24-12-2008 17:28 » 

v.korleone, ну, у тебя она из файла заполняется? Т.е., передаётся в функцию inputstfile, которая читает из файла таблицу с данными о студентах.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #69 : 24-12-2008 18:04 » new

Понятно. Я почти исправил ошибку.

Все сделал, выводит массив студентов. Насчет col ты был прав (мелкий баг, а сколько дела портит).
Вад подскажи, пожалуйста, как можно сделать вывод результатов (расчет среднего балла по каждой дисциплине) после обработки в потоке.
Код: (C++)
STask tasks[4];
        for (int i = 0; i < 4; ++i)
    {
         tasks[i].src = s;
         tasks[i].subj = i;
         Thread[i] = (HANDLE)_beginthreadex(NULL, 0, CalcAvg, &tasks[i], 0, &tid);
    }
        WaitForMultipleObjects(4, Thread, TRUE, INFINITE);
        cout<<"Потоки завершили виконання" <<endl;
        //Закриваємо потоки
                for (i=0;i<4;i++) CloseHandle(Thread[i]);
« Последнее редактирование: 05-01-2009 11:32 от RXL » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #70 : 24-12-2008 18:15 » 

Смотри: у тебя теперь нужные средние лежат в массиве структур tasks, в поле avg. Тебе остаётся только дописать вывод этого поля на экран для всех 4х дисциплин.  И, это, надо перед созданием потока при заполнении tasks[i] установить и size (или как оно там называлось) - количество студентов.
« Последнее редактирование: 24-12-2008 18:17 от Вад » Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #71 : 24-12-2008 18:30 » 

Вад, благодарю за твое терпение к моим глупым вопросам. Записал вывод средних баллов в виде:
Код: (C++)
    cout << "\nСередній бал по філософії: "<<tasks[1].avg;
    cout << "\nСередній бал по СУБД: "<<tasks[2].avg;
    cout << "\nСередній бал по ТАУ: "<<tasks[3].avg;
    cout << "\nСередній бал по математиці: "<<tasks[4].avg;
Компилируется, выводит массив студентов, а потом пишет следующие:
Код: (C++)
Середній бал по філософії: NaN
Cередній бал по СУБД: NaN
Середній бал по ТАУ: NaN
Середній бал по математиці: 0
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #72 : 24-12-2008 18:40 » 

Код:
for (int i = 0; i < 4; ++i)
    {
         tasks[i].src = s;
         tasks[i].subj = i;
         tasks[i].size = n; // - это есть?
         Thread[i] = (HANDLE)_beginthreadex(NULL, 0, CalcAvg, &tasks[i], 0, &tid);
    }
количество студентов установить не забыл? (см. коммент в коде)
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #73 : 24-12-2008 20:13 » 

Забыл. Спасибо, поставил. Теперь вот так:
Середній бал по філософії: 0
Cередній бал по СУБД: 18,5714
Середній бал по ТАУ: 160269
Середній бал по математиці: 0
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #74 : 24-12-2008 20:32 » 

показывай нынешний вариант кода
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #75 : 24-12-2008 21:11 » 

Вот он:
Код: (C++)
#include <iostream>//библиотека для ввода, вывода
#include <fstream>//библиотека для работы с файлами
#include <string.h>//библиотека для строковых данных
#include <stdlib.h>//библиотека для выхода из программы
#include <conio.h>//библиотека для задержки на экране
#include <stdio.h>
#include <process.h>//бібліотека для використання потоків
#include <iomanip>//библиотека для выравнивания столбцов в таблице данных
#include <windows.h>//библиотека для отображения русской кодировки

using namespace std;

const int l = 31;//наибольшее возможное количество символов в строке

struct fio
{ //структура fio включает данные студентов:
    char fam[l];// фамилия
    char im[l];// имя
    char ot[l];//отчествo
};
struct Student
{
fio f; //ФИО
int col[4];  // массив оценок за 4 дисциплины.
};

struct STask
{
   Student *src; // исходные данные
   int size; // число элементов в src
   int subj; // дисциплина, для которой считаем среднее
   float avg; // средний балл - используется для сохранения результата, в прошлый раз упустил его
};

Student s[20];

//==========================================Перечисление функций, которые используются в программе======================================//

void inputstfile(Student s[],int &m);//ввод из файла
void outputst(Student s[],int m); //вывод на экран массива студентов
void outputstfile(Student s[],int m);//сохранение в файле массива студентов
void srstud(Student s[],int m);//расчет и вывод среднего балла для каждого студента
float srbal(Student *src,int size,int subj);//средний балл по предмету

ifstream in;
ofstream out;

//==========================================Описание функций, которые используются в программе==========================================//

//------------------------------------------------------Подпрограмма ввода из файла_NEW-------------------------------------------------//
void inputstfile(Student s[], int &m)//ввод из файла
{
    m = 0;
    in >> s[m].f.fam >> s[m].f.im >> s[m].f.ot >> s[m].col[1] >> s[m].col[2] >> s[m].col[3] >> s[m].col[4];
    while (in.good())//пока не прекратятся записи в файле
    {
    m++;
    in >> s[m].f.fam >> s[m].f.im >> s[m].f.ot >> s[m].col[1] >> s[m].col[2] >> s[m].col[3] >> s[m].col[4];/*ввод из файла ФИО,количества баллов по философии,
    СУБД, математике*/

    }
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//----------------------------------------Подпрограмма вывода на экран массива студентов_NEW-------------------------------------------//
void outputst(Student s[], int m)//вывод на экран массива студентов
{
    int i;
    for(i = 0; i < m; i++)
    {
   cout << "|" << setw(12) << setiosflags(ios::left)  << s[i].f.fam//вывод на экран фамилий,
        << "|" << setw(10) << setiosflags(ios::left) << s[i].f.im//имен,
        << "|" << setw(14) << setiosflags(ios::left) << s[i].f.ot//отчеств,
        << "|" << setw(12) << setiosflags(ios::left) << s[i].col[1]//количества баллов по философии,
        << "|" << setw(6) << setiosflags(ios::left) << s[i].col[2]//количества баллов по СУБД,
        << "|" << setw(5) << setiosflags(ios::left) << s[i].col[3]//количества баллов по ТАУ,
        << "|" << setw(6) << setiosflags(ios::left) << s[i].col[4] << "      |" << endl;//количества баллов по математике
        if((i+1)%10==0) getch();//задержка на экране
    }
    getch();
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//--------------------------------------------Подпрограмма сохранения в файле массива студентов-----------------------------------------//
void outputstfile (Student s[], int m)//сохранение в файле массива студентов
{
    int i;
    out << "familiya " << "imya " << "otchestvo " << "gruppa " << "Kolichestvo ballov" << endl;
    for(i = 0; i < m; i++)
        out << setw(14) << setiosflags(ios::left) << s[i].f.fam//запись в файл фамилий,
        << setw(11) << setiosflags(ios::left) << s[i].f.im//имен,
        << setw(16) << setiosflags(ios::left) << s[i].f.ot//отчеств,
        << setw(4) << setiosflags(ios::left) << s[i].col[1]//количества баллов по философии,
        << setw(4) << setiosflags(ios::left) << s[i].col[2]//количества баллов по СУБД,
        << setw(4) << setiosflags(ios::left) << s[i].col[3]//количества баллов по ТАУ,
        << setw(4) << setiosflags(ios::left) << s[i].col[4]<<endl;//количества баллов по математике
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//------------------------------------------Подпрограмма для нахождения среднего балла по предмету--------------------------------------//
float srbal(
    Student *src,   // массив данных
    int size,  // размер массива
    int subj   // номер дисциплины
           )
{
    int i,sum;
    sum = 0;
    for(i = 0; i < size; i++)
    sum = src[i].col[subj]+sum;
    return ( sum/(float)size );//сумма балов по предмету subj
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//------------------------------------------Подпрограмма передачи знчения средного балла потоку-----------------------------------------//
unsigned __stdcall CalcAvg (void * arg)
{
    STask *task = (STask*) arg;
        if (task) // проверяем - вдруг параметры забыли передать
    {   task->avg = srbal(task->src,task->size,task->subj);
        return 0;
    }
    else
        return 1; // типа, ошибка - вдруг кого волнует
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//============================================================Главная программа=========================================================//
unsigned tid;
HANDLE Thread[3];// Імітація 4-х процесорів
DWORD res;
const int N = 100;
int main()
{
    Student a[N];
    int n,i,j,k,fl,max;
    float a1,a2,a3,a4;
    //n=20;
    char file[l];
    SetConsoleOutputCP(1251);
    cout << endl << "Вкажiть шлях до файлу: ";
    cin >> file;
    in.open(file);
    if(in == NULL)
    {//если не указан путь к файлу, то вывести сообщение "файл не найден"
        cout << "Файл не був знайдений";
        getch();
        exit(1);
    }
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------|"<<"------|"<<"-----|"<<"------------|"<<"\n";
    cout<<"|  Прізвище  |"<<"  Ім'я    |"<<"  По батькові |"<<" Філософія  |"<<" СУБД |"<<" ТАУ |"<<" Математика |"<<"\n";
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------|"<<"------|"<<"-----|"<<"------------|"<<"\n";
    inputstfile(a, n);
    in.close();
    outputst(a, n);
    max = a[0].col[4];
    k = 0;
    for(i = 1; i < n; i++)
        if (a[i].col[4]>max) max = a[i].col[4];
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------|"<<"------|"<<"-----|"<<"------------|"<<"\n";
    cout<<"\n";
//--------------------------------------------Створення потоків_1-й ярус---------------------------------------------------------------//
        STask tasks[4];
        for (int i = 0; i < 4; ++i)
    {   tasks[i].src = s;
        tasks[i].size = n;
        tasks[i].subj = i;
        Thread[i] = (HANDLE)_beginthreadex(NULL, 0, CalcAvg, &tasks[i], 0, &tid);
    }
        WaitForMultipleObjects(4, Thread, TRUE, INFINITE);
        cout<<"Потоки завершили виконання" <<endl;
        //Закриваємо потоки
                for (i=0;i<4;i++) CloseHandle(Thread[i]);
//--------------------------------Расчет и вывод средних баллов по предметам для всех студентов----------------------------------------//
    cout << "\nСередній бал по філософії: "<<tasks[1].avg;
    cout << "\nСередній бал по СУБД: "<<tasks[2].avg;
    cout << "\nСередній бал по ТАУ: "<<tasks[3].avg;
    cout << "\nСередній бал по математиці: "<<tasks[4].avg;
//***Расчет и вывод средних баллов по предметам для каждого предмета**//
    cout << " \n \n";
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------------------------------|"<<"\n";
    cout<<"|  Прізвище  |"<<"  Ім'я    |"<<"  По батькові |"<<" Середній бал для кожного студента  |"<<"\n";
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------------------------------|"<<"\n";
    //подсчет среднего для каждого студента srstud(a,n);
    out.open("resultst.txt");
    if(out==NULL) {
                cout<<"Файл не створений";
                getch();
                exit(1);
               }
    outputstfile(a,n);
    out.close();
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------------------------------|"<<"\n";
}


Прошу прошения, вот нужный:
Код: (C++)
#include <iostream>//библиотека для ввода, вывода
#include <fstream>//библиотека для работы с файлами
#include <string.h>//библиотека для строковых данных
#include <stdlib.h>//библиотека для выхода из программы
#include <conio.h>//библиотека для задержки на экране
#include <stdio.h>
#include <process.h>//бібліотека для використання потоків
#include <iomanip>//библиотека для выравнивания столбцов в таблице данных
#include <windows.h>//библиотека для отображения русской кодировки

using namespace std;

const int l = 31;//наибольшее возможное количество символов в строке

struct fio
{ //структура fio включает данные студентов:
    char fam[l];// фамилия
    char im[l];// имя
    char ot[l];//отчествo
};
struct Student
{
fio f; //ФИО
int col[4];  // массив оценок за 4 дисциплины.
};

struct STask
{
   Student *src; // исходные данные
   int size; // число элементов в src
   int subj; // дисциплина, для которой считаем среднее
   float avg; // средний балл - используется для сохранения результата, в прошлый раз упустил его
};

Student s[20];
//==========================================Перечисление функций, которые используются в программе======================================//

void inputstfile(Student s[],int &m);//ввод из файла
void outputst(Student s[],int m); //вывод на экран массива студентов
void outputstfile(Student s[],int m);//сохранение в файле массива студентов
void srstud(Student s[],int m);//расчет и вывод среднего балла для каждого студента
float srbal(Student *src,int size,int subj);//средний балл по предмету

ifstream in;
ofstream out;

//==========================================Описание функций, которые используются в программе==========================================//

//------------------------------------------------------Подпрограмма ввода из файла_NEW-------------------------------------------------//
void inputstfile(Student s[], int &m)//ввод из файла
{
    m = 0;
    in >> s[m].f.fam >> s[m].f.im >> s[m].f.ot >> s[m].col[0] >> s[m].col[1] >> s[m].col[2] >> s[m].col[3];
    while (in.good())//пока не прекратятся записи в файле
    {
    m++;
    in >> s[m].f.fam >> s[m].f.im >> s[m].f.ot >> s[m].col[0] >> s[m].col[1] >> s[m].col[2] >> s[m].col[3];/*ввод из файла ФИО,количества баллов по философии,
    СУБД, математике*/

    }
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//----------------------------------------Подпрограмма вывода на экран массива студентов_NEW-------------------------------------------//
void outputst(Student s[], int m)//вывод на экран массива студентов
{
    int i;
    for(i = 0; i < m; i++)
    {
   cout << "|" << setw(12) << setiosflags(ios::left)  << s[i].f.fam//вывод на экран фамилий,
        << "|" << setw(10) << setiosflags(ios::left) << s[i].f.im//имен,
        << "|" << setw(14) << setiosflags(ios::left) << s[i].f.ot//отчеств,
        << "|" << setw(12) << setiosflags(ios::left) << s[i].col[0]//количества баллов по философии,
        << "|" << setw(6) << setiosflags(ios::left) << s[i].col[1]//количества баллов по СУБД,
        << "|" << setw(5) << setiosflags(ios::left) << s[i].col[2]//количества баллов по ТАУ,
        << "|" << setw(6) << setiosflags(ios::left) << s[i].col[3] << "      |" << endl;//количества баллов по математике
        if((i+1)%10==0) getch();//задержка на экране
    }
    getch();
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//--------------------------------------------Подпрограмма сохранения в файле массива студентов-----------------------------------------//
void outputstfile (Student s[], int m)//сохранение в файле массива студентов
{
    int i;
    out << "familiya " << "imya " << "otchestvo " << "gruppa " << "Kolichestvo ballov" << endl;
    for(i = 0; i < m; i++)
        out << setw(14) << setiosflags(ios::left) << s[i].f.fam//запись в файл фамилий,
        << setw(11) << setiosflags(ios::left) << s[i].f.im//имен,
        << setw(16) << setiosflags(ios::left) << s[i].f.ot//отчеств,
        << setw(4) << setiosflags(ios::left) << s[i].col[0]//количества баллов по философии,
        << setw(4) << setiosflags(ios::left) << s[i].col[1]//количества баллов по СУБД,
        << setw(4) << setiosflags(ios::left) << s[i].col[2]//количества баллов по ТАУ,
        << setw(4) << setiosflags(ios::left) << s[i].col[3]<<endl;//количества баллов по математике
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//------------------------------------------Подпрограмма для нахождения среднего балла по предмету--------------------------------------//
float srbal(
    Student *src,   // массив данных
    int size,  // размер массива
    int subj   // номер дисциплины
           )
{
    int i,sum;
    sum = 0;
    for(i = 0; i < size; i++)
    sum = src[i].col[subj]+sum;
    return ( sum/(float)size );//сумма балов по предмету subj
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//------------------------------------------Подпрограмма передачи знчения средного балла потоку-----------------------------------------//
unsigned __stdcall CalcAvg (void * arg)
{
    STask *task = (STask*) arg;
        if (task) // проверяем - вдруг параметры забыли передать
    {   task->avg = srbal(task->src,task->size,task->subj);
        return 0;
    }
    else
        return 1; // типа, ошибка - вдруг кого волнует
}
//--------------------------------------------------------------------------------------------------------------------------------------//

//============================================================Главная программа=========================================================//
unsigned tid;
HANDLE Thread[3];// Імітація 4-х процесорів
DWORD res;
const int N = 100;
int main()
{
    Student a[N];
    int n,i,j,k,fl,max;
    float a1,a2,a3,a4;
    char file[l];
    SetConsoleOutputCP(1251);
    cout << endl << "Вкажiть шлях до файлу: ";
    cin >> file;
    in.open(file);
    if(in == NULL)
    {//если не указан путь к файлу, то вывести сообщение "файл не найден"
        cout << "Файл не був знайдений";
        getch();
        exit(1);
    }
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------|"<<"------|"<<"-----|"<<"------------|"<<"\n";
    cout<<"|  Прізвище  |"<<"  Ім'я    |"<<"  По батькові |"<<" Філософія  |"<<" СУБД |"<<" ТАУ |"<<" Математика |"<<"\n";
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------|"<<"------|"<<"-----|"<<"------------|"<<"\n";
    inputstfile(a, n);
    in.close();
    outputst(a, n);
    max = a[0].col[3];
    k = 0;
    for(i = 1; i < n; i++)
        if (a[i].col[3]>max) max = a[i].col[3];
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------|"<<"------|"<<"-----|"<<"------------|"<<"\n";
    cout<<"\n";
//--------------------------------------------Створення потоків_1-й ярус---------------------------------------------------------------//
        STask tasks[4];
        for (int i = 0; i < 4; ++i)
    {   tasks[i].src = s;
        tasks[i].size = n;
        tasks[i].subj = i;
        Thread[i] = (HANDLE)_beginthreadex(NULL, 0, CalcAvg, &tasks[i], 0, &tid);
    }
        WaitForMultipleObjects(4, Thread, TRUE, INFINITE);
        cout<<"Потоки завершили виконання" <<endl;
        //Закриваємо потоки
                for (i=0;i<4;i++) CloseHandle(Thread[i]);
//--------------------------------Расчет и вывод средних баллов по предметам для всех студентов----------------------------------------//
    cout << "\nСередній бал по філософії: "<<tasks[1].avg;
    cout << "\nСередній бал по СУБД: "<<tasks[2].avg;
    cout << "\nСередній бал по ТАУ: "<<tasks[3].avg;
    cout << "\nСередній бал по математиці: "<<tasks[4].avg;
//***Расчет и вывод средних баллов по предметам для каждого предмета**//
    cout << " \n \n";
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------------------------------|"<<"\n";
    cout<<"|  Прізвище  |"<<"  Ім'я    |"<<"  По батькові |"<<" Середній бал для кожного студента  |"<<"\n";
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------------------------------|"<<"\n";
    //подсчет среднего для каждого студента srstud(a,n);
    out.open("resultst.txt");
    if(out==NULL) {
                cout<<"Файл не створений";
                getch();
                exit(1);
               }
    outputstfile(a,n);
    out.close();
    cout<<"|------------|"<<"----------|"<<"--------------|"<<"------------------------------------|"<<"\n";
}

« Последнее редактирование: 05-01-2009 11:32 от RXL » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #76 : 24-12-2008 21:41 » 

Ошибка номер раз:
Код:
Student s[20];
- этого быть не должно. Раз ты считываешь в main в массив Student a[N] - его и нужно передавать. Соответственно:
Код:
for (int i = 0; i < 4; ++i)
    {   tasks[i].src = a; // было: tasks[i].src = s;
        tasks[i].size = n;
        tasks[i].subj = i;
        Thread[i] = (HANDLE)_beginthreadex(NULL, 0, CalcAvg, &tasks[i], 0, &tid);
    }

Ошибка номер два. Сравни со своим фрагментом:
Код:
    cout << "\nСередній бал по філософії: "<<tasks[0].avg;
    cout << "\nСередній бал по СУБД: "<<tasks[1].avg;
    cout << "\nСередній бал по ТАУ: "<<tasks[2].avg;
    cout << "\nСередній бал по математиці: "<<tasks[3].avg;
В С/C++ элементы массивов нумеруются с нуля (строго говоря, 0 - это типа "нулевой отступ от начала массива").
После этих фиксов у меня выводит 4ки с дробями по всем предметам.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #77 : 25-12-2008 15:06 » 

Вад премного благодарен!


Вад следуйщей задачей является посчитать средний балл для каждого студента. Я делаю так:
1. Структура
Код: (C++)
struct STask2
{
   Student *src; // исходные данные
   int size; // число элементов в src
   int subj; // дисциплина, для которой считаем среднее
   float avg; // средний балл - используется для сохранения результата, в прошлый раз упустил его
};
2. Функция для расчета среднего балла:
Код: (C++)
float srbalst(
    Student *src,   // массив данных
    int size,  // размер массива
    int subj   // номер дисциплины
           )
{
    int i,sum;
    sum = 0;
    for(i = 0; i < 4; i++)

    sum = src[i].col[subj]+src[i].col[subj+1]+src[i].col[subj+2]+src[i].col[subj+3];
    return ( sum/(float)4 );//сумма баллов для i-го студента
}
3. Функция преобразования для потока:
Код: (C++)
unsigned __stdcall CalcAvgst (void * arg)
{
    STask *task = (STask*) arg;
        if (task) // проверяем - вдруг параметры забыли передать
    {   task->avg = srbalst(task->src,task->size,task->subj);
        return 0;
    }
    else
        return 1; // типа, ошибка - вдруг кого волнует
}
4. Вызов потоков в главной программе:
Код: (C++)
STask2 tasks2[4];
        for (int i = 0; i < 4; ++i)
    {   tasks2[i].src = a;
        tasks2[i].size = n;
        tasks2[i].subj = i;
        Thread[i] = (HANDLE)_beginthreadex(NULL, 0, CalcAvgst, &tasks2[i], 0, &tid);

    cout<<"|"<<setw(12)<<setiosflags(ios::left)<<a[i].f.fam//вывод на экран фамилий,
        <<"|"<<setw(10)<<setiosflags(ios::left)<<a[i].f.im//имен,
        <<"|"<<setw(14)<<setiosflags(ios::left)<<a[i].f.ot//отчеств,
        <<"|"<<setw(10)<<setiosflags(ios::left)<<tasks2[i].avg<<"                          |"<< endl;
        if((i+1)%10==0) getch();//задержка на экране
    }
        WaitForMultipleObjects(4, Thread, TRUE, INFINITE);
        //Закриваем потоки
                for (i=0;i<4;i++) CloseHandle(Thread[i]);

Считает средний балл для первого студента. У остальных 4 пишет: -7.6744е+07
Вопрос: Как сделать, чтобы все правильно считало и для остальных?
« Последнее редактирование: 05-01-2009 11:33 от RXL » Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #78 : 25-12-2008 15:14 » 

Сначала скажи, как ты решил разделить вычисления по студентам. Т.е., что будет делать каждый поток (потоков, как я понимаю, будет то же число - 4)?
Потом сформулируй, какое задание ты будешь ставить каждому потоку.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #79 : 25-12-2008 15:15 » 

а тут task->avg двигаться по элементам не нужно?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #80 : 25-12-2008 15:20 » 

Да потоков будет 4.
Не ручаюсь, что сей алгоритм есть оптимальным но как-то так:
Есть 20 студентов. За один проход потоки считают ср.балл каждого студента итого за один цикл 4 студента. Повторить цикл 5 раз, итого 20 студентов.
Твои предложения?

McZim, не совсем понял вопрос.
« Последнее редактирование: 05-01-2009 11:28 от RXL » Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #81 : 25-12-2008 15:27 » 

у тебя же функция CalcAvgst, несколько раз вызывается, а результат функции srbalst, ты всегда присваиваешь в одно место task->avg, так и должно быть?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #82 : 25-12-2008 15:31 » 

Я вообще в програмировании не очень, но tasks2.avg идет в цикле и меняется в зависимости от i. (повторюсь, что могу ошибатся).
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #83 : 25-12-2008 15:37 » 

v.korleone, не совсем уловил: ты предлагаешь, чтобы один поток рассчитывал среднее для нескольких студентов, или предлагаешь 4 потока запускать по 5 раз, чтобы посчитать 1 студента за 1 запуск в 1 потоке?
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #84 : 25-12-2008 15:45 » 

Один поток считает средний балл для одного студента. Хотя, из твоего вопроса я понял, что было бы лучше чтобы каждый поток считал отведенный для него массив студентов, в данном случае по 5 студентов на поток. Но как это сделать и как организовать вывод в виде таблицы (как в первой части) на экран?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #85 : 25-12-2008 15:55 » 

В любом случае, тебе понадобится где-то хранить промежуточный результат - среднее по каждому студенту. А остальное - дело техники: сообщить потоку нужный диапазон номеров студентов и куда складывать результаты - всё, дальше только формируй задания, запускай потоки, жди, выводи результат.
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #86 : 31-12-2008 09:44 » 

Вад, c наступающим Новым годом! Благодарю за помощь в разработке, этой программы.
Хочу попросить примеры кода (если есть свободное время), относительно этого:
Цитата
В любом случае, тебе понадобится где-то хранить промежуточный результат - среднее по каждому студенту. А остальное - дело техники: сообщить потоку нужный диапазон номеров студентов и куда складывать результаты - всё, дальше только формируй задания, запускай потоки, жди, выводи результат.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #87 : 31-12-2008 10:14 » 

Ну, я вижу два основных варианта хранить средние по студентам:
1. в структуре с оценками студента (это не обязательно, но в принципе логично - ведь средний балл у студента один, и он с этим студентом связан)
2. в отдельном массиве, имеющем тот же размер, что и массив студентов

Соответственно, передавать потокам место записи результата нужно будет:
1. так же, как и для предыдущей задачи.
2. в виде ещё одного поля в структуре, описывающей задачу потока

Кроме того, нужно будет как-то задать диапазон для обработки одним потоком. Тут я тоже вижу два основных варианта:
1. передавать потоку весь массив студентов и два значения: номер первого и количество студентов, для которых среднее считает данный поток
2. передавать потоку массив студентов, начиная с нужного элемента, и, соответственно, передавать только количество, которое нужно считать.
По вкусу.

Код писать сейчас некогда: Новый год - новым годом, а день рабочий Улыбаюсь
Записан
v.korleone
Помогающий

ua
Offline Offline

« Ответ #88 : 31-12-2008 11:18 » 

Вопрос относительно этого:
Цитата
1. в структуре с оценками студента (это не обязательно, но в принципе логично - ведь средний балл у студента один, и он с этим студентом связан)
В этой структуре:(?)
Код: (C++)
struct Student
{
fio f; //ФИО
int col[4];  // массив оценок за 4 дисциплины.
};
Или в этой:(?)
struct STask
Код: (C++)
{
   Student *src; // исходные данные
   int size; // число элементов в src
   int subj; // дисциплина, для которой считаем среднее
   float avg; // средний балл - используется для сохранения результата, в прошлый раз упустил его
};
Записать в виде: (?)
Код: (C++)
float srst[5]

или
Код: (C++)
float srst[20]
Как лучше по пять студентов, или сразу все 20?
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #89 : 31-12-2008 11:26 » 

либо в первой и "float avg", либо отдельный массив float avgs[n], указатель на который будет передаваться во второй структуре отдельным полем.
Короче, тебе нужно каким-то образом хранить промежуточный результат, который - один для каждого студента, независимо от способа вычисления. Соответственно, нужно передать потокам то, куда сохранять результаты. по аналогии с предыдущим, но не совсем: если у тебя раньше в одной задаче было 1 среднее, то теперь есть несколько студентов, и для каждого нужно своё среднее.
Записан
Страниц: 1 2 [3] 4 5 6   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines