CAHTA
Гость
|
|
« : 14-09-2005 23:00 » |
|
эта прога транспонирует матрицу. ишет максимальные элементы в столбцах. и выводит диограмму с ними. входной файл: ( первая строка - это размер матрицы ) 12 12 4 5 5 8 5 3 5 9 4 2 5 8 6 8 4 5 7 9 8 4 2 2 5 8 4 0 7 1 1 3 1 0 5 1 5 9 8 2 9 5 0 6 2 3 9 1 2 3 5 8 9 2 4 7 2 9 7 1 4 7 5 9 7 2 0 1 6 4 9 5 9 6 4 5 5 8 5 3 5 9 4 1 7 8 6 8 4 5 7 9 8 4 2 2 6 9 1 2 3 5 5 5 5 5 5 3 1 7 8 2 9 5 0 6 2 3 9 2 9 1 5 8 9 2 4 7 2 9 7 0 0 0 5 9 7 2 0 1 6 4 9 0 0 0
Сама прога #include <stdio.h> #include <stdlib.h>
int countI, countJ; int I, J, n;
int **At, *max, **arr, **graf_arr;
int ci,cj,max_arr; int U,str,stl, F,FF, ch_vvod; FILE *in_file;
void main (void) {
puts("\n 1-KLABA 2-FILE;"); scanf("%i",&ch_vvod);
switch(ch_vvod) { case 1: { puts("Vvod s Klabu\n"); printf("i,y:"); scanf("%i %i",&str,&stl); break; } case 2: { puts("Vvod iz faila"); if((in_file=fopen("prakt.txt","r"))==NULL) { puts("\nError opening file\n\n"); return 0; } fscanf(in_file,"%i",&str); fscanf(in_file,"%i",&stl); printf("\n-----------------------------------"); printf("\ni=%i, j=%i\n",str,stl); break; } default: break; }
/*-----[ Выделение памяти под исходную матрицу arr, размера str*stl ]-----*/ arr=(int **)calloc(str,sizeof(int*)); if(arr == NULL) puts("Memory allocation failed"); for( U = 0 ; U < str ; U++ ) arr[U] = (int*)calloc(stl,sizeof(int)); /*-----[ выделение памяти под транспонированную матрицу At, размером stl*str ]-----*/ At=(int **)calloc(stl,sizeof(int*)); if(At == NULL) puts("Memory allocation failed"); for( U = 0 ; U < stl ; U++ ) At[U] = (int*)calloc(str,sizeof(int)); /*-----[ выделение памяти под массив максимальных эл-тов, размером str ]-----*/ max=(int*)calloc(str,sizeof(int));
switch(ch_vvod) { case 1: { for ( F = 0;F < str ; F++) for ( FF = 0; FF < stl; FF++) scanf("%i",&arr[F][FF]); break; } case 2: { for ( F = 0;F < str ; F++) for ( FF = 0; FF < stl; FF++) fscanf(in_file,"%i",&arr[F][FF]); break; } }
/*-----[ нахождение максимального эл-та в строке]-----*/ for ( I = 0 ; I < str ; I++ ) { max[I] = arr[I][0]; for ( J = 0 ; J < stl ; J++ ) if ( max[I] < arr[I][J+1] ) max[I] = arr[I][J+1]; } printf("-----------------------------------\n");
/*-----[Вывод исходной матрицы ]-----*/ for ( countI = 0;countI < str ; countI++) { printf("\n"); for ( countJ = 0; countJ < stl; countJ++) printf("%i ", arr[countI][countJ]);
} printf("\n-----------------------------------\n\n");
/*-----[ транспонирование матрицы]-----*/ for ( countI = 0;countI < str ; countI++) for ( countJ = 0; countJ < stl; countJ++) At[countI][countJ] = arr[countI][countJ];
/*-----[ Вывод транспонированной матрицы ]-----*/ for ( countI = 0;countI < stl ; countI++) { printf("\n"); for ( countJ = 0; countJ < str; countJ++) printf("%i ", At[countJ][countI]);
}
printf("\n-----------------------------------\n\n");
for ( I = 0 ; I < str ; I++ ) { max_arr = 0; if ( max_arr < max[I] ) max_arr = max[I]; } printf("\n\nmax_arr = %i\n",max_arr);
ci = str; cj = max_arr;
graf_arr=(int **)calloc(cj,sizeof(int*)); if(arr == NULL) puts("Memory allocation failed"); for( U = 0 ; U < cj ; U++ ) graf_arr[U] = (int*)calloc(ci,sizeof(int));
for( I = 0 ; I < ci ; I++ ) printf("\nmax[%i] = %i\t",I,max[I]);
printf("\n\nci=%i\ncj=%i",ci,cj);
getchar(); getchar();
for( I = 0 ; I < ci ; I++ ) { printf("\n");
for ( J = 0; J < max[I]; J++ ) graf_arr[J][I] = '*';
for ( J = max[I]; J < max_arr ; J++ ) graf_arr[J][I] = '\x20'; }
getchar(); getchar();
for( I = cj-1 ; I > -1; I-- ) { printf("\n");
for ( J = 0; J < ci; J++ ) printf("%c",graf_arr[I][J]); }
getchar(); getchar(); }
Помогите пожалуста. программа ведет себя нормально при размере входной матрицы до 8х8. дальше проблемы с построением диограммы. а если взять матрицу 12х12 ( которую, я тут и привел ) то начинает неправильно считать максимальный эл. ( как я понял изза этого дальнейшие расчеты и построения и идут крива
|
|
« Последнее редактирование: 19-12-2007 19:53 от Алексей1153++ »
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #1 : 15-09-2005 08:38 » |
|
/*-----[ нахождение максимального эл-та в строке]-----*/ for ( I = 0 ; I < str ; I++ ) { max[I] = arr[I][0]; for ( J = 0 ; J < stl ; J++ ) if ( max[I] < arr[I][J+1] ) max[I] = arr[I][J+1]; } printf("-----------------------------------\n");
здесь по-моему выход за пределы матрицы. так не заработает?: /*-----[ нахождение максимального эл-та в строке]-----*/ for ( I = 0 ; I < str ; I++ ) { max[I] = arr[I][0]; for ( J = 0 ; J < stl-1 ; J++ ) if ( max[I] < arr[I][J+1] ) max[I] = arr[I][J+1]; } printf("-----------------------------------\n");
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
CAHTA
Гость
|
|
« Ответ #2 : 15-09-2005 09:52 » |
|
ыы. точняк! спс. ток почему раньше все нормально считал?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 15-09-2005 10:01 » |
|
наверное - (у тебя ищет максимальный э-т) - "левое" значение попадается такое, что сбивает логику.
|
|
|
Записан
|
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #4 : 15-09-2005 10:02 » |
|
Строго говоря, весь этот код будет работать только при неотрицательных значениях элементов матрицы. В противном случае будут проблемы.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 15-09-2005 10:04 » |
|
Diletant , с чего ты так решил ? int - тип со знаком int countI, countJ; int I, J, n; int **At, *max, **arr, **graf_arr; int ci,cj,max_arr; int U,str,stl, F,FF, ch_vvod;
|
|
|
Записан
|
|
|
|
CAHTA
Гость
|
|
« Ответ #6 : 15-09-2005 10:23 » |
|
Diletant, проблеммы возникают только с выводом диаграммы! Хотя это тоже можно исправить. поставить проверку при нахождении максим. эл-та. и если он отриц. то умнораем его на -1.
вот только как лучше делать лпаграмму? тоесть какого вида. и как оформлять отрицательные эл-ты ?
|
|
« Последнее редактирование: 15-09-2005 10:34 от CAHTA »
|
Записан
|
|
|
|
CAHTA
Гость
|
|
« Ответ #7 : 15-09-2005 10:26 » |
|
наверное - (у тебя ищет максимальный э-т) - "левое" значение попадается такое, что сбивает логику.
нене. PooH был прав! все исправил. и теперь все работает
|
|
|
Записан
|
|
|
|
CAHTA
Гость
|
|
« Ответ #8 : 15-09-2005 10:28 » |
|
Строго говоря, весь этот код будет работать только при неотрицательных значениях элементов матрицы. В противном случае будут проблемы.
а вот и нет работает даже если в нескольких строках входной матрицы все эл-ты отрицательны. или если по всей матрицы раскиданы отриц эл-ты.
|
|
|
Записан
|
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #9 : 15-09-2005 10:33 » |
|
Diletant , с чего ты так решил ? int - тип со знаком Потому что вот: for ( I = 0 ; I < str ; I++ ) { max_arr = 0; if ( max_arr < max[I] ) max_arr = max[I]; }
Да и проверку на положительность при считывании str и stl не мешало бы вставить.
|
|
|
Записан
|
|
|
|
CAHTA
Гость
|
|
« Ответ #10 : 15-09-2005 10:38 » |
|
Потому что вот: for ( I = 0 ; I < str ; I++ ) { max_arr = 0; if ( max_arr < max[I] ) max_arr = max[I]; }
Да и проверку на положительность при считывании str и stl не мешало бы вставить. хм. а зачем делать проверку на положительность при считывании str и stl. этож размер матрицы. который считывается из файла!
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 15-09-2005 10:41 » |
|
наверное - (у тебя ищет максимальный э-т) - "левое" значение попадается такое, что сбивает логику.
нене. PooH был прав! все исправил. и теперь все работает та я не про это! Ты говоришь - "Почему работало до 8" - вот про это я ----------- Diletant , понял
|
|
|
Записан
|
|
|
|
CAHTA
Гость
|
|
« Ответ #12 : 15-09-2005 10:47 » |
|
аа
|
|
|
Записан
|
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #13 : 15-09-2005 10:51 » |
|
хм. а зачем делать проверку на положительность при считывании str и stl. этож размер матрицы. который считывается из файла!
Именно поэтому. В файле может быть все что угодно. Или файл готовит некто, или нечто, что гарантировано не делает ошибок?
|
|
|
Записан
|
|
|
|
CAHTA
Гость
|
|
« Ответ #14 : 15-09-2005 10:55 » |
|
ну если еше учитывать всемирный заговор против человечества. то да! я сделаю эту проверку
|
|
|
Записан
|
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #15 : 15-09-2005 11:51 » |
|
Уважаемый, речь идет не о "всемирном заговоре против человечества", а о "правилах хорошего тона" в программировании. Обязательная проверка исходных данных в эти правила входит.
|
|
|
Записан
|
|
|
|
CAHTA
Гость
|
|
« Ответ #16 : 15-09-2005 16:04 » |
|
хм. может ктото заметил в коде. почему матрицы больше 9х9 вырубают прогу ? точнее чтото нето в транспонировании матрицы
|
|
« Последнее редактирование: 15-09-2005 16:08 от CAHTA »
|
Записан
|
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #17 : 16-09-2005 08:55 » |
|
Речь идет о квадратных матрицах? ИМХО, у тебя транспонированная матрица при выводе должна загибаться. Или по меньшей мере неправильно выводиться. Индексы переставлены. Вот здесь. /*-----[ Вывод транспонированной матрицы ]-----*/ for ( countI = 0;countI < stl ; countI++) { printf("\n"); for ( countJ = 0; countJ < str; countJ++) printf("%i ", At[countJ][countI]);
}
|
|
|
Записан
|
|
|
|
CAHTA
Гость
|
|
« Ответ #18 : 16-09-2005 14:19 » |
|
нее. выводятся правильно! т так задуманно! прога загибается када начинает Транспонировать! (см. код, там подписанно)
|
|
|
Записан
|
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #19 : 16-09-2005 16:09 » |
|
Там у тебя тоже наврато. Переставь индексы у At. В обоих случаях, у тебя первый индекс должен быть меньше stl, а не str. Ты именно так память заказывал.
|
|
|
Записан
|
|
|
|
|