Lunatofob Posted January 22, 2009 Report Posted January 22, 2009 И так, тем создана для помощи студентам при здачи сессии, пишите сюда свои задачи, что нужно найти, и что не понятно, думаю добрые люди не откажут и помогут.Лично я помогу все, у кого проблемы по дисциплинам: Менеджмент, Долгосрочное планирование, Краткосрочное планирование, Бухгалтерский учет, Финансы и кредит, ДОУ. (кому нужна помощь пишите) Ну а теперь вопрос к програмистам, как решить вот эту задачу, точнее решение есть, но нужно его подкорректировать =) Экзаменационный билет №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;} Помоги ближнему и будет тебе счастье =) Quote
Shinsaku-To Posted January 22, 2009 Report Posted January 22, 2009 В каком смысле подкорректировать? Код работает. Оформлен только криво. #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; } А, новую матрицу не рисует похоже. Да и старую кривовато выводит. Quote
Lunatofob Posted January 22, 2009 Author Report Posted January 22, 2009 (edited) Вот это и надо исправить, как исправить, что бы он корректно старую матрицу выводил и новую рисовал.Только вот как это сделать мне неизвестно. Edited January 22, 2009 by Lunatofob (see edit history) Quote
Shinsaku-To Posted January 22, 2009 Report Posted January 22, 2009 Где-то так получилось: #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 перегнать. Если препод спрашивать будет - прикидывайся табуреткой и говори "что за типлэйт такой знать не знаю, из инета скачал штоб матрицу красиво отформатировать" -) Quote
Lunatofob Posted January 22, 2009 Author Report Posted January 22, 2009 Большое тебе спасибо! от меня и МАКСМХ`а =) он на програмиста учиться, я экономист =)))Еще раз Большое спасибо! Quote
MAKCMX Posted January 22, 2009 Report Posted January 22, 2009 (edited) #include <string>#include <sstream>Борланд который в инсте, не распознает эти библиотеки =( нужно как то без нних Edited January 22, 2009 by MAKCMX (see edit history) Quote
MAKCMX Posted January 22, 2009 Report Posted January 22, 2009 во все всем спс вро разобрался по идее так:#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;} Quote
Shinsaku-To Posted January 22, 2009 Report Posted January 22, 2009 Угу, работает. Но в этом случае, если числа разной длины, то матрица разъезжается, плюс идёт округление до десятых, которое непонятно зачем. Если выводить через cout << никакого округления не будет. И какой смысл в выносе сборки нового массива в отдельную функцию? Борланд который в инсте, не распознает эти библиотеки =( нужно как то без ннихСтранно ^_^ Они по идее стандартные. Quote
Кuu Posted January 22, 2009 Report Posted January 22, 2009 Странно huh.gif Они по идее стандартные.Борланд - это же, вроде, старая IDE, нет? Алсо, рад вас видеть. Quote
MAKCMX Posted January 23, 2009 Report Posted January 23, 2009 да пофиг, главное что работает, а к мелочам надеюсь препод придраться не будет. Quote
niiro dzyaki Posted January 23, 2009 Report Posted January 23, 2009 #include <conio.h>Мать моя женщина ... Оно еще живо? Они по идее стандартные.Возможно, поведение в отношении наличия .h другое, не по стандарту. Quote
Shinsaku-To Posted January 23, 2009 Report Posted January 23, 2009 Борланд - это же, вроде, старая IDE, нет?Борланд - это разная IDE. Точнее, это фирма, и она до сих пор жива -) Я тоже этот хреноту сейчас на Борланд Билдере писал, шестом емнип. Есть новее.Алсо, рад вас видеть.:lol:Мать моя женщина ... Оно еще живо?А что ему сделается? :D Quote
niiro dzyaki Posted January 23, 2009 Report Posted January 23, 2009 (edited) А что ему сделается?Да вроде как ДОС-стайл сейчас не в моде... Не менее странно наличие плюсового iostream'а с сишным conio.hИ что уж совсем непонятно - так то, что все это на Билдере, с его формочками. Edited January 23, 2009 by niiro dzyaki (see edit history) Quote
Shinsaku-To Posted January 23, 2009 Report Posted January 23, 2009 (edited) Console Wizard - и фпирёд. Учат-то обычно на консоли, с формочками не заморачиваются.Не менее странно наличие плюсового iostream'а с сишным conio.hНу дык С++ жеж включает C со всеми потрохами. Можно пользоваться. Edited January 23, 2009 by Shinsaku-To (see edit history) Quote
niiro dzyaki Posted January 23, 2009 Report Posted January 23, 2009 Console Wizard - и фпирёд. Учат-то обычно на консолиНу так и учили бы нормально, через стримы, что бы логику конвееризации понимать. А conio.h - это уровень интерфейса, а не программной логики. Смысл учить консольному интерфейсу в наше время мне глубоко неясен. Я понимаю еще на *nix'ах, где без иксов машина - нормальное явление, и консольный GUI имеет место быть, но там опять же curses/ncurses. Ну дык С++ жеж включает C со всеми потрохами. Можно пользоваться.А нужно ли? Вот и получилась неудобоваримая солянка из cout'ов и printf'ов. Quote
Shinsaku-To Posted January 23, 2009 Report Posted January 23, 2009 (edited) Смысл учить консольному интерфейсу в наше время мне глубоко неясен.Смысл в том, что ему и учить не надо - студент уже его понимает на основе Pascal. В любом случае, какой-то интерфейс знать надо, а визуальный только отвлекает новичка от собственно программирования.А нужно ли? Вот и получилась неудобоваримая солянка из cout'ов и printf'ов.Может и не нужно. Тяга к printf у преподов меня самого всегда удивляла. -)Кстати, если склероз мне таки не изменяет, то к coniо.h printf отношения не имеет. conio это очень удобный в консоли getch() и, в данном случае, gotoxy(int,int) и wherey(), чтобы по экрану для отрисовки матрицы ездить. Edited January 23, 2009 by Shinsaku-To (see edit history) Quote
niiro dzyaki Posted January 23, 2009 Report Posted January 23, 2009 Кстати, если склероз мне таки не изменяет, то к coniо.h printf отношения не имеетprintf - это из stdio, что тоже тут нафиг не сдалось. Как и gotoxy (форматировать и cout умеет). В любом случае, какой-то интерфейс знать надо, а визуальный только отвлекает новичка от собственно программирования.студент уже его понимает на основе Pascal.Это уже как бы не новичок, значит. А кинуть TStringGrid на форму и по Cells циферки распихать особого труда не надо. Зато сразу "красива, как в Экселе", +100 к ЧСВ. Quote
Shinsaku-To Posted January 23, 2009 Report Posted January 23, 2009 Это уже как бы не новичок, значит.Как бы обучение - его надо последовательно строить. Когда народ подгребает к С++ - значит, что на очереди ООП. Следовательно, нужно переходить именно к ООП, не отвлекаясь особо на другие темы. Значит - сишный синтаксис переживали, знакомый интерфейс вспомнили - и вперёд на штурм классов и прочего полиморфизма. Далее - для работы с формами и кидания ТСтрингГридов ООП уже понимать надо. Можно, конечно, и без понимания кинуть - но это не есть гуд. Уж коли готовят профессионала, то надо, чтобы он осознавал происходящие процессы.Отсюда последовательность изучения и вырисовывается. Quote
niiro dzyaki Posted January 23, 2009 Report Posted January 23, 2009 Следовательно, нужно переходить именно к ООП, не отвлекаясь особо на другие темы.Во-во. Т.е. стримы и операторы, а не gotoxy c printf'ами. Значит - сишный синтаксис переживали, знакомый интерфейс вспомнили - и вперёд на штурм классов и прочего полиморфизма.Ага, в результате в мозгу каша от использования двух парадигм. Один из плюсов Борланда (он же главный минус, такая диалектика) - это то, что ООП можно использовать, не понимая. Уж коли готовят профессионала, то надо, чтобы он осознавал происходящие процессы.Вообще-то, препода, принимающего подобный код, я бы к подготовке профессионалов и близко не подпускал, во избежание. Для не-математического факультета и студента, кторый хочет сдать и забыть это чертово программирование, это еще прокатит, но на профильном это недопустимо. Т.е. если для топикстартера это допустимо, то MAKCMX стоит задуматься о профпригодности. Quote
niiro dzyaki Posted January 23, 2009 Report Posted January 23, 2009 В общем, вот, православный код: #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; } Quote
Кuu Posted January 23, 2009 Report Posted January 23, 2009 niiro dzyakiправославный код:Какой же он православный? Комментарии де? Quote
Напротив Posted January 23, 2009 Report Posted January 23, 2009 draw_matrix(matrix_out, dim-1); return 0;}Кстати, кстати… Если действительно не нужно гасить консоль после вывода шматрицы, можно использовать тот же getch(), только более православный: std::cin.get();Вроде так, лет пять прошло, могу и наврать. Но насколько я помню, для студентов это было головной болью. Quote
Chemist Posted January 23, 2009 Report Posted January 23, 2009 Может вы тему переименуете в "коды"... а то написано сессия, а у меня глаза разбегаются от кодов... биохимики дальше Вижл Бейсика не залезают по программе))) Quote
Shinsaku-To Posted January 23, 2009 Report Posted January 23, 2009 (edited) В общем, вот, православный код:Который выполняет мессионерскую деятельность B)Конечно, лучше писать в хорошем стиле, но не всё сразу. Первым пунктом надо просто научиться решать задачи хоть как-нибудь, вторым - решать их по-разному, а там уже можно обратить внимание на стиль и полировать его хоть до посинения. А MAKCMX, боюсь, от твоего кода впадёт в когнитивный диссонанс. Он ещё и первый пункт (решать хоть как-нибудь), похоже, не освоил =__= Edited January 23, 2009 by Shinsaku-To (see edit history) Quote
niiro dzyaki Posted January 24, 2009 Report Posted January 24, 2009 Кстати, кстати… Если действительно не нужно гасить консоль после вывода шматрицы, можно использовать тот же getch(), только более православный: std::cin.get();А шо, в винде IDE всякие вывод разве в отдельном окне не показывают? Только исчезающая консоль, что ли? Какой же он православный? Комментарии де?Для такой задачи? Хватит кода, "грамотный код - лучший комментарий" © не помню кто Первым пунктом надо просто научиться решать задачи хоть как-нибудьНа чем останавливаются и становятся индусами :) а там уже можно обратить внимание на стиль и полировать его хоть до посиненияНе-не-не, Дэ^W учится всегда проще, чем переучиваться. Так что, раз уж препод - лапоть, то по книженции какой поправославнее самому заниматься, с самого начала стараясь правильно писать. Получатся будет, конечно, по первости не очень, но "опыт, сын ошибок трудных" © И идти по проторенному пути - свой hello word -> свой Notepad -> свой Тетрис -> свой quake -> свой вирус :) P.S. Почему никто косяк в коде не заметил? Я не ту константу при задании размеров массивов не использую... Промахнулся при копипасте, каюсь, сколько раз умные люди говорили - копипаста зло, вон, даже ООП придумали, чтоб реюзать код без копипастирования. P.P.S. И если уж совсем довести до уровня электролита из соплей девственницы, то элементарные операции с матрицами (поиск наибольшего, удаление строки, удаление столбца) надо вывести из тела reduce_matrix, лучше вообще в другой файл, да и main почистить. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.