Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите найти баг.  (Прочитано 21651 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
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
Глобальный модератор

ru
Offline 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 » 

ыы. точняк! спс. ток почему раньше все нормально считал?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 15-09-2005 10:01 » 

наверное - (у тебя ищет максимальный э-т) - "левое" значение попадается такое, что сбивает логику.
Записан

Diletant
Помогающий

de
Offline Offline

« Ответ #4 : 15-09-2005 10:02 » 

Строго говоря, весь этот код будет работать только при неотрицательных значениях элементов матрицы. В противном случае будут проблемы.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 15-09-2005 10:04 » new

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
Помогающий

de
Offline 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. этож размер матрицы. который считывается из файла!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 15-09-2005 10:41 » 

наверное - (у тебя ищет максимальный э-т) - "левое" значение попадается такое, что сбивает логику.

нене. PooH был прав! все исправил. и теперь все работает Улыбаюсь

та я не про это! Улыбаюсь Ты говоришь - "Почему работало до 8" - вот про это я

-----------
Diletant , понял Улыбаюсь
Записан

CAHTA
Гость
« Ответ #12 : 15-09-2005 10:47 » 

аа
Записан
Diletant
Помогающий

de
Offline Offline

« Ответ #13 : 15-09-2005 10:51 » 


хм. а зачем делать проверку на положительность при считывании str и stl. этож размер матрицы. который считывается из файла!

Именно поэтому. В файле может быть все что угодно. Или файл готовит некто, или нечто, что гарантировано не делает ошибок?
Записан
CAHTA
Гость
« Ответ #14 : 15-09-2005 10:55 » 

ну если еше учитывать всемирный заговор против человечества. то да! я сделаю эту проверку Улыбаюсь
Записан
Diletant
Помогающий

de
Offline Offline

« Ответ #15 : 15-09-2005 11:51 » 

Уважаемый, речь идет не о "всемирном заговоре против человечества", а о "правилах хорошего тона" в программировании. Обязательная проверка исходных данных в эти правила входит.
Записан
CAHTA
Гость
« Ответ #16 : 15-09-2005 16:04 » 

хм. может ктото заметил в коде. почему матрицы больше 9х9 вырубают прогу ?
точнее чтото нето в транспонировании матрицы
« Последнее редактирование: 15-09-2005 16:08 от CAHTA » Записан
Diletant
Помогающий

de
Offline 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
Помогающий

de
Offline Offline

« Ответ #19 : 16-09-2005 16:09 » 

Там у тебя тоже наврато. Переставь индексы у At. В обоих случаях, у тебя первый индекс должен быть меньше stl, а не str. Ты именно так память заказывал.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines