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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: создать функцию меняющую местами четные элементы в нечетных строках  (Прочитано 26646 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Anya
Интересующийся

ru
Offline Offline

« : 10-01-2011 08:02 » 

Помогите, пожалуйста... я написала программу, которая должна менять местами четные элементы в нечетных строках, но у меня какая то ошибка, которая дает непонятный цикл в ответе, я никак не могу понять что такое...посмотрите пожалуйста, очень нужно, мне ее завтра сдать надо((
Вот код:
Код: (C++)
  1. #include<iostream.h>
  2. #include<conio.h>
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5.  
  6. void zamena(int A[20][20]){
  7.     int x,i,j,s,t;
  8.     for (i=0; i<s; i++){
  9.         if(i%2==1){
  10.             for (j=0; j<t; j=j+2){
  11.                 if (j%2==0){
  12.                     x=A[i][j];
  13.                     A[i][j]=A[i][j+2];
  14.                     A[i][j+2]=x;
  15.                 }
  16.             }
  17.         }
  18.     }
  19. };
  20.  
  21. void main(){
  22.     void zamena(int[20][20]);
  23.     int A[20][20];
  24.     int i,j,s,t;
  25.     clrscr();
  26.     printf("vvedite razmer matricy;\n");
  27.     scanf("%i%i",s,t);
  28.     randomize();
  29.     for (i=0; i<s; i++){
  30.         for(j=0; j<t; j++){
  31.             A[i][j]=random(10);
  32.         }
  33.     }
  34.  
  35.     printf("Massiv:\n");
  36.     for (i=0; i<s; i++){
  37.         for(j=0; j<t; j++){
  38.             printf("%i",A[i][j]);
  39.         }
  40.     }
  41.  
  42.     zamena(A);
  43.     for (i=0; i<s; i++){
  44.         for(j=0; j<t; j++){
  45.             printf("%i\t",A[i][j]);
  46.         }
  47.         printf("\n");
  48.     }
  49.     getch();
  50. }
« Последнее редактирование: 10-01-2011 10:17 от Вад » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 10-01-2011 08:40 » 

Anya, поясни, что такое двумерный массив, и как с ним работать?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Anya
Интересующийся

ru
Offline Offline

« Ответ #2 : 10-01-2011 08:47 » 

Это объединение символов одного типа, это что то вроди матрицы размером M*N, где M колличество строк, а N колличество столбцов., а элементы этой матрицы находятся на пересечении номера строки и столбца, получаем, что элемент это у нас a[i][j],где i строка, j столбец. Работать можно либо в цикле, т.е практически со всей строкой, столбцом или с конкретными элементами

Добавлено через 1 час, 31 минуту и 1 секунду:
я там кстати описалась:
Код:
x= A[i][j];
A[i][j]=A[i][j+2];
A[i][j+2]=x;
« Последнее редактирование: 10-01-2011 10:18 от Anya » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 10-01-2011 10:16 » 

Anya, в следующий раз вставляй код в теги [code][/code] и форматируй, пожалуйста, а то понять ничего невозможно.

Я в исходном сообщении подстветил 22ю строку - это так и задумывалось, или копипаста неудачная?

Кстати, в C++, строго говоря, нет никаких двумерных массивов - есть только разные ухищрения, чтобы обращаться по двойному индексу.

Добавлено через 8 минут и 43 секунды:
Посмотрел код. Anya, почему у тебя в функции zamena переменные s,t, которые должны представлять собой размерность массива, нигде не инициализируются? Там может происходить что угодно, в этой функции.
« Последнее редактирование: 10-01-2011 10:28 от Вад » Записан
Anya
Интересующийся

ru
Offline Offline

« Ответ #4 : 10-01-2011 10:52 » 

Вад, ну 22-ой строки в принципе может и не быть, а то что я не инициализировала s,t сильно влияет на ход роботы программы, ошибок же компилятор не выдает
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 10-01-2011 11:23 » 

Ну, компилятор же не обязан следить, где у тебя что инициализировано - может, оно так и задумывалось Улыбаюсь Хотя предупреждение должно было быть.
Записан
Anya
Интересующийся

ru
Offline Offline

« Ответ #6 : 10-01-2011 11:29 » 

ну предупреждений нету...просто вечный цикл и все, вместо нормального ответа
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 10-01-2011 11:58 » 

Anya, в языке C параметры в подпрограмму всегда передаются только по значению. Если функция обладает побочным эффектом, т.е. меняет значение своих параметров, эти параметры явно должны передаваться как ссылки. Поэтому в строке

Код: (C)
scanf("%i%i",s,t);

ничего (хорошего) не происходит. Замените ее на

Код: (C)
scanf("%i%i", &s, &t);

Чтобы убедиться, что это именно так, поставьте контрольную печать значений s и t после ввода и проверьте, действительно ли в них содержится то, что ожидается.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 10-01-2011 12:01 » 

Anya, тогда или у тебя странный компилятор, или ты не читаешь сообщения во время сборки программы. Современные компиляторы для такого рода кода по умолчанию должны выдавать предупреждение о неинициализированных переменных. Программа от это собираться, конечно, не перестанет.

В принципе, даже если предупреждений нет - стоит попробовать использовать отладчик. Поставить точки останова, запустить под отладчиком и внимательно изучить, что происходит на самом деле во время выполнения программы, по шагам.
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 10-01-2011 12:03 » 

Ну, компилятор же не обязан следить, где у тебя что инициализировано - может, оно так и задумывалось Улыбаюсь Хотя предупреждение должно было быть.

Компилятор C к таким вещам относится с хладнокровным пофигизмом, по принципу: "вы же просили именно этого - так получайте". Нужно пользоваться вспомогательными инструментами, вроде lint'а. Я для C обычно использую splint.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 10-01-2011 12:03 » 

Ну, компилятор же не обязан следить, где у тебя что инициализировано - может, оно так и задумывалось Улыбаюсь Хотя предупреждение должно было быть.

Компилятор C к таким вещам относится с хладнокровным пофигизмом, по принципу: "вы же просили именно этого - так получайте". Нужно пользоваться вспомогательными инструментами, вроде lint'а. Я для C обычно использую splint.
Судя по заголовку iostream.h, это не мог быть компилятор C. Если только он не отнёсся с пофигизмом и к инклуду.
« Последнее редактирование: 10-01-2011 12:06 от Вад » Записан
Anya
Интересующийся

ru
Offline Offline

« Ответ #11 : 10-01-2011 12:14 » 

а вообще сама функция замена правильно написана для задания? потому что я сейчас кое-что подправила и у меня теперь получается первоначальная матрица выводится, а вторичная, которая должна получится в результате функции нет, может я вызов не правильно осуществляю?
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 10-01-2011 12:23 » 

Судя по заголовку iostream.h, это не мог быть компилятор C.

Точно, проглядел. Хотя затесался он туда явно случайно.

Добавлено через 3 минуты и 49 секунд:
первоначальная матрица выводится, а вторичная, которая должна получится в результате функции нет

Не выводится совсем ничего, или не то, что надо?
« Последнее редактирование: 10-01-2011 12:27 от Dale » Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Anya
Интересующийся

ru
Offline Offline

« Ответ #13 : 10-01-2011 12:32 » 

Вообще ничего, оно просто останавливается
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 10-01-2011 12:37 » 

Anya, показывай текущий вариант - мы ж не знаем, что там подправлено Улыбаюсь
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 10-01-2011 12:40 » new

И понаставьте контрольных печатей побольше. Чтобы знать, какие точки в программе пройдены, а до каких дело не дошло.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Anya
Интересующийся

ru
Offline Offline

« Ответ #16 : 10-01-2011 12:51 » 

Код:
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
void zamena(int A[5][5]){
int x,i,j,s,t;
for (i=0; i<s; i++){
if(i%2==1){
for(j=0; j<t; j=j+2){
if (j%2==0){
x=A[i][j];
A[i][j]=A[i][j+2];
A[i][j+2]=x;}}}}
};
void main(){
int A[5][5];
int i,j,s,t;
clrscr();
printf("vvedite razmer matricy;\n");
scanf("%i%i",&s,&t);
randomize();
for (i=0; i<s; i++){
 for(j=0; j<t; j++){
 A[i][j]=random(10);}}
printf("Massiv:\n");
for (i=0; i<s; i++){
 for(j=0; j<t; j++){
 printf("%i\t",A[i][j]);}
 printf("\n");}           \\получается проходит только до этой точки доходит, а к функции не обращается
zamena(A);
 for (i=0; i<s; i++){
 for(j=0; j<t; j++){
 printf("%i\t",A[i][j]);}
 printf("\n");}
 getch();
 }
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 10-01-2011 13:13 » 

Anya, ну так, как я в самом начале сказал, в функции zamena нигде не инициализируются s и t - и вообще, реальные размерности массива в неё никак не передаются.
То, что имена переменных в этой функции и в main совпадают - ровно ни о чём не говорит. В результате, цикл по замене работает некорректно.
Записан
Anya
Интересующийся

ru
Offline Offline

« Ответ #18 : 10-01-2011 13:18 » 

то есть, мне сам ввод размерности перенести в функцию замена?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 10-01-2011 13:40 » 

Нет, лучше передать эти значения в функцию в виде параметров. Так же, как ты передаёшь массив.
Записан
Anya
Интересующийся

ru
Offline Offline

« Ответ #20 : 10-01-2011 13:47 » 

хорошо, сейчас попробую

Добавлено через 12 минут и 56 секунд:
Вад, что то я запуталась, мы передаем s и t в виде параметров, как массив, массив я передаю как параметр функции замена, а s и t мне как параметр функции main передавать?
« Последнее редактирование: 10-01-2011 14:00 от Anya » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 10-01-2011 14:25 » 

Нет, тебе ведь и размерности тоже нужно передать параметром в функцию замена - ведь именно эта функция ничего не знает про введённые размеры. Так же, как она не знала бы и про значения, записанные в массив в теле функции main, если бы ты массив не передала через параметр.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 10-01-2011 14:35 » 

Anya, s и t - параметры функции zamena.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Anya
Интересующийся

ru
Offline Offline

« Ответ #23 : 10-01-2011 14:37 » 

я уже поняла, параметры я написала, программа практически работает, правда выводит не то что мне надо, выводит матрицу, а меняет не то
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 10-01-2011 14:39 » 

Anya, значит, в алгоритме замены ошибка Улыбаюсь
Опиши поточнее, как именно должна происходить замена. По какому принципу меняются чётные элементы в нечётных строках? Не совсем понятно.
Записан
Anya
Интересующийся

ru
Offline Offline

« Ответ #25 : 10-01-2011 14:43 » 

ну как я поняла эту задачу, необходимо менять четный по индексу элемент, в нечетной по индексу строке, т.е у меня есть строка и я в ней меняю 2-й и 4-й, 6-й и 8-й местами, как бы попарно, а если у нас нечетное колличество элементов, последнее отбрасывается
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 10-01-2011 17:17 » 

Если так, то внутренний цикл у тебя в функции замены неправильно выглядит. Попробуй по шагам на бумажке проследить, что будет происходит в этом цикле.
Записан
Anya
Интересующийся

ru
Offline Offline

« Ответ #27 : 11-01-2011 08:28 » 

Спасибо всем за помощь Улыбаюсь программа работает Отлично
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines