Вад
|
|
« Ответ #60 : 21-12-2008 17:05 » |
|
int n,i,j,k,fl,max;
// а потом inputstfile(a, n); in.close(); outputst(a, n);
Ты не устанавливаешь значение для n - соответственно, там будет 0, вот и не выведет ничего. ещё раз: тут должно быть 4 - тебе ведь 4 элемента надо? То, что элементы будут иметь номера 0,1,2,3 - это детали индексирования.
|
|
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #61 : 21-12-2008 17:09 » |
|
но в старой программе это каким-то образом работало. Предлагаешь заменить буквы n на N?
Вад, какое значение установить для n?
|
|
« Последнее редактирование: 05-01-2009 11:31 от RXL »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #62 : 21-12-2008 21:36 » |
|
v.korleone, я не знаю, что ты под этой переменной имел в виду - так что это к тебе вопрос Лично мне показалось, что под n и N подразумевалось одно и то же - количество студентов. Только вот в C++ n и N - это разные имена (ты случайно не на pascal до этого программировал?)
|
|
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #63 : 22-12-2008 07:06 » |
|
Вад, я не писал старую программу, поэтому имею о ней поверхностное представление. Но меня очень, смущает то, что при const int N = 100; student a[N]; int n,i,j,k,fl,max; она исправно работает. Вот текст программы: #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)//ввод из файла 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; здесь s[m].f.fam стоит массив s[] типа студент, потом идет указание на структуру f и непосредственно на фамилию fam. Я же, эту ф-ю записал, так s[m].lastname (где s[m] это тобой предложенный массив студентов students Student s[20]; ,s взял для сокращения названий), может быть по аналогии со старой программой указать струтуру? Например, Student?struct Student { char lastname[l];// фамилия char name[l];// имя char ot[l];//отчествo int col[3]; // массив оценок за 4 дисциплины. };
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #64 : 22-12-2008 07:19 » |
|
Может, я что-то упускаю, но не представляю, как это могло работать - не вижу, где n устанавливается. Нашёл, у тебя эта n устанавливается, когда студенты из файла читаются. Значит, таки да - неправильно читается из файла. Вернись к исходному варианту по части имён студентов - всё должно заработать. Ну и col[i] вместо col, col1, col2,col3.
|
|
« Последнее редактирование: 22-12-2008 07:22 от Вад »
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #65 : 22-12-2008 07:22 » |
|
Зделаные мною изменения: Добавил структуру: struct fio { //структура fio включает данные студентов: char lastname[l];// фамилия char name[l];// имя char ot[l];//отчествo }; Соответственно структура студент имеет вид: struct Student { fio f; //ФИО int col[3]; // массив оценок за 4 дисциплины. }; Дальше, во всех функция пишу так: 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. (Добавил бы скриншот, но не знаю как вставлять картинки.) Что это может быть?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #66 : 22-12-2008 08:26 » |
|
v.korleone, пользуйся отладкой Убедись, что значения считываются в col.
|
|
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #67 : 24-12-2008 17:15 » |
|
Вад, по прежнему разбираюсь с проблемой вывода студентов на экран. Хочу спросить, что ты здесь имел ввиду(и дальше она типа как-то заполняется)?: Есть массив таких структур Student students[20]; // и дальше она типа как-то заполняется (Ответ#52)
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #68 : 24-12-2008 17:28 » |
|
v.korleone, ну, у тебя она из файла заполняется? Т.е., передаётся в функцию inputstfile, которая читает из файла таблицу с данными о студентах.
|
|
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #69 : 24-12-2008 18:04 » |
|
Понятно. Я почти исправил ошибку. Все сделал, выводит массив студентов. Насчет col ты был прав (мелкий баг, а сколько дела портит). Вад подскажи, пожалуйста, как можно сделать вывод результатов (расчет среднего балла по каждой дисциплине) после обработки в потоке. 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 »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #70 : 24-12-2008 18:15 » |
|
Смотри: у тебя теперь нужные средние лежат в массиве структур tasks, в поле avg. Тебе остаётся только дописать вывод этого поля на экран для всех 4х дисциплин. И, это, надо перед созданием потока при заполнении tasks[i] установить и size (или как оно там называлось) - количество студентов.
|
|
« Последнее редактирование: 24-12-2008 18:17 от Вад »
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #71 : 24-12-2008 18:30 » |
|
Вад, благодарю за твое терпение к моим глупым вопросам. Записал вывод средних баллов в виде: cout << "\nСередній бал по філософії: "<<tasks[1].avg; cout << "\nСередній бал по СУБД: "<<tasks[2].avg; cout << "\nСередній бал по ТАУ: "<<tasks[3].avg; cout << "\nСередній бал по математиці: "<<tasks[4].avg; Компилируется, выводит массив студентов, а потом пишет следующие: Середній бал по філософії: NaN Cередній бал по СУБД: NaN Середній бал по ТАУ: NaN Середній бал по математиці: 0
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #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
Помогающий
Offline
|
|
« Ответ #73 : 24-12-2008 20:13 » |
|
Забыл. Спасибо, поставил. Теперь вот так: Середній бал по філософії: 0 Cередній бал по СУБД: 18,5714 Середній бал по ТАУ: 160269 Середній бал по математиці: 0
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #74 : 24-12-2008 20:32 » |
|
показывай нынешний вариант кода
|
|
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #75 : 24-12-2008 21:11 » |
|
Вот он: #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"; } Прошу прошения, вот нужный: #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 »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #76 : 24-12-2008 21:41 » |
|
Ошибка номер раз: - этого быть не должно. Раз ты считываешь в 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
Помогающий
Offline
|
|
« Ответ #77 : 25-12-2008 15:06 » |
|
Вад премного благодарен! Вад следуйщей задачей является посчитать средний балл для каждого студента. Я делаю так: 1. Структураstruct STask2 { Student *src; // исходные данные int size; // число элементов в src int subj; // дисциплина, для которой считаем среднее float avg; // средний балл - используется для сохранения результата, в прошлый раз упустил его }; 2. Функция для расчета среднего балла: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. Функция преобразования для потока: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. Вызов потоков в главной программе: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 »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #78 : 25-12-2008 15:14 » |
|
Сначала скажи, как ты решил разделить вычисления по студентам. Т.е., что будет делать каждый поток (потоков, как я понимаю, будет то же число - 4)? Потом сформулируй, какое задание ты будешь ставить каждому потоку.
|
|
|
Записан
|
|
|
|
McZim
|
|
« Ответ #79 : 25-12-2008 15:15 » |
|
а тут task->avg двигаться по элементам не нужно?
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #80 : 25-12-2008 15:20 » |
|
Да потоков будет 4. Не ручаюсь, что сей алгоритм есть оптимальным но как-то так: Есть 20 студентов. За один проход потоки считают ср.балл каждого студента итого за один цикл 4 студента. Повторить цикл 5 раз, итого 20 студентов. Твои предложения?
McZim, не совсем понял вопрос.
|
|
« Последнее редактирование: 05-01-2009 11:28 от RXL »
|
Записан
|
|
|
|
McZim
|
|
« Ответ #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
Помогающий
Offline
|
|
« Ответ #82 : 25-12-2008 15:31 » |
|
Я вообще в програмировании не очень, но tasks2.avg идет в цикле и меняется в зависимости от i. (повторюсь, что могу ошибатся).
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #83 : 25-12-2008 15:37 » |
|
v.korleone, не совсем уловил: ты предлагаешь, чтобы один поток рассчитывал среднее для нескольких студентов, или предлагаешь 4 потока запускать по 5 раз, чтобы посчитать 1 студента за 1 запуск в 1 потоке?
|
|
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #84 : 25-12-2008 15:45 » |
|
Один поток считает средний балл для одного студента. Хотя, из твоего вопроса я понял, что было бы лучше чтобы каждый поток считал отведенный для него массив студентов, в данном случае по 5 студентов на поток. Но как это сделать и как организовать вывод в виде таблицы (как в первой части) на экран?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #85 : 25-12-2008 15:55 » |
|
В любом случае, тебе понадобится где-то хранить промежуточный результат - среднее по каждому студенту. А остальное - дело техники: сообщить потоку нужный диапазон номеров студентов и куда складывать результаты - всё, дальше только формируй задания, запускай потоки, жди, выводи результат.
|
|
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #86 : 31-12-2008 09:44 » |
|
Вад, c наступающим Новым годом! Благодарю за помощь в разработке, этой программы. Хочу попросить примеры кода (если есть свободное время), относительно этого: В любом случае, тебе понадобится где-то хранить промежуточный результат - среднее по каждому студенту. А остальное - дело техники: сообщить потоку нужный диапазон номеров студентов и куда складывать результаты - всё, дальше только формируй задания, запускай потоки, жди, выводи результат.
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #87 : 31-12-2008 10:14 » |
|
Ну, я вижу два основных варианта хранить средние по студентам: 1. в структуре с оценками студента (это не обязательно, но в принципе логично - ведь средний балл у студента один, и он с этим студентом связан) 2. в отдельном массиве, имеющем тот же размер, что и массив студентов Соответственно, передавать потокам место записи результата нужно будет: 1. так же, как и для предыдущей задачи. 2. в виде ещё одного поля в структуре, описывающей задачу потока Кроме того, нужно будет как-то задать диапазон для обработки одним потоком. Тут я тоже вижу два основных варианта: 1. передавать потоку весь массив студентов и два значения: номер первого и количество студентов, для которых среднее считает данный поток 2. передавать потоку массив студентов, начиная с нужного элемента, и, соответственно, передавать только количество, которое нужно считать. По вкусу. Код писать сейчас некогда: Новый год - новым годом, а день рабочий
|
|
|
Записан
|
|
|
|
v.korleone
Помогающий
Offline
|
|
« Ответ #88 : 31-12-2008 11:18 » |
|
Вопрос относительно этого: 1. в структуре с оценками студента (это не обязательно, но в принципе логично - ведь средний балл у студента один, и он с этим студентом связан) В этой структуре:(?) struct Student { fio f; //ФИО int col[4]; // массив оценок за 4 дисциплины. }; Или в этой:(?) struct STask { Student *src; // исходные данные int size; // число элементов в src int subj; // дисциплина, для которой считаем среднее float avg; // средний балл - используется для сохранения результата, в прошлый раз упустил его }; Записать в виде: (?) float srst[5] или float srst[20] Как лучше по пять студентов, или сразу все 20?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #89 : 31-12-2008 11:26 » |
|
либо в первой и "float avg", либо отдельный массив float avgs[n], указатель на который будет передаваться во второй структуре отдельным полем. Короче, тебе нужно каким-то образом хранить промежуточный результат, который - один для каждого студента, независимо от способа вычисления. Соответственно, нужно передать потокам то, куда сохранять результаты. по аналогии с предыдущим, но не совсем: если у тебя раньше в одной задаче было 1 среднее, то теперь есть несколько студентов, и для каждого нужно своё среднее.
|
|
|
Записан
|
|
|
|
|