Матрица, С
-
- Сообщения: 4
- Зарегистрирован: 26 май 2008, 18:18
Помогите пожайлуста.
Условие такое: даны 2 матрицы размерность 20 на 20. Задача на процедуры и функции, Решить надо в СИ или С++(но лучше в си)
условие: 1) если отрицательный элемент лежит на главной диагонали, то в строках где лежит этот элемент найти максимальный элемент
2) Найти сумму граничных элементов матрица, т.е. сумму всех самых крайних элементов, если она больше размерности матрицы
Если максимальный элемент из 1) положительный и сумма крайних элементов больше размерности матрицы, то выполнить преобразования
Преобразование: поменять местами столбцы, в которых есть максимальный или минимальный элементы.
ПОМОГИТЕ ПОЖАЙЛУСТА!!!!!!!!
Условие такое: даны 2 матрицы размерность 20 на 20. Задача на процедуры и функции, Решить надо в СИ или С++(но лучше в си)
условие: 1) если отрицательный элемент лежит на главной диагонали, то в строках где лежит этот элемент найти максимальный элемент
2) Найти сумму граничных элементов матрица, т.е. сумму всех самых крайних элементов, если она больше размерности матрицы
Если максимальный элемент из 1) положительный и сумма крайних элементов больше размерности матрицы, то выполнить преобразования
Преобразование: поменять местами столбцы, в которых есть максимальный или минимальный элементы.
ПОМОГИТЕ ПОЖАЙЛУСТА!!!!!!!!
1. Называйте тему информативно! Читайте правила раздела!
2. Задание сформулировано жутко коряво.
- где в задаче хоть раз используется вторая матрица?
- отрицательных элементов в матрице может быть больше одного. А может и не быть вообще. Какой брать?
- что значит "крайний элемент матрицы"?
- как можно определить, больше эта сумма, чем 20, или не больше, не определяя ее?
3. В разделе "Алгоритмы" есть алгоритм поиска максимума и минимума.
2. Задание сформулировано жутко коряво.
- где в задаче хоть раз используется вторая матрица?
- отрицательных элементов в матрице может быть больше одного. А может и не быть вообще. Какой брать?
- что значит "крайний элемент матрицы"?
- как можно определить, больше эта сумма, чем 20, или не больше, не определяя ее?
3. В разделе "Алгоритмы" есть алгоритм поиска максимума и минимума.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
-
- Сообщения: 4
- Зарегистрирован: 26 май 2008, 18:18
Даны две матрицы, если условие выполниется в одной из них, то в другой выполнить преобразование.
условие: 1) если отрицательный элемент лежит на главной диагонали, то в строках где лежит этот элемент найти максимальный элемент
2) Найти сумму граничных элементов матрица, т.е. сумму всех самых крайних элементов(граничные элементы, т.е. эл-ты которые находятся в самой верхней и нижней строки и самом правом и левом столбце)
Если максимальный элемент из 1) положительный и сумма крайних элементов больше размерности матрицы, то выполнить преобразования
Преобразование: поменять местами столбцы, в которых есть максимальный или минимальный элементы.
Как находить максимальный элемент я знаю, но не знаю как найти сумму крайних элементов, вот личтинг программы, посмотрите плиз и скажите что неправильно и если не сложно подправьте:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main()
{int a[10][10],b[10][10],n,m,e;
scanf("%d","%d",&n,&m);
vvod(n,a);
vvod(m,b);
vivod(n,a);
vivod(m,b);
if (e=1)
{preob(m,b);
if (e=1)
preob(n,a);
}
else printf("\n uslovie ne vipolnimo");
return;
}
int usl(int n, int t[10][10])
{int k, l, max, e,i,j;
e=0;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{if ((i=j)&&(t[j]<0))
{max==t[j];}
for (k=2; k<=n; k++)
{if (max<t[j])
max==t[j];}
if (max>0)
e=1;
}
return (e);}
int preob(int n,int t[10][10])
{int i,j, l, max, min, jmin, jmax;
{min==100; max==0; jmin==1; jmax==1;
for (i = 1; i <= n; i++){
for (j=1; j<=n; j++)
if (t[j]>max){
max==t[j];
jmax==j;
}
if (t[j]<=min){
min==t[j]; jmin==j;
}
}
}
{if (jmax=jmin)
printf("\Nichego delat' ne nado");
else
{for (i=1;i<=n;i++){
l==t[jmax];
t[jmax]==t[i][jmin];
t[i][jmin]==l;}
for (i = 1; i <= n; i++){
for (j = 1; j <= n; j++){
printf ("t[i][j]", " ");
}}
}
}return;}
int vvod(int n, int t[10][10])
{int i,j;
for (i=1; i<=n; i++)
{
for (j=1; j<=n; j++)
{
scanf("%d",t[i][j]);
}
}
return;}
int vivod(int n, int t[10][10])
{int i,j;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
printf("%d",t[i][j]);
return;}
//--------------------------------
условие: 1) если отрицательный элемент лежит на главной диагонали, то в строках где лежит этот элемент найти максимальный элемент
2) Найти сумму граничных элементов матрица, т.е. сумму всех самых крайних элементов(граничные элементы, т.е. эл-ты которые находятся в самой верхней и нижней строки и самом правом и левом столбце)
Если максимальный элемент из 1) положительный и сумма крайних элементов больше размерности матрицы, то выполнить преобразования
Преобразование: поменять местами столбцы, в которых есть максимальный или минимальный элементы.
Как находить максимальный элемент я знаю, но не знаю как найти сумму крайних элементов, вот личтинг программы, посмотрите плиз и скажите что неправильно и если не сложно подправьте:
#include <stdio.h>
#include <conio.h>
#include <math.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main()
{int a[10][10],b[10][10],n,m,e;
scanf("%d","%d",&n,&m);
vvod(n,a);
vvod(m,b);
vivod(n,a);
vivod(m,b);
if (e=1)
{preob(m,b);
if (e=1)
preob(n,a);
}
else printf("\n uslovie ne vipolnimo");
return;
}
int usl(int n, int t[10][10])
{int k, l, max, e,i,j;
e=0;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{if ((i=j)&&(t[j]<0))
{max==t[j];}
for (k=2; k<=n; k++)
{if (max<t[j])
max==t[j];}
if (max>0)
e=1;
}
return (e);}
int preob(int n,int t[10][10])
{int i,j, l, max, min, jmin, jmax;
{min==100; max==0; jmin==1; jmax==1;
for (i = 1; i <= n; i++){
for (j=1; j<=n; j++)
if (t[j]>max){
max==t[j];
jmax==j;
}
if (t[j]<=min){
min==t[j]; jmin==j;
}
}
}
{if (jmax=jmin)
printf("\Nichego delat' ne nado");
else
{for (i=1;i<=n;i++){
l==t[jmax];
t[jmax]==t[i][jmin];
t[i][jmin]==l;}
for (i = 1; i <= n; i++){
for (j = 1; j <= n; j++){
printf ("t[i][j]", " ");
}}
}
}return;}
int vvod(int n, int t[10][10])
{int i,j;
for (i=1; i<=n; i++)
{
for (j=1; j<=n; j++)
{
scanf("%d",t[i][j]);
}
}
return;}
int vivod(int n, int t[10][10])
{int i,j;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
printf("%d",t[i][j]);
return;}
//--------------------------------
Зачем вместо знака = используешь == и наоборот? Обращай внимание на тип функции, если функция типа int, то она должна возвращать целое число, а не void. Ошибок море.
-
- Сообщения: 4
- Зарегистрирован: 26 май 2008, 18:18
Исправьте пожайлуста, если несложно. Реально я в си не шарю, в паскале написать могу, а вот в си нефига:-) напишите правильный листинг или киньте на мыло рабочий вариант:solant90@mail.ru
tatu_cat_69 писал(а):Исправьте пожайлуста, если несложно. Реально я в си не шарю, в паскале написать могу, а вот в си нефига:-) напишите правильный листинг или киньте на мыло рабочий вариант:solant90@mail.ru
Код: Выделить всё
[color=#0000ff]
#include [/color]<stdio.h>
[color=#0000ff]#include [/color]<conio.h>
[color=#0000ff]#include [/color]<math.h>
[color=#0000ff]#include [/color][color=#000077]"time.h"
[/color][color=#0000ff]#include [/color][color=#000077]"stdlib.h"
[/color][color=#009900]/*
Индексы массива начинаются с 0 и не превышают размерности массива
= для присваивания значения
== для сравнения. Возвращает логическое значение,
например : i==10 вернёт true, только если значение переменной i будет равно 10
*/
[/color][color=#0000ff]int[/color] usl( [color=#0000ff]int[/color] t[10][10],[color=#0000ff]int[/color] n)
{[color=#009900]//полагаюсь на Ваш алгоритм
[/color][color=#0000ff]int[/color] k, max, e,i,j;
e=0;
[color=#0000ff]for[/color] (i=0; i<n; i++)
[color=#0000ff]for[/color] (j=0; j<n; j++)
{
[color=#0000ff]if[/color] ((i==j) && (t[i][j]<0))max=t[i][j];
[color=#0000ff]for[/color] (k=1; k<n; k++)
{
[color=#0000ff]if[/color] (max<t[i][j])
max=t[i][j];
}
[color=#0000ff]if[/color] (max>0) e=1;
}
[color=#0000ff]return[/color] (e);
}
[color=#0000ff]int[/color] preob([color=#0000ff]int[/color] t[10][10],[color=#0000ff]int[/color] n)
{[color=#009900]//полагаюсь на Ваш алгоритм
[/color][color=#0000ff]int[/color] i,j, l, max, min, jmin, jmax;
{
max=min=t[0][0]; [color=#009900]//лучше присвоить имеющиеся значения,
[/color][color=#009900]//а то могут быть проблемы, если вдруг, в массиве нет чисел больше 100
[/color][color=#009900]//или минимальное значение больше 0
[/color]jmin=0;
jmax=0;
[color=#0000ff]for[/color] (i = 0; i < n; i++)
{
[color=#0000ff]for[/color] (j=0; j<n; j++)
[color=#0000ff]if[/color] (t[i][j]>max)
{
max=t[i][j];
jmax=j;
}
[color=#0000ff]if[/color] (t[i][j]<=min)
{
min=t[i][j];
jmin=j;
}
}
}
[color=#0000ff]if[/color] (jmax==jmin) printf([color=#000077]"Nichego delat' ne nado"[/color]);
[color=#0000ff]else
[/color]{
[color=#0000ff]for[/color] (i=0;i<n;i++)
{
l=t[i][jmax];
t[i][jmax]=t[i][jmin];
t[i][jmin]=l;
}
[color=#0000ff]for[/color] (i = 0; i < n; i++)
{
[color=#0000ff]for[/color] (j = 0; j < n; j++)
{[color=#009900]//определитесь с тем, что хотите вывести на экран
[/color]printf ([color=#000077]"t[i][j]"[/color], [color=#000077]" "[/color]);
}
}
}
[color=#0000ff]return[/color] 0;
}
[color=#0000ff]void[/color] vvod( [color=#0000ff]int[/color] t[10][10],[color=#0000ff]int[/color] n)
{
[color=#0000ff]for[/color] ([color=#0000ff]int[/color] i=0; i<n; i++)
{
[color=#0000ff]for[/color] ([color=#0000ff]int[/color] j=0; j<n; j++)
{
scanf([color=#000077]"%d"[/color],&t[i][j]);[color=#009900]//в scanf передаём адрес переменной, см. MSDN
[/color]}
}
}
[color=#0000ff]void[/color] vvod_auto( [color=#0000ff]int[/color] t[10][10],[color=#0000ff]int[/color] n)
{[color=#009900]//это чтобы пальцы не стереть о клавиатуру
//когда вводим матрицу 10х10, да ещё и 2 раза
[/color][color=#0000ff]for[/color] ([color=#0000ff]int[/color] i=0; i<n; i++)
{
[color=#0000ff]for[/color] ([color=#0000ff]int[/color] j=0; j<n; j++)
{
t[i][j]=rand()%100 * (rand()%2==1?-1:1);[color=#009900]//если отрицательные числа не нужны
[/color][color=#009900]//то выражение "* (rand()%2==1?-1:1)" нужно убрать
[/color]}
}
}
[color=#0000ff]void[/color] vivod([color=#0000ff]int[/color] t[10][10],[color=#0000ff]int[/color] n)
{
[color=#0000ff]int[/color] i,j;
[color=#0000ff]for[/color] (i=0; i<n; i++)
{
[color=#0000ff]for[/color] (j=0; j<n; j++)
printf([color=#000077]"%d\t"[/color],t[i][j]);
printf([color=#000077]"\n"[/color]);
}
}
[color=#0000ff]void[/color] main()
{
srand(time(0));[color=#009900]//нужно для инициализации генератора случайных чисел
[/color][color=#009900]//можно убрать при ручном вводе
[/color][color=#0000ff]const[/color] n(10);[color=#009900]//размерность массива, можем изменить если нужно, не внося изменений в дальнейший код
[/color][color=#0000ff]const[/color] m(10);[color=#009900]//в данной задаче можно было бы ограничиться одной константой
[/color][color=#0000ff]int[/color] a[n][m],b[n][m],e;
[color=#009900]// scanf("%d","%d",&n,&m);
// следующие 2 строки замените ф-цией ручного ввода, если нужно
[/color]vvod_auto(a,n);
vvod_auto(b,m);
e=usl(a,n);[color=#009900]//наверное так. Не знаю вашей задумки
[/color]printf([color=#000077]"Matrix a:\n"[/color]);
vivod(a,n);
printf([color=#000077]"Matrix b:\n"[/color]);
vivod(b,m);
[color=#0000ff]if[/color] (e==1)
{[color=#009900]//полагаюсь на Ваш алгоритм
[/color]preob(b,m);
[color=#0000ff]if[/color] (e==1)[color=#009900]//??? мы и так попадаем в это условие
[/color]preob(a,n);
}
[color=#0000ff]else[/color] printf([color=#000077]"\n uslovie ne vipolnimo"[/color]);
}
tatu_cat_69 писал(а):Исправьте пожайлуста, если несложно. Реально я в си не шарю, в паскале написать могу, а вот в си нефига:-) напишите правильный листинг или киньте на мыло рабочий вариант:solant90@mail.ru
Код: Выделить всё
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include "time.h"
#include "stdlib.h"
/*
Индексы массива начинаются с 0 и не превышают размерности массива
= для присваивания значения
== для сравнения. Возвращает логическое значение,
например : i==10 вернёт true, только если значение переменной i будет равно 10
*/
int usl( int t[10][10],int n)
{//полагаюсь на Ваш алгоритм
int k, max, e,i,j;
e=0;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
if ((i==j) && (t[i][j]<0))max=t[i][j];
for (k=1; k<n; k++)
{
if (max<t[i][j])
max=t[i][j];
}
if (max>0) e=1;
}
return (e);
}
int preob(int t[10][10],int n)
{//полагаюсь на Ваш алгоритм
int i,j, l, max, min, jmin, jmax;
{
max=min=t[0][0]; //лучше присвоить имеющиеся значения,
//а то могут быть проблемы, если вдруг, в массиве нет чисел больше 100
//или минимальное значение больше 0
jmin=0;
jmax=0;
for (i = 0; i < n; i++)
{
for (j=0; j<n; j++)
if (t[i][j]>max)
{
max=t[i][j];
jmax=j;
}
if (t[i][j]<=min)
{
min=t[i][j];
jmin=j;
}
}
}
if (jmax==jmin) printf("Nichego delat' ne nado");
else
{
for (i=0;i<n;i++)
{
l=t[i][jmax];
t[i][jmax]=t[i][jmin];
t[i][jmin]=l;
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{//определитесь с тем, что хотите вывести на экран
printf ("t[i][j]", " ");
}
}
}
return 0;
}
void vvod( int t[10][10],int n)
{
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
scanf("%d",&t[i][j]);//в scanf передаём адрес переменной, см. MSDN
}
}
}
void vvod_auto( int t[10][10],int n)
{//это чтобы пальцы не стереть о клавиатуру
//когда вводим матрицу 10х10, да ещё и 2 раза
for (int i=0; i<n; i++)
{
for (int j=0; j<n; j++)
{
t[i][j]=rand()%100 * (rand()%2==1?-1:1);//если отрицательные числа не нужны
//то выражение "* (rand()%2==1?-1:1)" нужно убрать
}
}
}
void vivod(int t[10][10],int n)
{
int i,j;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
printf("%d\t",t[i][j]);
printf("\n");
}
}
void main()
{
srand(time(0));//нужно для инициализации генератора случайных чисел
//можно убрать при ручном вводе
const n(10);//размерность массива, можем изменить если нужно, не внося изменений в дальнейший код
const m(10);//в данной задаче можно было бы ограничиться одной константой
int a[n][m],b[n][m],e;
// scanf("%d","%d",&n,&m);
// следующие 2 строки замените ф-цией ручного ввода, если нужно
vvod_auto(a,n);
vvod_auto(b,m);
e=usl(a,n);//наверное так. Не знаю вашей задумки
printf("Matrix a:\n");
vivod(a,n);
printf("Matrix b:\n");
vivod(b,m);
if (e==1)
{//полагаюсь на Ваш алгоритм
preob(b,m);
if (e==1)//??? мы и так попадаем в это условие
preob(a,n);
}
else printf("\n uslovie ne vipolnimo");
}
2Albor - [/code] не в ту сторону закрыл.
< L3X. (ICQ: 8721378, Mail - l3x@list.ru)
BHy4ok писал(а):2Albor - [/code] не в ту сторону закрыл.
Я это понял, но было уже поздно.
Убрал лишнее
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.