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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2017, 17:50   #1
leonid_spartak
Пользователь
 
Регистрация: 18.02.2017
Сообщений: 43
По умолчанию Массивы - Си

Задание: создать процедуру, формирующую вектор vector2n-1 из максимальных элементов диагоналей целочисленного квадратного массива matrixnn, параллельных его главной диагонали.
Есть код, но он работает немного неправильно, строит вектор неверно, помогите исправить, у кого какие соображения?

Код:
#include <stdio.h>

int mas[20][20];
int v[40];

void Vector(int a[][20],int n)
{
  int x, y, i, max;

   for (i = 0; i < n * 2 - 1; i++)
  {
    if (i < n)
    {
      x = i;
      y = 0;
    }
    else
    {
      x = n-1;
      y = i-n+1;
    }

    while (x >= 0 && y < n)
    {
      if (a[x][y] > max)
        max = a[x][y];
      x--;
      y++;
    }

    v[i] = max;
   }
}


void main()
{

int i, j,n, massiv_min, massiv_max;

    printf("\nInput number of rows and columns: "); scanf("%d", &n);
	printf("\nInput the lower border of range: ");  scanf("%d", &massiv_min);
	printf("\nInput the upper border of range: ");  scanf("%d", &massiv_max);

    int massiv[n][n];

	printf("\nSource massive:\n");

	for (i=0; i<n; i++) // getting of random number in range
     {
        for (j=0; j<n; j++)
			{
			    massiv[i][j]=rand()%(massiv_max-massiv_min + 1) + massiv_min;
				printf("%7d", massiv[i][j]);
            }
    printf("\n");
	}

 Vector(mas,n);

  printf("Vector:\n");
  for (i = 0; i < n * 2 - 1; i++)
    printf("%d ", v[i]);
  printf("\n");
}

Последний раз редактировалось leonid_spartak; 15.05.2017 в 20:07.
leonid_spartak вне форума Ответить с цитированием
Старый 15.05.2017, 18:51   #2
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Цитата:
Сообщение от leonid_spartak Посмотреть сообщение
Задание: создать процедуру, формирующую вектор vector2n-1 из максимальных элементов диагоналей целочисленного квадратного массива matrixnn
- почему из максимальных элементов? Возьмем, к примеру, n = 5, получается массив 5x5, имеем 2 диагонали по 5 элементов - 1 элемент повторяется, таким образом имеем 5*2 = 10 - 1 = 9.
2*n-1 = 2*5-1 = 9 - т.е. получаем все элементы диагоналей, а не максимальные элементы. Ошибка в задании?

Последний раз редактировалось Cuprum5; 15.05.2017 в 18:54.
Cuprum5 вне форума Ответить с цитированием
Старый 15.05.2017, 18:57   #3
leonid_spartak
Пользователь
 
Регистрация: 18.02.2017
Сообщений: 43
По умолчанию

Нет, все верно, вы задаете 5x5 элементов в массиве, а потом параллельно главной диагонали смотрите максимальный, если повторяется, то это не страшно(если я вас конечно правильно понял) - ну в любом случае ошибки в задании нет.
leonid_spartak вне форума Ответить с цитированием
Старый 15.05.2017, 19:00   #4
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Так нужно все диагонали просмотреть что-ли?

Цитата:
Сообщение от leonid_spartak Посмотреть сообщение
printf("%7d", massiv[i][j]);
- что значит 7d? Или 7-ка нечаянно залетела?

Кстати, я насчитал 7 диагоналей, которые параллельны главной диагонали в массиве 5x5.

Последний раз редактировалось BDA; 15.05.2017 в 20:34.
Cuprum5 вне форума Ответить с цитированием
Старый 15.05.2017, 19:02   #5
leonid_spartak
Пользователь
 
Регистрация: 18.02.2017
Сообщений: 43
По умолчанию

Это отступ между элементами
leonid_spartak вне форума Ответить с цитированием
Старый 15.05.2017, 19:08   #6
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

2*n - 3 - вот формула, количества диагоналей параллельных главной диагонали, включая ее саму.
Cuprum5 вне форума Ответить с цитированием
Старый 15.05.2017, 20:06   #7
leonid_spartak
Пользователь
 
Регистрация: 18.02.2017
Сообщений: 43
По умолчанию

Нашел готовый код на Pascal: кто поможет перевести или с помощью него найти ошибки для кода Си, указанного выше...

Код:
uses crt;
const nmax=15;
type mtr=array[1..nmax,1..nmax]of integer;
     vec=array[1..2*nmax-1] of integer;
procedure form_vec(a:mtr;n:byte;var b:vec);
var i,j,k:byte;
    max:integer;
begin
for j:=1 to 2*n-1 do{количество диагоналей}
 begin
  if j<=n then {идем с низу до главной включитнльно}
   begin
    max:=a[n-j+1,1];
    for i:=n-j+1 to n do
    if a[i,i-n+j]>max then max:=a[i,i-n+j];
    b[j]:=max;
   end
  else if j>n then {идем вправо до конца}
   begin
    max:=a[1,j-n+1];
    for i:=1 to 2*n-j do
    if a[i,i+j-n]>max then max:=a[i,i+j-n];
    b[j]:=max;
   end
 end;
end;
var a:mtr;
    b:vec;
    n,i,j:byte;
begin
clrscr;
randomize;
repeat
write('Размер матрицы до ',nmax,' n=');
readln(n);
until n in [1..nmax];
writeln('Матрица:');
for i:=1 to n do
 begin
  for j:=1 to n  do
   begin
    a[i,j]:=random(50);
    write(a[i,j]:4);
   end;
  writeln;
 end;
form_vec(a,n,b);
writeln('Максимальные элементы диагоналей, параллельных главной:');
for i:=1 to 2*n-1 do
write(b[i]:4);
readln
end.
leonid_spartak вне форума Ответить с цитированием
Старый 15.05.2017, 20:36   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Cuprum5, не нужно писать несколько сообщений подряд, дописывайте мысли в одно сообщение. Во-вторых, всего диагоналей 2*N-1.
leonid_spartak, весь ваш код не просмотрел (из первого поста). Вы заполняете данными massiv, а передаете в функцию Vector mas. В функции Vector переменная max неинициализирована. Сам перебор элементов диагоналей не проверял.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 15.05.2017 в 20:40.
BDA вне форума Ответить с цитированием
Старый 15.05.2017, 21:13   #9
leonid_spartak
Пользователь
 
Регистрация: 18.02.2017
Сообщений: 43
По умолчанию

А каким образом мне ее инициализировать, может max=massiv[0][0]?(mas на massiv я исправил)
leonid_spartak вне форума Ответить с цитированием
Старый 15.05.2017, 21:52   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Можно также как в приведенным вами коде на паскале, то есть первым элементом каждой диагонали.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать программу массивы (C++) - Даны два массива, скопировать эти массивы в 3-й результирующий (размером 10 элементов) так, что Саша1990 Помощь студентам 1 02.02.2015 16:03
Одномерные массивы, двумерные массивы, строки Sand093 C++ Builder 11 20.05.2012 21:48
Двумерные массивы(матрица) 2)Строковые массивы(строки): 3)Структуры nuriyat Помощь студентам 1 21.01.2012 16:16
Двумерные массивы(массивы указателей на массивы) krytishka99 Помощь студентам 1 29.12.2011 19:51
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12