Lunatofob Опубликовано 22 января, 2009 Жалоба Опубликовано 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;} Помоги ближнему и будет тебе счастье =) Цитата
Shinsaku-To Опубликовано 22 января, 2009 Жалоба Опубликовано 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; } А, новую матрицу не рисует похоже. Да и старую кривовато выводит. Цитата
Lunatofob Опубликовано 22 января, 2009 Автор Жалоба Опубликовано 22 января, 2009 (изменено) Вот это и надо исправить, как исправить, что бы он корректно старую матрицу выводил и новую рисовал.Только вот как это сделать мне неизвестно. Изменено 22 января, 2009 пользователем Lunatofob (смотреть историю редактирования) Цитата
Shinsaku-To Опубликовано 22 января, 2009 Жалоба Опубликовано 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 перегнать. Если препод спрашивать будет - прикидывайся табуреткой и говори "что за типлэйт такой знать не знаю, из инета скачал штоб матрицу красиво отформатировать" -) Цитата
Lunatofob Опубликовано 22 января, 2009 Автор Жалоба Опубликовано 22 января, 2009 Большое тебе спасибо! от меня и МАКСМХ`а =) он на програмиста учиться, я экономист =)))Еще раз Большое спасибо! Цитата
MAKCMX Опубликовано 22 января, 2009 Жалоба Опубликовано 22 января, 2009 (изменено) #include <string>#include <sstream>Борланд который в инсте, не распознает эти библиотеки =( нужно как то без нних Изменено 22 января, 2009 пользователем MAKCMX (смотреть историю редактирования) Цитата
MAKCMX Опубликовано 22 января, 2009 Жалоба Опубликовано 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;} Цитата
Shinsaku-To Опубликовано 22 января, 2009 Жалоба Опубликовано 22 января, 2009 Угу, работает. Но в этом случае, если числа разной длины, то матрица разъезжается, плюс идёт округление до десятых, которое непонятно зачем. Если выводить через cout << никакого округления не будет. И какой смысл в выносе сборки нового массива в отдельную функцию? Борланд который в инсте, не распознает эти библиотеки =( нужно как то без ннихСтранно ^_^ Они по идее стандартные. Цитата
Кuu Опубликовано 22 января, 2009 Жалоба Опубликовано 22 января, 2009 Странно huh.gif Они по идее стандартные.Борланд - это же, вроде, старая IDE, нет? Алсо, рад вас видеть. Цитата
MAKCMX Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 да пофиг, главное что работает, а к мелочам надеюсь препод придраться не будет. Цитата
niiro dzyaki Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 #include <conio.h>Мать моя женщина ... Оно еще живо? Они по идее стандартные.Возможно, поведение в отношении наличия .h другое, не по стандарту. Цитата
Shinsaku-To Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 Борланд - это же, вроде, старая IDE, нет?Борланд - это разная IDE. Точнее, это фирма, и она до сих пор жива -) Я тоже этот хреноту сейчас на Борланд Билдере писал, шестом емнип. Есть новее.Алсо, рад вас видеть.:lol:Мать моя женщина ... Оно еще живо?А что ему сделается? :D Цитата
niiro dzyaki Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 (изменено) А что ему сделается?Да вроде как ДОС-стайл сейчас не в моде... Не менее странно наличие плюсового iostream'а с сишным conio.hИ что уж совсем непонятно - так то, что все это на Билдере, с его формочками. Изменено 23 января, 2009 пользователем niiro dzyaki (смотреть историю редактирования) Цитата
Shinsaku-To Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 (изменено) Console Wizard - и фпирёд. Учат-то обычно на консоли, с формочками не заморачиваются.Не менее странно наличие плюсового iostream'а с сишным conio.hНу дык С++ жеж включает C со всеми потрохами. Можно пользоваться. Изменено 23 января, 2009 пользователем Shinsaku-To (смотреть историю редактирования) Цитата
niiro dzyaki Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 Console Wizard - и фпирёд. Учат-то обычно на консолиНу так и учили бы нормально, через стримы, что бы логику конвееризации понимать. А conio.h - это уровень интерфейса, а не программной логики. Смысл учить консольному интерфейсу в наше время мне глубоко неясен. Я понимаю еще на *nix'ах, где без иксов машина - нормальное явление, и консольный GUI имеет место быть, но там опять же curses/ncurses. Ну дык С++ жеж включает C со всеми потрохами. Можно пользоваться.А нужно ли? Вот и получилась неудобоваримая солянка из cout'ов и printf'ов. Цитата
Shinsaku-To Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 (изменено) Смысл учить консольному интерфейсу в наше время мне глубоко неясен.Смысл в том, что ему и учить не надо - студент уже его понимает на основе Pascal. В любом случае, какой-то интерфейс знать надо, а визуальный только отвлекает новичка от собственно программирования.А нужно ли? Вот и получилась неудобоваримая солянка из cout'ов и printf'ов.Может и не нужно. Тяга к printf у преподов меня самого всегда удивляла. -)Кстати, если склероз мне таки не изменяет, то к coniо.h printf отношения не имеет. conio это очень удобный в консоли getch() и, в данном случае, gotoxy(int,int) и wherey(), чтобы по экрану для отрисовки матрицы ездить. Изменено 23 января, 2009 пользователем Shinsaku-To (смотреть историю редактирования) Цитата
niiro dzyaki Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 Кстати, если склероз мне таки не изменяет, то к coniо.h printf отношения не имеетprintf - это из stdio, что тоже тут нафиг не сдалось. Как и gotoxy (форматировать и cout умеет). В любом случае, какой-то интерфейс знать надо, а визуальный только отвлекает новичка от собственно программирования.студент уже его понимает на основе Pascal.Это уже как бы не новичок, значит. А кинуть TStringGrid на форму и по Cells циферки распихать особого труда не надо. Зато сразу "красива, как в Экселе", +100 к ЧСВ. Цитата
Shinsaku-To Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 Это уже как бы не новичок, значит.Как бы обучение - его надо последовательно строить. Когда народ подгребает к С++ - значит, что на очереди ООП. Следовательно, нужно переходить именно к ООП, не отвлекаясь особо на другие темы. Значит - сишный синтаксис переживали, знакомый интерфейс вспомнили - и вперёд на штурм классов и прочего полиморфизма. Далее - для работы с формами и кидания ТСтрингГридов ООП уже понимать надо. Можно, конечно, и без понимания кинуть - но это не есть гуд. Уж коли готовят профессионала, то надо, чтобы он осознавал происходящие процессы.Отсюда последовательность изучения и вырисовывается. Цитата
niiro dzyaki Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 Следовательно, нужно переходить именно к ООП, не отвлекаясь особо на другие темы.Во-во. Т.е. стримы и операторы, а не gotoxy c printf'ами. Значит - сишный синтаксис переживали, знакомый интерфейс вспомнили - и вперёд на штурм классов и прочего полиморфизма.Ага, в результате в мозгу каша от использования двух парадигм. Один из плюсов Борланда (он же главный минус, такая диалектика) - это то, что ООП можно использовать, не понимая. Уж коли готовят профессионала, то надо, чтобы он осознавал происходящие процессы.Вообще-то, препода, принимающего подобный код, я бы к подготовке профессионалов и близко не подпускал, во избежание. Для не-математического факультета и студента, кторый хочет сдать и забыть это чертово программирование, это еще прокатит, но на профильном это недопустимо. Т.е. если для топикстартера это допустимо, то MAKCMX стоит задуматься о профпригодности. Цитата
niiro dzyaki Опубликовано 23 января, 2009 Жалоба Опубликовано 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; } Цитата
Кuu Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 niiro dzyakiправославный код:Какой же он православный? Комментарии де? Цитата
Напротив Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 draw_matrix(matrix_out, dim-1); return 0;}Кстати, кстати… Если действительно не нужно гасить консоль после вывода шматрицы, можно использовать тот же getch(), только более православный: std::cin.get();Вроде так, лет пять прошло, могу и наврать. Но насколько я помню, для студентов это было головной болью. Цитата
Chemist Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 Может вы тему переименуете в "коды"... а то написано сессия, а у меня глаза разбегаются от кодов... биохимики дальше Вижл Бейсика не залезают по программе))) Цитата
Shinsaku-To Опубликовано 23 января, 2009 Жалоба Опубликовано 23 января, 2009 (изменено) В общем, вот, православный код:Который выполняет мессионерскую деятельность B)Конечно, лучше писать в хорошем стиле, но не всё сразу. Первым пунктом надо просто научиться решать задачи хоть как-нибудь, вторым - решать их по-разному, а там уже можно обратить внимание на стиль и полировать его хоть до посинения. А MAKCMX, боюсь, от твоего кода впадёт в когнитивный диссонанс. Он ещё и первый пункт (решать хоть как-нибудь), похоже, не освоил =__= Изменено 23 января, 2009 пользователем Shinsaku-To (смотреть историю редактирования) Цитата
niiro dzyaki Опубликовано 24 января, 2009 Жалоба Опубликовано 24 января, 2009 Кстати, кстати… Если действительно не нужно гасить консоль после вывода шматрицы, можно использовать тот же getch(), только более православный: std::cin.get();А шо, в винде IDE всякие вывод разве в отдельном окне не показывают? Только исчезающая консоль, что ли? Какой же он православный? Комментарии де?Для такой задачи? Хватит кода, "грамотный код - лучший комментарий" © не помню кто Первым пунктом надо просто научиться решать задачи хоть как-нибудьНа чем останавливаются и становятся индусами :) а там уже можно обратить внимание на стиль и полировать его хоть до посиненияНе-не-не, Дэ^W учится всегда проще, чем переучиваться. Так что, раз уж препод - лапоть, то по книженции какой поправославнее самому заниматься, с самого начала стараясь правильно писать. Получатся будет, конечно, по первости не очень, но "опыт, сын ошибок трудных" © И идти по проторенному пути - свой hello word -> свой Notepad -> свой Тетрис -> свой quake -> свой вирус :) P.S. Почему никто косяк в коде не заметил? Я не ту константу при задании размеров массивов не использую... Промахнулся при копипасте, каюсь, сколько раз умные люди говорили - копипаста зло, вон, даже ООП придумали, чтоб реюзать код без копипастирования. P.P.S. И если уж совсем довести до уровня электролита из соплей девственницы, то элементарные операции с матрицами (поиск наибольшего, удаление строки, удаление столбца) надо вывести из тела reduce_matrix, лучше вообще в другой файл, да и main почистить. Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.