| 
			| 
					
						| CAHTA 
								Гость
 | 
								|  | «  : 14-09-2005 23:00 »  |  | 
 
 эта прога транспонирует матрицу. ишет максимальные элементы в столбцах. и выводит диограмму с ними. входной файл: ( первая строка - это размер матрицы ) 12 124 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. Ты именно так память заказывал. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |