|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.12.2011, 01:25 | #11 |
Пользователь
Регистрация: 20.12.2011
Сообщений: 22
|
Методические рекомендации к 5 задаче:
Пример использования массивов Дан массив из N элементов. Рассмотрим программу, которая определит количество четных чисел на отрезке, заключенном между максимальным и минимальным элементами массива. #include <iostream.h> #include <conio.h> main () { int N, i, min, max, min_pos, max_pos, array[100], p, k, kol; cin>>N; // Требует ввода количества элементов массива for (i=0; i<N; i++) cin>>array[i]; // Требует ввода очередного элемента массива min=array[0]; // Пусть нулевой элемент массива является минимальным min_pos=0; // Задает его позицию (0) for (i=0; i<N; i++) if (array[i]<min) // Если значение элемента с индексом i меньше min, то запоминает min=array[i]; // его значение min_pos=i; //и позицию } max=array[0]; // Пусть нулевой элемент массива максимальный max_pos=0; // Задает его позицию (0) for (i=0; i<N; i++) // Если значение элемента с индексом i больше max, то запоминает его значение и позицию if (array[i]>max) { max=array[i] ; max_pos=i; } if (min_pos<max_pos ) // Определяет, какой элемент левее { // максимальный или минимальный p=min_pos; // Крайний слева k=max_pos; // Крайний справа } else { p=max_pos; // Крайний слева k=min_pos; // Крайний справа } kol=0; for (i=p+l; i<k; i++) // Поиск продолжает от крайнего слевадо крайнего справа элемента if (array[i]%2==0) kol++; // Если число четное, то увеличивает счетчик на 1 cout<<kol; // Выводит количество четных чисел getch(); // Задерживает экран return 0; // Завершает программу } |
24.12.2011, 01:26 | #12 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,572
|
Тему можно закрывать, вот тема во Фрилансе: http://programmersforum.ru/showthread.php?t=180859
E-Mail: arigato.freelance@gmail.com
|
24.12.2011, 01:27 | #13 |
Пользователь
Регистрация: 20.12.2011
Сообщений: 22
|
Пример использования структур данных к 6 задаче:
Дана матрица размером М х N, заполненная 0 и -1. Рассмотрим программу, которая определяет количество нулевых островов в матрице. Островом назовем совокупность смежных клеток мат-рицы, содержащих нули. Далее приведен полный код программы с комментариями. #include <iostream.h> #include <conio.h> const N=4; // Количество строк в матрице const М=4; // Количество столбцов в матрице // Инициализированный способ объявления массива {{ -1 -1 -1 -1 -1 -1 } { -1 0 0 -1 -1 -1 } { -1 0 -1 0 0 -1 } { -1 -1 0 -1 0 -1 } { -1 0 -1 -1 -1 -1 } { -1 -1 1 -1 -1 -1 }} int array [N+2][M+2]= // Для того чтобы не выйти за пределы матрицы при проверке смежных клеток, необходимо объявить матрицу (N+2)*(M+2) и края матрицы заполнить числами -1 int Queue[2][M*N]; // Объявляет очередь int Start, Last; // Объявляет переменные, которые служат указателями начала и конца очереди соответственно int Label, i, j, p, a, b; void Add(int x, int у); // Прототип функции, которая будет добавлять элемент в очередь void Find() // Объявление функции { р=0; // Пусть есть нулевые элементы в матрице for (i=l; i<=N && р==0; i++) for (j=l; j<=M && p==0; j++) if (array[i][j]==0) // Если какой-то элемент матрицы равен нулю, то... { р=1; Add(i,j); // вызывает функцию Add(int,int) для занесения координат в очередь } } void Test() // Объявление функции { Label++; // Увеличивает метку, т. е. говорит о начале поиска нового острова while (Start!=Last) //Пока очередь не пуста... { a=Queue[0] [Start]; // Запоминает координату X текущей клетки' b=Queue[l] [Start]; // Запоминает координату Y текущей клетки // Проверяет все клетки, смежные с текущей if (array[а+1][b]==0) Add(a+l,b); if (array[a-1][b]==0) Add(a-l,b); if (array[a][b+l]==0) Add(a,b+1); if (array[a][b-l]==0) Add(a,b-1); Start++; // Удаляет первый элемент из очереди } } main() // Объявление функции { Start=0; // Начальная позиция указателя Start Last=0; // Начальная позиция указателя Last Label=0; P=l; do { Find(); // Вызывает функцию, которая проверяет, есть ли нулевой элемент в матрице if (р==1) Test(); // Если такой элемент найден, то вызывает функцию, которая проверяет смежные клетки с данным элементом и заносит их координаты в очередь, если в них значение равно нулю } while (р==1); cout<<Label; // Выводит результат на экран getch(); // Задерживает экран return 0; // Завершает программу } void Add(int х, int у) // Описание функции { Queue[0][Last]=х; // Заносит в очередь координату X Queue[1][Last]=у; // Заносит в очередь координату Y array[х][у]=Label; // Помечает текущую клетку меткой Last++; // Сдвигает указатель Last вправо } |
24.12.2011, 01:28 | #14 | |
Пользователь
Регистрация: 20.12.2011
Сообщений: 22
|
Цитата:
|
|
24.12.2011, 01:29 | #15 |
Пользователь
Регистрация: 20.12.2011
Сообщений: 22
|
Данная задача является наглядным классическим способом ис¬пользования очереди. Здесь мы будем рассматривать очередь как двумерный массив, в котором две строки и MxN столбцов. В первой строке будет находиться координата х той или иной клетки, а во второй — координата у этой же клетки.
Для решения задачи необходимо выполнить ряд следующих дей¬ствий. На первом шаге работы алгоритма следует найти такие i и j, чтобы выполнялось равенство array[i][j]=0. Это можно сделать при помощи функции Find: void Find () { р=0; for (i=l; i<=N && p==0; i++) for (j=l; j<=M && p==0; j++) if (array[i][j]==0) { P=l; Add(i,j); } } Переменной p присваивается значение l, если нашлись такие i и j, что array[i] [j]=0, в противном случае значение переменной остается равным нулю. В начале работы функции переменная p обнуляется. Если р=1, то координаты (x=i, Y=j) клетки заносятся в очередь, а указатель Last сдвигается на один элемент вправо. Данные дей¬ствия выполняет функция Add (int, int). Затем функция Find прекращает свою работу. Каждый нулевой остров помечается меткой Label, поэтому при добавлении координат очередной клетки она помечается этой меткой. Далее приведен код функци Add(int,int). void Add(int x, int y) { Queue[0][Last]=x; Queue[1][Last]=y; array[x][y]=Label; Last++; } Затем необходимо взять клетку с координатами (Queue[0][Start], Queue[1][Start]) и проверить все смежные с ней клетки. Если какая-нибудь из них имеет значение, равное нулю, то ее координаты заносятся в очередь. Затем указатель start сдвигается на один элемент вправо, т. е. удаляется из очереди элемент в позиции start, и берутся следующие координаты из очереди. К ним применяется та же операция. Данные действия выполняются до тех пор, пока очередь не станет пустой, т. е. пока, start не равно Last. Таким образом, будет найден очередной ну¬левой остров, все клетки которого будут помечены меткой Label. Данные операции выполняет функция Test (): void Test() { Label++; while (Start!=Last) { a=Queue[0][Start]; b=Queue[l][Start]; if (array[a+1][b]==0) Add(a+l,b); if (array[a-1][b]==0) Add(a-l,b); if (array[a][b+l]==0) Add(a,b+1); if (array[a][b-l]==0) Add(a,b-1); Start++; } } Все действия повторяются до тех пор, пока в матрице остаются элементы, равные нулю. Когда таких элементов не найдется, то функция main() выведет результат на экран. main() { Start=0; Last=0; Label=0; P=l; do { Find 0 ; if (p==l) Test(); } while (p==l); cout<<Label ; getch(); return 0; }x, long |
24.12.2011, 01:30 | #16 |
Пользователь
Регистрация: 20.12.2011
Сообщений: 22
|
Ну раз собираетесь закрывать, тогда закройте во фрилансе!а здесь оставьте)
|
24.12.2011, 01:31 | #17 |
Пользователь
Регистрация: 20.12.2011
Сообщений: 22
|
кстати сообщение №15 это продолжение задачи №6)просто не влезло)
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Задачи на С++ | Nemisoi | Фриланс | 7 | 06.10.2011 22:55 |
4 задачи в системе Mathematica(задачи уже решены) | Toni Milano | Фриланс | 2 | 08.02.2011 19:28 |
Задачи в делфи. информационная модель задачи. | @leks@ | Помощь студентам | 2 | 17.10.2010 19:15 |
Задачи | Настена | Помощь студентам | 1 | 18.12.2007 06:45 |