Перейти к содержанию
АнимеФорум

Рекомендуемые сообщения

Опубликовано

И так, тем создана для помощи студентам при здачи сессии, пишите сюда свои задачи, что нужно найти, и что не понятно, думаю добрые люди не откажут и помогут.

Лично я помогу все, у кого проблемы по дисциплинам: Менеджмент, Долгосрочное планирование, Краткосрочное планирование, Бухгалтерский учет, Финансы и кредит, ДОУ. (кому нужна помощь пишите)

 

 

Ну а теперь вопрос к програмистам, как решить вот эту задачу, точнее решение есть, но нужно его подкорректировать =)

 

Экзаменационный билет №4

По курсу «Программирование на языке высокого уровня»

 

 

1.Указатели. Указатели и массивы.

2. Наследование классов.

Задача.

Дана действительная квадратная матрица порядка n. Найти в ней наибольший по модулю элемент. Получить из нее квадратную матрицу порядка n-1путем выбрасывания из исходной матрицы строки и столбца, на пересечении которых стоит наибольший элемент.

 

 

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

#include <math.h>

float newmass(float D[][10],int k);

void main()

{clrscr();

float A[10][10],max;

int i,n,j;

do

{cout<<"chislo elementov matrici<10=";

cin>>n;

}

while(n>=10&&n<0);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

{cout<<"Vvedite element matrici A["<<i<<"]"<<"["<<j<<"]=";

scanf("%f",&A[j]);

}

for(i=0;i<n;i++)

{for(j=0;j<n;j++)

 

printf("%3.1f",A[j]);

 

printf("\n");

}

max=newmass(A,n);

printf("max elemenet po modulu%3.1f",max);

getch();

}

float newmass(float D[][10],int k)

{int i,j,indexi,indexj;

float B[9][9],maxd=D[0][0];

indexi=0;indexj=0;

int i1,j1;

for(i=0;i<k;i++)

{for(j=0;j<k;j++)

{if(fabs(D[j])>fabs(maxd))

{maxd=D[j];

indexi=i;

indexj=j;

}}}

 

for(i=0;i<k;i++)

{i1=i;

if(i>indexi)

i1=i-1;

else if(i==indexi)

continue;

for(i=0;i<k;i++)

{j1=j;

if(j>indexj)

j1=j-1;

else if(j==indexj)

continue;

B[i1][j1]=D[j];

}

}

printf("new mass\n");

for(i=0;i<(k-1);i++)

for(j=0;j<(k-1);j++)

{printf("%3.1f",B[j]);

}

printf("\n");

return maxd;

}

 

 

Помоги ближнему и будет тебе счастье =)

  • Ответов 52
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Опубликовано

В каком смысле подкорректировать? Код работает. Оформлен только криво.

 

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>

float newmass(float D[][10],int k);

void main()
{
clrscr();
float A[10][10],max;
int i,n,j;
do
{
	cout<<"chislo elementov matrici<10=";
	cin>>n;
}
while(n>=10&&n<0);
for(i=0;i<n;i++)
	for(j=0;j<n;j++)
	{
		cout<<"Vvedite element matrici A["<<i<<"]"<<"["<<j<<"]=";
		scanf("%f",&A[i][j]);
	}
for(i=0;i<n;i++)
{
	for(j=0;j<n;j++)

	printf("%3.1f",A[i][j]);

	printf("\n");
}
max=newmass(A,n);

printf("max elemenet po modulu%3.1f",max);
getch();
}

float newmass(float D[][10],int k)
{
int i,j,indexi,indexj;
float B[9][9],maxd=D[0][0];
indexi=0;indexj=0;
int i1,j1;
for(i=0;i<k;i++)
{
	for(j=0;j<k;j++)
	{
		if(fabs(D[i][j])>fabs(maxd))
		{
			maxd=D[i][j];
			indexi=i;
			indexj=j;
		}
	}
}

for(i=0;i<k;i++)
{
	i1=i;
	if(i>indexi)
	i1=i-1;
	else if(i==indexi) continue;
	for(i=0;i<k;i++)
	{
		j1=j;
		if(j>indexj) j1=j-1;
		else if(j==indexj) continue;
		B[i1][j1]=D[i][j];
	}
}

printf("new mass\n");
for(i=0;i<(k-1);i++)
	for(j=0;j<(k-1);j++)
	{
		printf("%3.1f",B[i][j]);
	}
printf("\n");
return maxd;
}

 

А, новую матрицу не рисует похоже. Да и старую кривовато выводит.

Опубликовано (изменено)

Вот это и надо исправить, как исправить, что бы он корректно старую матрицу выводил и новую рисовал.

Только вот как это сделать мне неизвестно.

Изменено пользователем Lunatofob (смотреть историю редактирования)
Опубликовано

Где-то так получилось:

 

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string>
#include <sstream>

template <typename T>
std::string toString(T val)
{
std::ostringstream oss;
oss<< val;
return oss.str();
}

void main()
{
clrscr();
float A[10][10];
int i,n,j;
do
{
	cout<<"chislo elementov matrici<10=";
	cin>>n;
}
while(n>=10&&n<0);
for(i=0;i<n;i++)
	for(j=0;j<n;j++)
	{
		cout<<"Vvedite element matrici A["<<i<<"]"<<"["<<j<<"]=";
		scanf("%f",&A[i][j]);
	}

//Вычисляем самое длинное число в матрице
//чтобы нормально вывело
string s;
int max_len = 0;

cout << endl;
for( i=0; i<n; i++ )
{
	for( j=0; j<n; j++ )
	{
		s = toString(A[i][j]);
		if( s.length() > max_len ) max_len = s.length();
	}
}

//Выводиv. gotoxy нужен для отступов в матрице, используем max_len
for( i=0; i<n; i++ )
{
	for( j=0; j<n; j++ )
	{
		gotoxy(j*(max_len+2),wherey());
		cout << A[i][j] << " ";
	}
	cout << endl;
}

//Получаем значение максимального элемента матрицы.
//Если несколько одинаковых - берём первый попавшийся

float max = 0;
float max_i, max_j;
for( i=0; i<n; i++ )
{
	for( j=0; j<n; j++ )
	{
		if( fabs( A[i][j] ) > max )
		{
			max = A[i][j];
			max_i = i;
			max_j = j;
		}
	}
}
//Нашли максимальный и его позицию.
//Копируем в новую матрицу всё кроме строки и столбца
//с максимумом

float new_matrix[9][9];
int ni,nj;
ni = 0; nj = 0;

for( i=0; i<n; i++ )
{
	nj = 0;
	if( i == max_i ) continue;
	for( j=0; j<n; j++ )
	{
		if( j == max_j ) continue;
		new_matrix[ni][nj] = A[i][j];
		nj++;
	}

	ni++;
}

cout << endl;

for( i=0; i < n-1; i++ )
{
	for( j=0; j < n-1; j++ )
	{
		gotoxy(j*(max_len+2),wherey());
		cout << new_matrix[i][j] << " ";
	}
	cout << endl;
}


printf("max elemenet po modulu%3.1f",max);
getch();
}

 

Хренота сразу под инклюдами нужна, чтобы float в string перегнать. Если препод спрашивать будет - прикидывайся табуреткой и говори "что за типлэйт такой знать не знаю, из инета скачал штоб матрицу красиво отформатировать" -)

Опубликовано

во все всем спс вро разобрался по идее так:

#include <math.h>

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

float newmass(float D[][10],int k);

void main()

{clrscr();

float A[10][10],max;

int i,n,j;

do

{cout<<"chislo elementov matrici < 10 = ";

cin>>n;}

while(n>=10 && n<0);

for (i=0;i<n;i++)

for (j=0;j<n;j++)

{cout <<"Vvedite element matrici A["<<i<<"]"<<"["<<j<<"]=";

scanf("%f",&A[j]);}

for (i=0;i<n;i++)

{for(j=0;j<n;j++)

{printf("%3.1f ",A[j]);}

printf("\n");}

max=newmass(A,n);

printf("max element po modulu %3.1f",max);

getch();}

float newmass(float D[][10],int k)

{int i,j,indexi,indexj;

float B[9][9],maxd=D[0][0];

indexi=0;indexj=0;

int i1,j1;

for (i=0;i<k;i++)

{ for(j=0;j<k;j++)

{ if(fabs(D[j])>fabs(maxd))

{ maxd=D[j];

indexi=i;

indexj=j;

}}}

for (i=0;i<k;i++)

{ i1=i;

if (i>indexi)

i1=i-1;

else if(i==indexi)

continue;

for(j=0;j<k;j++)

{j1=j;

if (j>indexj)

j1=j-1;

else if(j==indexj)

continue;

B[i1][j1]=D[j]; }}

printf("new mass \n");

for (i=0;i<(k-1);i++)

{for(j=0;j<(k-1);j++)

{printf("%3.1f ",B[j]);}

printf("\n");}

return maxd;}

Опубликовано

Угу, работает. Но в этом случае, если числа разной длины, то матрица разъезжается, плюс идёт округление до десятых, которое непонятно зачем. Если выводить через cout << никакого округления не будет. И какой смысл в выносе сборки нового массива в отдельную функцию?

 

Борланд который в инсте, не распознает эти библиотеки =( нужно как то без нних

Странно ^_^ Они по идее стандартные.

Опубликовано
Борланд - это же, вроде, старая IDE, нет?

Борланд - это разная IDE. Точнее, это фирма, и она до сих пор жива -) Я тоже этот хреноту сейчас на Борланд Билдере писал, шестом емнип. Есть новее.

Алсо, рад вас видеть.

:lol:

Мать моя женщина ... Оно еще живо?

А что ему сделается? :D

Опубликовано (изменено)
А что ему сделается?

Да вроде как ДОС-стайл сейчас не в моде... Не менее странно наличие плюсового iostream'а с сишным conio.h

И что уж совсем непонятно - так то, что все это на Билдере, с его формочками.

Изменено пользователем niiro dzyaki (смотреть историю редактирования)
Опубликовано (изменено)

Console Wizard - и фпирёд. Учат-то обычно на консоли, с формочками не заморачиваются.

Не менее странно наличие плюсового iostream'а с сишным conio.h

Ну дык С++ жеж включает C со всеми потрохами. Можно пользоваться.

Изменено пользователем Shinsaku-To (смотреть историю редактирования)
Опубликовано
Console Wizard - и фпирёд. Учат-то обычно на консоли

Ну так и учили бы нормально, через стримы, что бы логику конвееризации понимать. А conio.h - это уровень интерфейса, а не программной логики. Смысл учить консольному интерфейсу в наше время мне глубоко неясен. Я понимаю еще на *nix'ах, где без иксов машина - нормальное явление, и консольный GUI имеет место быть, но там опять же curses/ncurses.

 

Ну дык С++ жеж включает C со всеми потрохами. Можно пользоваться.

А нужно ли? Вот и получилась неудобоваримая солянка из cout'ов и printf'ов.

Опубликовано (изменено)
Смысл учить консольному интерфейсу в наше время мне глубоко неясен.

Смысл в том, что ему и учить не надо - студент уже его понимает на основе Pascal.

В любом случае, какой-то интерфейс знать надо, а визуальный только отвлекает новичка от собственно программирования.

А нужно ли? Вот и получилась неудобоваримая солянка из cout'ов и printf'ов.

Может и не нужно. Тяга к printf у преподов меня самого всегда удивляла. -)

Кстати, если склероз мне таки не изменяет, то к coniо.h printf отношения не имеет. conio это очень удобный в консоли getch() и, в данном случае, gotoxy(int,int) и wherey(), чтобы по экрану для отрисовки матрицы ездить.

Изменено пользователем Shinsaku-To (смотреть историю редактирования)
Опубликовано
Кстати, если склероз мне таки не изменяет, то к coniо.h printf отношения не имеет

printf - это из stdio, что тоже тут нафиг не сдалось. Как и gotoxy (форматировать и cout умеет).

 

 

В любом случае, какой-то интерфейс знать надо, а визуальный только отвлекает новичка от собственно программирования.
студент уже его понимает на основе Pascal.

Это уже как бы не новичок, значит. А кинуть TStringGrid на форму и по Cells циферки распихать особого труда не надо. Зато сразу "красива, как в Экселе", +100 к ЧСВ.

Опубликовано
Это уже как бы не новичок, значит.

Как бы обучение - его надо последовательно строить. Когда народ подгребает к С++ - значит, что на очереди ООП. Следовательно, нужно переходить именно к ООП, не отвлекаясь особо на другие темы. Значит - сишный синтаксис переживали, знакомый интерфейс вспомнили - и вперёд на штурм классов и прочего полиморфизма. Далее - для работы с формами и кидания ТСтрингГридов ООП уже понимать надо. Можно, конечно, и без понимания кинуть - но это не есть гуд. Уж коли готовят профессионала, то надо, чтобы он осознавал происходящие процессы.

Отсюда последовательность изучения и вырисовывается.

Опубликовано
Следовательно, нужно переходить именно к ООП, не отвлекаясь особо на другие темы.

Во-во. Т.е. стримы и операторы, а не gotoxy c printf'ами.

 

Значит - сишный синтаксис переживали, знакомый интерфейс вспомнили - и вперёд на штурм классов и прочего полиморфизма.

Ага, в результате в мозгу каша от использования двух парадигм. Один из плюсов Борланда (он же главный минус, такая диалектика) - это то, что ООП можно использовать, не понимая.

 

Уж коли готовят профессионала, то надо, чтобы он осознавал происходящие процессы.

Вообще-то, препода, принимающего подобный код, я бы к подготовке профессионалов и близко не подпускал, во избежание. Для не-математического факультета и студента, кторый хочет сдать и забыть это чертово программирование, это еще прокатит, но на профильном это недопустимо. Т.е. если для топикстартера это допустимо, то MAKCMX стоит задуматься о профпригодности.

Опубликовано

В общем, вот, православный код:

 

#include <iostream>
#include <iomanip>
#include <math>

using namespace std;

const int
 CTABLE_WIDTH=10,
 CMATRIX_DIM=10;

int input_matrix(double matrix[][CTABLE_WIDTH], int dim) {
 int x,y;

 for (x=0; x<dim; x++)
for (y=0; y<dim; y++)  {
  cout << "A[" << x << ", " << y <<"]=";
  cin >> matrix[x][y];
 }
 return 0;
}

int draw_matrix(double matrix[][CTABLE_WIDTH], int dim) {
 int x,y;

 for (x=0; x<dim; x++) {
for (y=0; y<dim; y++)
  cout << setw(CTABLE_WIDTH) << matrix[x][y];
cout << endl;
 }
 return 0;
}

int reduce_matrix(double matrix_in[][CTABLE_WIDTH], double matrix_out[][CTABLE_WIDTH], int dim, int &max_x, int &max_y) {
 int x, y, x1, y1;
 double max=0;

 for (x=0; x<dim; x++)
for (y=0; y<dim; y++)  
  if (fabs(matrix_in[x][y])>max) {
	max = fabs(matrix_in[x][y]);
	max_x = x;
	max_y = y;
  }
 
 x1=0;
 for (x=0; x<dim; x++) if (max_x!=x) {
y1=0;
for (y=0; y<dim; y++) if (max_y!=y) {
  matrix_out[x1][y1]=matrix_in[x][y];
  y1++;
}
x1++; 
 }

 return 0;
}

int main () {
 double matrix_in[CTABLE_WIDTH][CTABLE_WIDTH], matrix_out[CTABLE_WIDTH][CTABLE_WIDTH];
 int dim=0, max_x=0, max_y=0;

 cout << "Dim=";
 cin >> dim;
 if ((dim<0) || (dim>CMATRIX_DIM)) {
cerr << "ERROR: dim is out of range";
return 1;
 }
 input_matrix(matrix_in, dim);
 reduce_matrix(matrix_in, matrix_out, dim, max_x, max_y);
 cout << "deleted row: " << max_y << endl;
 cout << "deleted col: " << max_x << endl;
 cout << "result:" << endl;
 draw_matrix(matrix_out, dim-1);

 return 0;
}

Опубликовано
draw_matrix(matrix_out, dim-1);

 

return 0;

}

Кстати, кстати… Если действительно не нужно гасить консоль после вывода шматрицы, можно использовать тот же getch(), только более православный: std::cin.get();

Вроде так, лет пять прошло, могу и наврать. Но насколько я помню, для студентов это было головной болью.

Опубликовано (изменено)
В общем, вот, православный код:

Который выполняет мессионерскую деятельность B)

Конечно, лучше писать в хорошем стиле, но не всё сразу. Первым пунктом надо просто научиться решать задачи хоть как-нибудь, вторым - решать их по-разному, а там уже можно обратить внимание на стиль и полировать его хоть до посинения. А MAKCMX, боюсь, от твоего кода впадёт в когнитивный диссонанс. Он ещё и первый пункт (решать хоть как-нибудь), похоже, не освоил =__=

Изменено пользователем Shinsaku-To (смотреть историю редактирования)
Опубликовано
Кстати, кстати… Если действительно не нужно гасить консоль после вывода шматрицы, можно использовать тот же getch(), только более православный: std::cin.get();

А шо, в винде IDE всякие вывод разве в отдельном окне не показывают? Только исчезающая консоль, что ли?

 

Какой же он православный? Комментарии де?

Для такой задачи? Хватит кода, "грамотный код - лучший комментарий" © не помню кто

 

Первым пунктом надо просто научиться решать задачи хоть как-нибудь

На чем останавливаются и становятся индусами :)

 

а там уже можно обратить внимание на стиль и полировать его хоть до посинения

Не-не-не, Дэ^W учится всегда проще, чем переучиваться. Так что, раз уж препод - лапоть, то по книженции какой поправославнее самому заниматься, с самого начала стараясь правильно писать. Получатся будет, конечно, по первости не очень, но "опыт, сын ошибок трудных" © И идти по проторенному пути - свой hello word -> свой Notepad -> свой Тетрис -> свой quake -> свой вирус :)

 

P.S. Почему никто косяк в коде не заметил? Я не ту константу при задании размеров массивов не использую... Промахнулся при копипасте, каюсь, сколько раз умные люди говорили - копипаста зло, вон, даже ООП придумали, чтоб реюзать код без копипастирования.

P.P.S. И если уж совсем довести до уровня электролита из соплей девственницы, то элементарные операции с матрицами (поиск наибольшего, удаление строки, удаление столбца) надо вывести из тела reduce_matrix, лучше вообще в другой файл, да и main почистить.

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...

Важная информация