Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2011, 12:23   #1
ANutaStar
 
Регистрация: 12.12.2010
Сообщений: 4
По умолчанию Си. Максимальный элемент ромба элементов в квадратном массиве.

Задание: Создать функцию, определяющую максимальный элемент k-го слоя среднего наибольшего ромба элементов в квадратном массиве matrix[n][n] (n – нечетное). Номер слоя k задать с консоли.

Программу написала, но вот проблема: не всегда правильно высчитывает максимальный элемент; заметила, что это связано, когда макс.элемент находится в последней диагонали ромба... Но никак не могу понять, в чем именно ошиблась.
Пожалуйста, помогите найти ошибку и исправить ее.

Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int max_sloy_romb(int m, int c, int mass[c][c]);
void main()
 
{ 
        const int n=4;
        int massiv_min, massiv_max;
        int i,j,k,q,max;
        int massiv[n][n];       
        time_t t;
        srand((unsigned) time(&t));
        
printf("\n Vvedite min element massiva:");
scanf("%d", &massiv_min);
printf("\n Vvedite max element massiva:");
scanf("%d", &massiv_max);
printf("\n \n");
 
        for (i=0; i<=n; i++)
        {
                for (j=0; j<=n; j++)
                {
                        q=massiv_max-massiv_min+1;
                        massiv[i][j]=rand()%q+massiv_min;
                        printf("%5d", massiv[i][j]);            
                }
        printf("\n");
        }
        
        printf("\n Vvedite nomer sloya romda:");
        scanf("%d", &k);                
        max=max_sloy_romb(k-1, n, massiv);
        printf("\n Max element v %d-m sloe romba = %d",k,max);
}
                
int max_sloy_romb(int m, int c, int mass[c][c])
{
        int i, j;
        int max_element=mass[m][c/2];
        for (i=m; i<(c/2); i++)
                {               
                for (j=(c/2); j>m; j--)
                        {                       
                        if (mass[i][(c/2)-i+m]>max_element)
                        max_element=mass[i][(c/2)-i+m];
                        }
                }
                
                for (i=(c/2); i<c; i++)
                        {                       
                        for (j=m; j<(c/2); j++)
                                {
                                if (mass[i][i-(c/2)+m]>max_element)
                                max_element=mass[i][i-(c/2)+m];
                                }
                        } 
                        
                        for (i=(c-m); i>(c/2); i--)
                                {                               
                                for (j=(c/2); j<(c-m); j++)
                                        {
                                        if (mass[i][c+(c/2)-i-m]>max_element)
                                        max_element=mass[i][c+(c/2)-i-m];
                                        }
                                }
                                
                                for (i=(c/2); i>m; i--)
                                        {                       
                                        for (j=(c-m); j>(c/2); j--)
                                                {
                                                if (mass[i][i+(c/2)-m]>max_element)
                                                max_element=mass[i][i+(c/2)-m];                                         
                                                }                                                       
                                        }
                        
                        
                return max_element;
                                                
}
ANutaStar вне форума Ответить с цитированием
Старый 02.11.2011, 17:41   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Слои-то как идут? Горизонтально или вертикально?

Для начала, в main(), в циклах, в верхних пределах < вместо <= поставьте...
Vago вне форума Ответить с цитированием
Старый 02.11.2011, 19:42   #3
ANutaStar
 
Регистрация: 12.12.2010
Сообщений: 4
По умолчанию

Курсивом в матрце выделен первый слой ромба, жирным - второй и т.п.

6 5 6 0 8
9 6 5 5 3
5 7 9 8 8
3 3 4 4 1
2 6 2 5 8
ANutaStar вне форума Ответить с цитированием
Старый 02.11.2011, 20:30   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

#define N_MAX 50
#define DEBUG_PRINT 0


int max_sloy_romb( int layer, // Номер слоя, НУМЕРАЦМЯ С НУЛЯ!
                   int n ,       // Фактическая размерность матрицы
                   int mass[][N_MAX] ) {
        
   int   colLeft,      // Строки матрицы, которые пересекаются со слоем, имеют с ним...
         colRight,     // ...по 2 (самая верхняя и самая нижняя - по 1) точки пересечения.
         colCenter = n / 2 ,
         k0,            // min. номер строки (и столбца), ограничивающих ромб
         kF ,           // max. номер строки (и столбца), ограничивающих ромб
         max_element ,
         row ;          // Переменная цикла

   k0 = layer ;
   kF = n - layer - 1 ;
      
   max_element = mass[k0][colCenter] ;    // Начинаем с верхней вершины ромба
   colLeft = colRight = colCenter ;
   // "Сканируем" ромб строка за строкой      
   for ( row = k0+1; row <= kF; row++ ) {
      if (row <= colCenter ) {   // До половины...
         --colLeft ;             // ...всё шире...
         ++colRight ;            // ...и шире.
      } else {                   // Потом...
         ++colLeft ;             // ...всё Уже...
         --colRight ;            // ...и Уже.
      }
#if DEBUG_PRINT == 1
      printf( "[%d][%d] = %d ; [%d][%d] = %d\n", 
              row, colLeft, mass[row][colLeft], row, colRight, mass[row][colRight] ) ;
#endif         
      if ( mass[row][colLeft] > max_element )
         max_element = mass[row][colLeft] ;
      if ( mass[row][colRight] > max_element )
         max_element = mass[row][colRight] ;
   } 

   return max_element ;
                                                
}


int main() { 

   int massiv_min, massiv_max;
   int i,j,k,q,max,
         n ; // Фактическая размерность матрицы
   int massiv[N_MAX][N_MAX];       
//   time_t t;
//1   srand((unsigned) time(&t));
   srand( 1 ) ; //2
        
   printf("\n Vvedite fakticheskuyu razmernost' matritsy: "); scanf("%d", &n ) ;
   printf("\n Vvedite min element massiva: "); scanf("%d", &massiv_min);
   printf("\n Vvedite max element massiva: "); scanf("%d", &massiv_max);
   printf("\n \n");
 
   for (i=0; i<n; i++) {
      for (j=0; j<n; j++) {
         q = massiv_max-massiv_min+1;
         massiv[i][j] = rand() % q + massiv_min;
         printf("%5d", massiv[i][j]);            
      }
      printf("\n");
   }
        
   printf("\n Vvedite nomer sloya romba (1,..%d): ", n/2+1); scanf("%d", &k);                
   max = max_sloy_romb( k-1, n, massiv );
   printf("\n Max element v %d-m sloe romba = %d\n",k,max );

}
Разнообразные проверки:
1 <= n <= N_MAX
n - нечётное
layer <= n/2
...
и динамическое выделение памяти под матрицу (если уже учили) - в качестве самостоятельного упражнения...

Added 19:09 CET
А, ну и свою инициализацию датчика можете вернуть.

Последний раз редактировалось Vago; 02.11.2011 в 22:09.
Vago вне форума Ответить с цитированием
Старый 02.11.2011, 23:18   #5
ANutaStar
 
Регистрация: 12.12.2010
Сообщений: 4
По умолчанию

Спасибо огромное!!!
Буду разбираться!
ANutaStar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заменить максимальный элемент суммой всех нечётных элементов матрицы Alexar Makken Паскаль, Turbo Pascal, PascalABC.NET 2 08.06.2011 13:30
В массиве A каждый элемент, кроме первого, заменить суммой всех предыдущих элементов aiktz Помощь студентам 7 11.10.2010 21:52
одномерные массивы(C++) - Найти максимальный положительный элемент и вычислить сумму элементов массива Scarletred Помощь студентам 2 03.04.2010 03:08
Найти максимальный из положительных элементов матрицы и сумму отрицательных элементов. bessonov12 Microsoft Office Excel 7 04.05.2009 05:44
Функция которая в массиве ищет максимальный по модулю элемент Absent Помощь студентам 5 19.11.2007 21:23