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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2011, 01:25   #11
Дархан555
Пользователь
 
Регистрация: 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; // Завершает программу
}
Дархан555 вне форума Ответить с цитированием
Старый 24.12.2011, 01:26   #12
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,572
По умолчанию

Тему можно закрывать, вот тема во Фрилансе: http://programmersforum.ru/showthread.php?t=180859
Arigato вне форума Ответить с цитированием
Старый 24.12.2011, 01:27   #13
Дархан555
Пользователь
 
Регистрация: 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 вправо
}
Дархан555 вне форума Ответить с цитированием
Старый 24.12.2011, 01:28   #14
Дархан555
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Тему можно закрывать, вот тема во Фрилансе: http://programmersforum.ru/showthread.php?t=180859
Ну подождите может кто нибудь и поможет мне)что сразу так закрывать!
Дархан555 вне форума Ответить с цитированием
Старый 24.12.2011, 01:29   #15
Дархан555
Пользователь
 
Регистрация: 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
Дархан555 вне форума Ответить с цитированием
Старый 24.12.2011, 01:30   #16
Дархан555
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 22
По умолчанию

Ну раз собираетесь закрывать, тогда закройте во фрилансе!а здесь оставьте)
Дархан555 вне форума Ответить с цитированием
Старый 24.12.2011, 01:31   #17
Дархан555
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 22
По умолчанию

кстати сообщение №15 это продолжение задачи №6)просто не влезло)
Дархан555 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи на С++ 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