nixp.ru v3.0

18 января 2017,
среда,
19:08:30 MSK

DevOps с компанией «Флант»
Kat написал 11 ноября 2013 года в 21:39 (1638 просмотров) Ведет себя неопределенно; открыл 5 тем в форуме, оставил 7 комментариев на сайте.

Здравствуйте, нужно перевернуть четные строки двумерного массива. переворот одномерного ясен но вот с двумерным не выходит. помогите добавить условие плиз!!!

#include <iostream>

#include <stdlib.h>

#include <conio.h>

int **formMatr (int n, int m)

{

int **matr = new int *[n];

for (int i=0; i<n; i++)

matr=new int [m];

return matr;

}

int **formMatr2 (int **matr,int n, int m)

{

for (int i=0; i<n; i++)

for (int j=0; j<m; j++)

matr[j]=rand()%20;

return matr;

}

void print (int **matr, int n, int m)

{

for (int i=0; i<n; i++)

{

for (int j=0; j<m; j++)  printf («%7d »,matr[j]);

printf («\n» );

}

}

int ** dell (int **matr,int n, int m)

{

int r;

for (int i=0; i<n; i++)

for (int j=0; j<m; j++)

if (matr%2==0)

for(int i=0,j=n-1;i<j;i++,j—)

{int r=matr;

matr=matr[j];

matr[j]=r;}

}

int main ()

{

int **matr;

int n=3,m=3;

matr=formMatr(n,m);

matr=formMatr2(matr,n,m);

print (matr,n,m);

matr=dell(matr,n,m);

print (matr,n,m);

for (int i=0; i<n; ++i)

delete [] matr ;

delete [] matr ;

system(«PAUSE»);

return 0;

 

}

rgo
int ** dell (int **matr,int n, int m)
{
    int r; /* лишняя строчка? */
for (int i=0; i<n; i++) /* 1 */ for (int j=0; j<m; j++) /* 2 */ if (matr[i]%2==0) /* 3 */ for(int i=0,j=n-1;i<j;i++,j--) { /* 4 */ int r=matr[i]; /* 5 */ matr[i]=matr[j]; matr[j]=r; } }


Строчка 1 программы, очевидно, нужна для того, чтобы организовать цикл по строкам, и i у нас — номер строки матрицы.

Зачем нужна строчка 2?

В строчке 3, что там считается в качестве условия цикла? Я спорить готов, что matr%2 всегда равен нулю. Потому что matr — это адрес, который скорее всего выравнен на 4-х байтовую границу, то есть делится на четыре, значит остаток от деления на 2 — это ноль, бла-бла-бла. По-моему, хотелось, чтобы это условие проверяло бы чётность номера строки, то есть чётность числа лежащего в переменной i. Не так ли? Надо ли объяснять как записать условие проверки чётности i?

Строка 4 выглядит так, будто хотелось организовать цикл, который будет выполнять своё тело для всех пар (i,j) из списка (0, n-1); (1, n-2);… (n/2, n/2+1). (Если n чётное то так, если же нечётное, то последняя пара будет выглядеть несколько иначе, но не суть важно). И мы даже можем предположить зачем такой цикл нужен: чтобы обменять i-тый и j-тый элементы строки, таким образом поменяв порядок расположения элементов на обратный. Но — увы, — таким образом записанный цикл сделает всю программу неработоспособной, по двум причинам:

  1. i у нас уже используется как номер строки. Hint: создай ещё одну переменную в дополнение к i. Например, k.
  2. длина строки матрицы, как я понимаю, равна m, а не n.

Строки 5..7, выглядит как код меняющий местами значения двух переменных. Но каких переменных? matr и matr[j]? matr — это i-тая строка, matr[j] — это j-тая строка. Мы же хотим менять местами не строки, а элементы. Значит везде вместо matr или matr[j] должно стоять выражение вида matr[?][?], где вместо вопросиков какие-то переменные. Какие? Вместо первого вопросика — номер текущей строки (надо полагать i), вместо второго — номер элемента в строке. Мы меняем местами два элемента, один из них имеет номер — j, второй — например, k, если ты исправишь недочёты в моём замечании к строке 4.

Затем, внутри функции main есть строчка: matr=dell(matr, n, m). Эта строчка приведёт к тому, что будет вызвана функция dell (которая должна проделать всю работу из задания), и в переменную matr будет записано значение, возвращённое функцией dell. Но, внутри функции dell нигде не использован return. А он там должен быть. Или, в качестве альтернативы, можно изменить заголовок функции dell, чтобы она возвращала не int**, а void. После чего вызывать dell из main таким образом: dell(matr, n, m), без предшествующей части «matr=».

Если всё это проделать, программа, по-моему, должна начать работать. Но можно её ещё немного довести до ума, можно удалить строчку 3, и изменить строчку 1, чтобы i перебирало бы не все числа от 0 до n, а только числа 0, 2, 4,… Для этого надо заменить i++ (увеличивающий каждый раз i на 1) на другой закон изменения.

 

ps. А где это тебя так программированием мучают. В школе что ли? Ну дык каникулы только кончились, до конца четверти ещё полтора месяца. Или ты двоечник и «хвосты» подбираешь?

fhunter

меня куда больше пугает совместное использование #include <iostream> и printf :-)

Вы уж решите, это C++ или C. ;-)

Про программисткие мучения — по крайней мере здесь есть попытки предложить свой код, и это не может не радовать.

Kat

Ну люблю я printf и всё )))

fhunter

«Только разжав мои холодеющие пальцы, мы сможете забрать у меня printf()» :-D

Просто — если это C++ — тогда std::cout (и #include <iostream> ) а если C — то printf() и #include <stdio.h>

Kat

Да где то так, спасибо))

Kat

Если уж на то пошло то двоечница )

и нет не такая мучают в институте))

Спасибо уже разобралась )

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.