Консультация № 172833
02.10.2009, 19:19
0.00 руб.
0 3 2
Здравствуйте, не могу решить задачу. Надо на С++ Написать программу.
Вот задание:

Дана прямоугольная матрица А(n,m) Найти сумму элементов строки и столбца ,
на пересечении которой расположен максимум элементов матрицы А
Нахождение номера строки и столбца на пересечении которых находиться
максимальный элемент матрицы А

Я попробовал сделать так:
Код:

#include <stdlib.h>
#include <conio.h>
#include <stdio.h>

void main()
{
int i, j, sum, im, jm;
int s1,s2,s3,s4,s5,s6,s7,s8,s9,s10;
int s11,s12,s13,s14,s15,s16,s17,s18,s19,s20;
int s21,s22,s23,s24,s25,s26,s27,s28,s29,s30;
int s31,s32,s33,s34,s35,s36,s37,s38,s39,s40;
int s41,s42,s43,s44,s45,s46,s47,s48,s49,s50;
int A[5][10];
im=1;
jm=1;
//vvodim matricu
printf("Vvedite matricu 5x10:\n");
scanf("%d",&s1);
scanf("%d",&s2);
scanf("%d",&s3);
scanf("%d",&s4);
scanf("%d",&s5);
scanf("%d",&s6);
scanf("%d",&s7);
scanf("%d",&s8);
scanf("%d",&s9);
scanf("%d",&s10);
printf("\n");
scanf("%d",&s11);
scanf("%d",&s12);
scanf("%d",&s13);
scanf("%d",&s14);
scanf("%d",&s15);
scanf("%d",&s16);
scanf("%d",&s17);
scanf("%d",&s18);
scanf("%d",&s19);
scanf("%d",&s20);
printf("\n");
scanf("%d",&s21);
scanf("%d",&s22);
scanf("%d",&s23);
scanf("%d",&s24);
scanf("%d",&s25);
scanf("%d",&s26);
scanf("%d",&s27);
scanf("%d",&s28);
scanf("%d",&s29);
scanf("%d",&s30);
printf("\n");
scanf("%d",&s31);
scanf("%d",&s32);
scanf("%d",&s33);
scanf("%d",&s34);
scanf("%d",&s35);
scanf("%d",&s36);
scanf("%d",&s37);
scanf("%d",&s38);
scanf("%d",&s39);
scanf("%d",&s40);
printf("\n");
scanf("%d",&s41);
scanf("%d",&s42);
scanf("%d",&s43);
scanf("%d",&s44);
scanf("%d",&s45);
scanf("%d",&s46);
scanf("%d",&s47);
scanf("%d",&s48);
scanf("%d",&s49);
scanf("%d",&s50);
A[0][0]=s1;
A[0][1]=s2;
A[0][2]=s3;
A[0][3]=s4;
A[0][4]=s5;
A[0][5]=s6;
A[0][6]=s7;
A[0][7]=s8;
A[0][8]=s9;
A[0][9]=s10;
A[1][0]=s11;
A[1][1]=s12;
A[1][2]=s13;
A[1][3]=s14;
A[1][4]=s15;
A[1][5]=s16;
A[1][6]=s17;
A[1][7]=s18;
A[1][8]=s19;
A[1][9]=s20;
A[2][0]=s21;
A[2][1]=s22;
A[2][2]=s23;
A[2][3]=s24;
A[2][4]=s25;
A[2][5]=s26;
A[2][6]=s27;
A[2][7]=s28;
A[2][8]=s29;
A[2][9]=s30;
A[3][0]=s31;
A[3][1]=s32;
A[3][2]=s33;
A[3][3]=s34;
A[3][4]=s35;
A[3][5]=s36;
A[3][6]=s37;
A[3][7]=s38;
A[3][8]=s39;
A[3][9]=s40;
A[4][0]=s41;
A[4][1]=s42;
A[4][2]=s43;
A[4][3]=s44;
A[4][4]=s45;
A[4][5]=s46;
A[4][6]=s47;
A[4][7]=s48;
A[4][8]=s49;
A[4][9]=s50;

//Nahodim maximum
for(i=1; j<=4; i++)
{
for(j=1; j<=9; j++)
{
if(A[i][j] > A[im][jm])
{
im=i;
jm=j;
}
}
}

//nahodim summu
sum=0;
for(i=1; i<4; i++)
{
sum=sum+A[i][jm];
}

for(j=1; j<10; j++)
{
sum=sum + A[im][j];
}
printf("MAXIMUM = ");
printf("%d", &A[im][jm]);
printf("SUMMA = ");
printf("%d", &sum);
getch();
}

Ничего не получилось программа не считает, выдаёт всегда одно и тоже число. Видимо куча ошибок, а я понять ничего не могу.
Помогите разобраться.

Обсуждение

давно
Академик
20764
1861
02.10.2009, 19:36
общий
У вас кое-где циклы с 1 а не с 0, и im, jm первоначально устанавливаются в 1 а не в 0
Но больше похоже на проблемы со scanf: на первом же недопустимом символе весь ввод оборвётся и все последующие scanf не введут ничего, а код их завершения вы не проверяете.
Неизвестный
02.10.2009, 21:10
общий
это ответ
Здравствуйте, Грибанов Фёдор.
Вот посмотрите мой не самый сложный вариант в приложении.
Пример окна программы:
Код:
Введите элементы массива:
Ряд 1: Введите 5 чисел через пробел и нажмите ENTER:
1 2 3 4 5
Ряд 2: Введите 5 чисел через пробел и нажмите ENTER:
2 45 2 -3 7
Ряд 3: Введите 5 чисел через пробел и нажмите ENTER:
4 5 6 7 8
Ряд 4: Введите 5 чисел через пробел и нажмите ENTER:
12 3 4 5 6
Ряд 5: Введите 5 чисел через пробел и нажмите ENTER:
1 2 3 4 5
Массив
1 2 3 4 5
2 45 2 -3 7
4 5 6 7 8
12 3 4 5 6
1 2 3 4 5
Максимальный элемент находится в 2 строке и в 2 колонке
Сумма элементов 65.

Нажмите любую клавишу...


Приложение:
#include <iostream>
#include <conio.h>

using namespace std;

#define N 5

int main() {
int ar[N][N];
int sum = 0;
int i_max, j_max;
locale::global(locale("russian_russia.866"));
wprintf_s(L"Введите элементы массива:\n");

for (int i=0; i<N; i++) {
wprintf_s(L"Ряд %d: Введите %d чисел через пробел и нажмите ENTER:\n",i+1, N);
for (int j=0; j<N; j++) {
scanf_s("%d", &ar[i][j]);
}
}
wprintf_s(L"Массив\n");
for (int i=0; i<N; i++) {
for (int j=0; j<N; j++) {
printf("%6d", ar[i][j]);
}
printf("\n");
}
// Поиск максимального, вернее номера ряда и номера колонки
i_max = 0; j_max = 0;
for (int i = 0; i<N; i++) {
for (int j=0; j<N; j++) {
if (ar[i][j] > ar[i_max][j_max])
{ i_max = i; j_max = j; }
}
}
wprintf_s(L"Максимальный элемент находится в %d строке и в %d колонке", i_max+1, j_max+1);

for (int i=0; i<N; i++) sum += ar[i_max][i];
for (int i=0; i<N; i++) if (i!=i_max) sum += ar[i][j_max];

wprintf_s(L"\nСумма элементов %d.\n", sum);

wprintf_s( L"\nНажмите любую клавишу...");
_getch();
return 0;
}
Неизвестный
02.10.2009, 23:01
общий
это ответ
Здравствуйте, Грибанов Фёдор.
Программа. MS VS 2008.
Код:

#include <limits>
#include <iostream>
#include <iomanip>
#include <valarray>
#include <string>

using namespace std;

typedef double itemTy;
typedef valarray<valarray<itemTy> > matrixTy;

template<class T>
T input(const string& msg)
{
while(true)
{
T res;
cout<<msg;
cin>>res;
if(cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout<<"Ошибка!"<<endl;
}
else
{
cin.ignore(numeric_limits<streamsize>::max(),'\n');
return res;
}
}
}

// Ввод матрицы
void inputMatrix(matrixTy& matrix)
{
cout<<"Вводите элементы матрицы:"<<endl;
for(size_t i=0;i<matrix.size();++i)
{
valarray<itemTy>& row=matrix[i];
for(size_t j=0;j<row.size();++j)
{
cout<<'['<<i<<"]["<<j<<"]:";
row[j]=input<itemTy>("");
}
}
}

// Решение задачи
itemTy solve(const matrixTy& matrix,size_t& max_row,size_t& max_col)
{
// Поиск позиции максимального элемента
max_row=max_col=0;
itemTy max=matrix[0][0];
for(size_t i=0;i<matrix.size();++i)
{
valarray<itemTy>& row=matrix[i];
for(size_t j=0;j<row.size();++j)
{
if(row[j]>max)
{
max=row[j];
max_row=i;
max_col=j;
}
}
}
// Суммирование
itemTy sum=-max;
for(size_t i=0;i<matrix.size();++i)
{
sum+=matrix[i][max_col];
}
valarray<itemTy>& row=matrix[max_row];
for(size_t i=0;i<row.size();++i)
{
sum+=row[i];
}
return sum;
}

ostream& operator<<(ostream& stream,const matrixTy& matrix)
{
for(size_t i=0;i<matrix.size();++i)
{
valarray<itemTy>& row=matrix[i];
for(size_t j=0;j<row.size();++j)
{
cout<<setw(7)<<row[j]<<' ';
}
cout<<endl;
}

return stream;
}

int main()
{
setlocale(LC_ALL,"russian");
// Ввод размерностей матрицы
size_t rows=input<size_t>("Введите количество строк матрицы:");
size_t cols=input<size_t>("Введите количество столбцов матрицы:");
// Матрица
matrixTy matrix(valarray<itemTy>(cols),rows);
// Ввод матрицы
inputMatrix(matrix);
// Распечатаем ее
cout<<"Исходная матрица:"<<endl<<matrix<<endl;
// Решение задачи
size_t max_row,max_col;
itemTy result=solve(matrix,max_row,max_col);
// Вывод результата
cout<<"Максимальный элемент matrix["<<max_row<<"]["<<max_col<<"]="<<matrix[max_row][max_col]<<endl
<<"Сумма: "<<result<<endl;
system("PAUSE");
return 0;
}

Пример работы:
Код:

Введите количество строк матрицы:3
Введите количество столбцов матрицы:4
Вводите элементы матрицы:
[0][0]:2
[0][1]:3
[0][2]:5
[0][3]:3
[1][0]:7
[1][1]:3
[1][2]:2
[1][3]:5
[2][0]:9
[2][1]:3
[2][2]:2
[2][3]:4
Исходная матрица:
2 3 5 3
7 3 2 5
9 3 2 4

Максимальный элемент matrix[2][0]=9
Сумма: 27
Форма ответа