На первом курсе M студентов. Каждый из них за год получает N оценок в пределах от 1 до 100. Лучшим считается студент, имеющий наибольшую сумму трех лучших оценок за весь курс. Сформируйте целый массив нужного размера. Задайте оценки с помощью генератора случайных чисел. Найдите лучшего и худ-шего студентов.
а) (динамический двумерный массив) Для выделения памяти под массивы использовать операцию new, для удаления массивов из памяти – операцию delete.
б) В функции main() должны быть размещены только описания переменных и обращения к соответст-вующим функциям
C/C++
Задача.Программирование.С++.Динамический двумерный массив.
#include
using namespace std;
int** create(const int st_num, const int nu_num)
{
int** stud = new int* [st_num];
for (int i = 0; i < st_num; i++)
stud[i] = new int[nu_num];
return stud;
}
void destr(int** stud, const int st_num)
{
for (int i = 0; i < st_num; i++)
delete[] stud[i];
delete stud;
}
void rand_fill(int** stud, const int st_num, const int nu_num)
{
srand(time(nullptr));
for (int i = 0; i < st_num; i++)
for (int j = 0; j < nu_num; j++)
stud[i][j] = rand() % 100 + 1;
}
void print(int** stud, const int st_num, const int nu_num)
{
cout 1 ? stud[1] : 0,nu_num > 2 ? stud[2] : 0 };
sort(buffer);
for (int i = 3; i < nu_num; i++)
{
if (stud[i] < buffer[2]) { buffer[2] = stud[i]; sort(buffer); }
}
return buffer[0] + buffer[1] + buffer[2];
}*/
int find(int** stud, const int st_num, const int nu_num, int(*foo)(int*, const int), bool best)
{
int summ = foo(stud[0], nu_num), temp{}, stnum{};
for (int i = 1; i < st_num; i++)
if (best ^ (summ > (temp = foo(stud[i], nu_num)))) {
summ = temp; stnum = i;
}
return stnum;
}
int main()
{
setlocale(0, "");
int** students;
int M, N;
cout > M >> N;
students = create(M, N);
rand_fill(students, M, N);
print(students, M, N);
cout
Альберт Найманов
правильно, но с++ калассы прежде всего и желательно до обязательно try catch и проверка на ошибки выделения памяти
Азимут Сп
Здравствуйте, можете какую роль выполняет функция sort?
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
void set_size(unsigned & num, const char c, const unsigned limit)
{
do
{
switch(c)
{
case 'M':
cout << "Количество студентов";
break;
case 'N':
cout << "Количество оценок";
break;
default:
cerr << "Неверный параметр " << c << '!' << endl;
exit(1);
break;
}
cout << " = ";
cin >> num;
}
while(num < limit);
}
unsigned ** my_realoc(unsigned M, unsigned N)
{
unsigned ** A;
A = new unsigned* [M];
for(unsigned x = 0; x < M; x++)
A[x] = new unsigned [N];
return A;
}
void my_free(unsigned ** A, unsigned M, unsigned N)
{
if(A == (unsigned**) nullptr) exit(1);
for(unsigned x = 0; x < M; x++)
{
if(A[x] = (unsigned*) nullptr) exit(1);
delete [] A[x];
A[x] = (unsigned*) nullptr;
}
delete [] A;
A = (unsigned**) nullptr;
}
void genegate(unsigned ** A, unsigned M, unsigned N)
{
srand(time(nullptr));
rand();
for(unsigned x = 0; x < M; x++)
{
for(unsigned y = 0; y < N; y++)
{
A[x][y] = rand() % 100 + 1;
}
}
}
void print_a(unsigned ** A, unsigned M, unsigned N)
{
cout << endl;
for(unsigned x = 0; x < M; x++)
{
for(unsigned y = 0; y < N; y++)
{
cout << A[x][y] << '\t';
}
cout << endl;
}
cout << endl;
}
void sort_a(unsigned ** A, unsigned M, unsigned N)
{
unsigned tmp;
for(unsigned x = 0; x < M; x++)
{
for(unsigned y = 0; y < N; y++)
{
for(unsigned z = y + 1; z < N; z++)
{
if(A[x][y] < A[x][z])
{
tmp = A[x][y];
A[x][y] = A[x][z];
A[x][z] = tmp;
}
}
}
}
}
unsigned find_best(unsigned ** A, unsigned M, unsigned N)
{
unsigned best = 0,tmp_sum,max_sum,tmp_num;
for(unsigned x = 0; x < M; x++)
{
if(x == 0)
{
max_sum = 0;
for(unsigned y = 0; y < 3; y++)
max_sum += A[x][y];
}
else
{
tmp_sum = 0;
for(unsigned y = 0; y < 3; y++)
tmp_sum += A[x][y];
if(tmp_sum > max_sum)
{
best = x;
max_sum = tmp_sum;
}
}
}
return best;
}
unsigned find_lose(unsigned ** A, unsigned M, unsigned N)
{
unsigned lose = 0,tmp_sum,max_sum,tmp_num;
for(unsigned x = 0; x < M; x++)
{
if(x == 0)
{
max_sum = 0;
for(unsigned y = N-3; y < N; y++)
max_sum += A[x][y];
}
else
{
tmp_sum = 0;
for(unsigned y = N-3; y < N; y++)
tmp_sum += A[x][y];
if(tmp_sum < max_sum)
{
lose = x;
max_sum = tmp_sum;
}
}
}
return lose;
}
void result(const unsigned best, const unsigned lose)
{
cout << "Лучший студент под номером " << best + 1 << '.' << endl;
cout << "Худший студент под номером " << lose + 1 << '.' << endl;
}
int main()
{
const unsigned min_m = 2, min_n = 3;
unsigned M,N,**A;
unsigned best,lose;
set_size(M,'M',min_m);
set_size(N,'N',min_n);
A = my_realoc(M,N);
genegate(A,M,N);
print_a(A,M,N);
sort_a(A,M,N);
best = find_best(A,M,N);
lose = find_lose(A,M,N);
result(best,lose);
my_free(A,M,N);
return 0;
}
#include <ctime>
#include <cstdlib>
using namespace std;
void set_size(unsigned & num, const char c, const unsigned limit)
{
do
{
switch(c)
{
case 'M':
cout << "Количество студентов";
break;
case 'N':
cout << "Количество оценок";
break;
default:
cerr << "Неверный параметр " << c << '!' << endl;
exit(1);
break;
}
cout << " = ";
cin >> num;
}
while(num < limit);
}
unsigned ** my_realoc(unsigned M, unsigned N)
{
unsigned ** A;
A = new unsigned* [M];
for(unsigned x = 0; x < M; x++)
A[x] = new unsigned [N];
return A;
}
void my_free(unsigned ** A, unsigned M, unsigned N)
{
if(A == (unsigned**) nullptr) exit(1);
for(unsigned x = 0; x < M; x++)
{
if(A[x] = (unsigned*) nullptr) exit(1);
delete [] A[x];
A[x] = (unsigned*) nullptr;
}
delete [] A;
A = (unsigned**) nullptr;
}
void genegate(unsigned ** A, unsigned M, unsigned N)
{
srand(time(nullptr));
rand();
for(unsigned x = 0; x < M; x++)
{
for(unsigned y = 0; y < N; y++)
{
A[x][y] = rand() % 100 + 1;
}
}
}
void print_a(unsigned ** A, unsigned M, unsigned N)
{
cout << endl;
for(unsigned x = 0; x < M; x++)
{
for(unsigned y = 0; y < N; y++)
{
cout << A[x][y] << '\t';
}
cout << endl;
}
cout << endl;
}
void sort_a(unsigned ** A, unsigned M, unsigned N)
{
unsigned tmp;
for(unsigned x = 0; x < M; x++)
{
for(unsigned y = 0; y < N; y++)
{
for(unsigned z = y + 1; z < N; z++)
{
if(A[x][y] < A[x][z])
{
tmp = A[x][y];
A[x][y] = A[x][z];
A[x][z] = tmp;
}
}
}
}
}
unsigned find_best(unsigned ** A, unsigned M, unsigned N)
{
unsigned best = 0,tmp_sum,max_sum,tmp_num;
for(unsigned x = 0; x < M; x++)
{
if(x == 0)
{
max_sum = 0;
for(unsigned y = 0; y < 3; y++)
max_sum += A[x][y];
}
else
{
tmp_sum = 0;
for(unsigned y = 0; y < 3; y++)
tmp_sum += A[x][y];
if(tmp_sum > max_sum)
{
best = x;
max_sum = tmp_sum;
}
}
}
return best;
}
unsigned find_lose(unsigned ** A, unsigned M, unsigned N)
{
unsigned lose = 0,tmp_sum,max_sum,tmp_num;
for(unsigned x = 0; x < M; x++)
{
if(x == 0)
{
max_sum = 0;
for(unsigned y = N-3; y < N; y++)
max_sum += A[x][y];
}
else
{
tmp_sum = 0;
for(unsigned y = N-3; y < N; y++)
tmp_sum += A[x][y];
if(tmp_sum < max_sum)
{
lose = x;
max_sum = tmp_sum;
}
}
}
return lose;
}
void result(const unsigned best, const unsigned lose)
{
cout << "Лучший студент под номером " << best + 1 << '.' << endl;
cout << "Худший студент под номером " << lose + 1 << '.' << endl;
}
int main()
{
const unsigned min_m = 2, min_n = 3;
unsigned M,N,**A;
unsigned best,lose;
set_size(M,'M',min_m);
set_size(N,'N',min_n);
A = my_realoc(M,N);
genegate(A,M,N);
print_a(A,M,N);
sort_a(A,M,N);
best = find_best(A,M,N);
lose = find_lose(A,M,N);
result(best,lose);
my_free(A,M,N);
return 0;
}
Равиль Закиров
Думаю что лучше избегать сортировки всего массива, особенно учитывая что нужно найти всего три лучших оценки. Что ненамного больше, чем одну.
Кстати зачем для nullptr указывать его тип, если он и так всегда нужного типа?
Кстати зачем для nullptr указывать его тип, если он и так всегда нужного типа?
Похожие вопросы
- C++ программирование с использованием динамических двумерных массивов
- Динамический двумерный массив
- Задача по С++ ДИНАМИЧЕСКИЙ МАССИВ
- Двумерные массивы C++, ничего не понимаю((( Нужна помощь
- Программирование алгоритмов с использованием двумерных массивов c++
- Программирование. Обработка двумерных массивов (матриц)
- Запись и чтение двумерного массива в бинарный файл
- Двумерный массив C++
- Ввести двумерный массив A(n x m)
- Создать и вывести двумерный массив через функции