Anya
Интересующийся
Offline
|
|
« : 10-01-2011 08:02 » |
|
Помогите, пожалуйста... я написала программу, которая должна менять местами четные элементы в нечетных строках, но у меня какая то ошибка, которая дает непонятный цикл в ответе, я никак не могу понять что такое...посмотрите пожалуйста, очень нужно, мне ее завтра сдать надо(( Вот код: #include<iostream.h> #include<conio.h> #include<stdio.h> #include<stdlib.h> void zamena(int A[20][20]){ 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(){ void zamena(int[20][20]); int A[20][20]; 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",A[i][j]); } } zamena(A); for (i=0; i<s; i++){ for(j=0; j<t; j++){ printf("%i\t",A[i][j]); } printf("\n"); } getch(); }
|
|
« Последнее редактирование: 10-01-2011 10:17 от Вад »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #1 : 10-01-2011 08:40 » |
|
Anya, поясни, что такое двумерный массив, и как с ним работать?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Anya
Интересующийся
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 »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #3 : 10-01-2011 10:16 » |
|
Anya, в следующий раз вставляй код в теги [code][/code] и форматируй, пожалуйста, а то понять ничего невозможно.
Я в исходном сообщении подстветил 22ю строку - это так и задумывалось, или копипаста неудачная?
Кстати, в C++, строго говоря, нет никаких двумерных массивов - есть только разные ухищрения, чтобы обращаться по двойному индексу.
Добавлено через 8 минут и 43 секунды: Посмотрел код. Anya, почему у тебя в функции zamena переменные s,t, которые должны представлять собой размерность массива, нигде не инициализируются? Там может происходить что угодно, в этой функции.
|
|
« Последнее редактирование: 10-01-2011 10:28 от Вад »
|
Записан
|
|
|
|
Anya
Интересующийся
Offline
|
|
« Ответ #4 : 10-01-2011 10:52 » |
|
Вад, ну 22-ой строки в принципе может и не быть, а то что я не инициализировала s,t сильно влияет на ход роботы программы, ошибок же компилятор не выдает
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #5 : 10-01-2011 11:23 » |
|
Ну, компилятор же не обязан следить, где у тебя что инициализировано - может, оно так и задумывалось Хотя предупреждение должно было быть.
|
|
|
Записан
|
|
|
|
Anya
Интересующийся
Offline
|
|
« Ответ #6 : 10-01-2011 11:29 » |
|
ну предупреждений нету...просто вечный цикл и все, вместо нормального ответа
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #7 : 10-01-2011 11:58 » |
|
Anya, в языке C параметры в подпрограмму всегда передаются только по значению. Если функция обладает побочным эффектом, т.е. меняет значение своих параметров, эти параметры явно должны передаваться как ссылки. Поэтому в строке scanf("%i%i",s,t); ничего (хорошего) не происходит. Замените ее на scanf("%i%i", &s, &t); Чтобы убедиться, что это именно так, поставьте контрольную печать значений s и t после ввода и проверьте, действительно ли в них содержится то, что ожидается.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Вад
|
|
« Ответ #8 : 10-01-2011 12:01 » |
|
Anya, тогда или у тебя странный компилятор, или ты не читаешь сообщения во время сборки программы. Современные компиляторы для такого рода кода по умолчанию должны выдавать предупреждение о неинициализированных переменных. Программа от это собираться, конечно, не перестанет.
В принципе, даже если предупреждений нет - стоит попробовать использовать отладчик. Поставить точки останова, запустить под отладчиком и внимательно изучить, что происходит на самом деле во время выполнения программы, по шагам.
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #9 : 10-01-2011 12:03 » |
|
Ну, компилятор же не обязан следить, где у тебя что инициализировано - может, оно так и задумывалось Хотя предупреждение должно было быть. Компилятор C к таким вещам относится с хладнокровным пофигизмом, по принципу: "вы же просили именно этого - так получайте". Нужно пользоваться вспомогательными инструментами, вроде lint'а. Я для C обычно использую splint.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Вад
|
|
« Ответ #10 : 10-01-2011 12:03 » |
|
Ну, компилятор же не обязан следить, где у тебя что инициализировано - может, оно так и задумывалось Хотя предупреждение должно было быть. Компилятор C к таким вещам относится с хладнокровным пофигизмом, по принципу: "вы же просили именно этого - так получайте". Нужно пользоваться вспомогательными инструментами, вроде lint'а. Я для C обычно использую splint. Судя по заголовку iostream.h, это не мог быть компилятор C. Если только он не отнёсся с пофигизмом и к инклуду.
|
|
« Последнее редактирование: 10-01-2011 12:06 от Вад »
|
Записан
|
|
|
|
Anya
Интересующийся
Offline
|
|
« Ответ #11 : 10-01-2011 12:14 » |
|
а вообще сама функция замена правильно написана для задания? потому что я сейчас кое-что подправила и у меня теперь получается первоначальная матрица выводится, а вторичная, которая должна получится в результате функции нет, может я вызов не правильно осуществляю?
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #12 : 10-01-2011 12:23 » |
|
Судя по заголовку iostream.h, это не мог быть компилятор C. Точно, проглядел. Хотя затесался он туда явно случайно. Добавлено через 3 минуты и 49 секунд:первоначальная матрица выводится, а вторичная, которая должна получится в результате функции нет Не выводится совсем ничего, или не то, что надо?
|
|
« Последнее редактирование: 10-01-2011 12:27 от Dale »
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Anya
Интересующийся
Offline
|
|
« Ответ #13 : 10-01-2011 12:32 » |
|
Вообще ничего, оно просто останавливается
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #14 : 10-01-2011 12:37 » |
|
Anya, показывай текущий вариант - мы ж не знаем, что там подправлено
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #15 : 10-01-2011 12:40 » |
|
И понаставьте контрольных печатей побольше. Чтобы знать, какие точки в программе пройдены, а до каких дело не дошло.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Anya
Интересующийся
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(); }
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #17 : 10-01-2011 13:13 » |
|
Anya, ну так, как я в самом начале сказал, в функции zamena нигде не инициализируются s и t - и вообще, реальные размерности массива в неё никак не передаются. То, что имена переменных в этой функции и в main совпадают - ровно ни о чём не говорит. В результате, цикл по замене работает некорректно.
|
|
|
Записан
|
|
|
|
Anya
Интересующийся
Offline
|
|
« Ответ #18 : 10-01-2011 13:18 » |
|
то есть, мне сам ввод размерности перенести в функцию замена?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #19 : 10-01-2011 13:40 » |
|
Нет, лучше передать эти значения в функцию в виде параметров. Так же, как ты передаёшь массив.
|
|
|
Записан
|
|
|
|
Anya
Интересующийся
Offline
|
|
« Ответ #20 : 10-01-2011 13:47 » |
|
хорошо, сейчас попробую
Добавлено через 12 минут и 56 секунд: Вад, что то я запуталась, мы передаем s и t в виде параметров, как массив, массив я передаю как параметр функции замена, а s и t мне как параметр функции main передавать?
|
|
« Последнее редактирование: 10-01-2011 14:00 от Anya »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #21 : 10-01-2011 14:25 » |
|
Нет, тебе ведь и размерности тоже нужно передать параметром в функцию замена - ведь именно эта функция ничего не знает про введённые размеры. Так же, как она не знала бы и про значения, записанные в массив в теле функции main, если бы ты массив не передала через параметр.
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #22 : 10-01-2011 14:35 » |
|
Anya, s и t - параметры функции zamena.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Anya
Интересующийся
Offline
|
|
« Ответ #23 : 10-01-2011 14:37 » |
|
я уже поняла, параметры я написала, программа практически работает, правда выводит не то что мне надо, выводит матрицу, а меняет не то
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #24 : 10-01-2011 14:39 » |
|
Anya, значит, в алгоритме замены ошибка Опиши поточнее, как именно должна происходить замена. По какому принципу меняются чётные элементы в нечётных строках? Не совсем понятно.
|
|
|
Записан
|
|
|
|
Anya
Интересующийся
Offline
|
|
« Ответ #25 : 10-01-2011 14:43 » |
|
ну как я поняла эту задачу, необходимо менять четный по индексу элемент, в нечетной по индексу строке, т.е у меня есть строка и я в ней меняю 2-й и 4-й, 6-й и 8-й местами, как бы попарно, а если у нас нечетное колличество элементов, последнее отбрасывается
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #26 : 10-01-2011 17:17 » |
|
Если так, то внутренний цикл у тебя в функции замены неправильно выглядит. Попробуй по шагам на бумажке проследить, что будет происходит в этом цикле.
|
|
|
Записан
|
|
|
|
Anya
Интересующийся
Offline
|
|
« Ответ #27 : 11-01-2011 08:28 » |
|
Спасибо всем за помощь программа работает
|
|
|
Записан
|
|
|
|
|