PDA

Просмотр полной версии : Задачки по TP


Mr_Anderson
01.04.2007, 14:30
Горит зачёт по гадскому турбо паскалю, а через неделю отчисление. 3 из 6 задач сделал, а до остальных вообще никак не додуматься. Если кто сможет помочь, с меня причитается.
Интересует решение пары задач с циклическими участками:
1) даны 25 чисел, среди них много нулей. Найти количество чисел в наиболее длинной последовательности подряд идущих нулей.
2) построить таблицу пересчёта миль в киллометры (1 миля ~ 1609.3 м) для расстояний от 1 до 100 км. Таблица должна иметь следующий вид:
мили км
0.6214 1.0000
1.0000 1.6093
1.2428 2.0000
1.8641 3.0000
...
Заранее спасибо откликнувшимся.

Spirakoo
01.04.2007, 14:31
эх...знакомая тема,но я ничего не помню,сор

Insya
01.04.2007, 15:20
а че-то вообще не поняла в чем проблема, особенно во второй задаче.. в чем конкретно у тебя загвоздка?

Mr_Anderson
01.04.2007, 15:37
а че-то вообще не поняла в чем проблема, особенно во второй задаче.. в чем конкретно у тебя загвоздка?
В первой ясно как задать программе определять нули, но как сделать так, чтобы она считала именно последовательности и выводила количество нулей в ней. У меня получалось так, что программа считала все нули в общей последовательности чисел. Вроде ясно изъяснился.
Во второй понятно, что с использованием цикла WHILE, но хоть ты тресни, не получалось.

Apo
01.04.2007, 18:32
Насчёт первой задачи. Как реализовать это на ТП, я не знаю, так как его не изучал, но идея такая: Создаёшь переменную, которая будет выполнять роль счётчика, допустим A. Приравниваешь её к 0. Создаёшь другую переменную, в которой будет сохраняться максимальный результат, допустим B. Её тоже приравниваешь к 0. Создаёшь цикл, который прокручивает все числа на предмет 0 - не 0. Допустим число равно 0. Тогда прибавляешь к переменной А единицу. Если число - не 0, то присваиваешь переменной B значение переменной A, тем самым сохраняя результат, при условии, что предыдущее B < A, и опять приравниваешь А к нулю. В итоге после прокрутки всех чисел в переменной B должно сохраниться максимальное число нулей, идущих подряд. Оно там не сохранится в одном случае - если максимальное число нулей шло в конце, и после него уже не было ненулевого числа. Так что после выполнения цикла ещё раз сравниваешь A и B и переписываешь B, если А больше. Выводишь B.

M@GIC
01.04.2007, 19:11
Синтаксис Паскаля не помню. Предлагаю решение на С++ Самое лёгкое и очень неэффективное. Пишу с коментами. Думаю не составит труда все перевести нс интаксис Паскаля.


int main()
{
int mas1[25],mas2[25],i,max=0,maximum=0;//
cout<<"Enter..."<<endl;
for(i=0;i<10;i++)
cin>>mas1[i]; вводим элементы массива

for(i=0;i<10;i++)
{
if (mas1[i]==0) если нуль
{
max++; то инкремируем на еденицу
mas2[i]=0; суём в другой массив 0.
}
else
{
mas2[i]=max; если не нуль то скидываем во второй массив макс
max=0; обнуляем
}
}
//выполним поиск по 2 рому массиву наибольшег числа
maximum=mas2[0];
for(i=0;i<10;i++)
{
if (mas2[i]>maximum)
{
maximum=mas2[i];

}
}
cout<<maximum<<endl; //выведем максимальный элемент
getch();
return 0;
}

Apo
02.04.2007, 01:23
Решение неплохое, но зачем вводить второй массив и выполнять поиск по нему максимального элемента, если можно обойтись одной переменной и условием в цикле, которое будет её менять? И что эта программа будет делать в вышеописанном случае, когда самое большое число нулей будет в конце массива? Слегка модифицированный код:

int main()
{
int mas1[25],i,max=0,maximum=0;//
cout<<"Enter..."<<endl;
for(i=0;i<25;i++)
cin>>mas1[i];

for(i=0;i<25;i++)
{
if (mas1[i]==0)
max++;

else
{ if (max>=maximum)
maximum=max;
max=0;
}
}

if (max>=maximum)
maximum=max;

cout<<maximum<<endl;
getch();
return 0;
}

По-моему гораздо короче получилось...

kainen
02.04.2007, 17:39
Решение неплохое, но зачем вводить второй цикл и выполнять поиск в нем максимального элемента, если можно обойтись одним циклом и условием в цикле, которое будет находить максимум? Слегка модифицированный код:

const int max_num = 25;
int main()
{
int number, i,max=0,maximum=0;
cout<<"Enter..."<<endl;
for(i=0;i<max_num;++i)
{
cin>>number;
if (number==0)
++max;
else
{
if (max>maximum)
maximum=max;
max = 0;
}
}

if (max>=maximum)
maximum=max;

cout<<maximum<<endl;
getch();
return 0;
}

По-моему гораздо короче получилось...

kainen
02.04.2007, 17:47
2kainen:Решение неплохое, но зачем такой длинный цикл? Слегка модифицированный код:

const int max_num = 25;
int main()
{
int number, i,max=0,maximum=0;
cout<<"Enter..."<<endl;
for(i=0;i<max_num;++i)
{
cin>>number;
if (number==0)
++max;
else
{
if (max>maximum)
maximum=max;
max = 0;
if (max_num - i <= maximum)
break;
}
}

if (max>=maximum)
maximum=max;

cout<<maximum<<endl;
getch();
return 0;
}

По-моему гораздо оптимальнее получилось...

STem
02.04.2007, 17:59
Горит зачёт по гадскому турбо паскалю, а через неделю отчисление. 3 из 6 задач сделал, а до остальных вообще никак не додуматься. Если кто сможет помочь, с меня причитается.
Интересует решение пары задач с циклическими участками:
1) даны 25 чисел, среди них много нулей. Найти количество чисел в наиболее длинной последовательности подряд идущих нулей.
2) построить таблицу пересчёта миль в киллометры (1 миля ~ 1609.3 м) для расстояний от 1 до 100 км. Таблица должна иметь следующий вид:
мили км
0.6214 1.0000
1.0000 1.6093
1.2428 2.0000
1.8641 3.0000
...
Заранее спасибо откликнувшимся.
ответы не читал, долго, просто свои варианты предложу, ты уж сам выбирай.

1.
ох уж эти высосанные формулировки. что считать-то? количество нулей в самой длинной последовательности? ну посчитай количество нулей во всех последовательностях нулей, запиши результаты в массив, а потом выбери из него максимум.
2.
кхм.. в примере написан какой-то бред, вам не кажется? если надо действительно от 1 до 100 км, сделай массив из 100 элементов и запиши в него числа (1000*(n+1))/1609.3 где n - номер ячейки (только округли результаты там как надо).

maniac
02.04.2007, 19:44
ответы не читал, долго, просто свои варианты предложу, ты уж сам выбирай.

1.
ох уж эти высосанные формулировки. что считать-то? количество нулей в самой длинной последовательности? ну посчитай количество нулей во всех последовательностях нулей, запиши результаты в массив, а потом выбери из него максимум.


Одного не пойму: зачем усложнять???
Можно ведь сразу проверить на максимум:
if (current_max_val > global_max_val) global_max_val = current_max_val;

STem
02.04.2007, 19:49
Одного не пойму: зачем усложнять???
Можно ведь сразу проверить на максимум:
if (current_max_val > global_max_val) global_max_val = current_max_val;

да как угодно можно, надо просто чтоб Ондирзон понял.

Apo
02.04.2007, 20:08
2 maniac: Давайте ещё в третий раз то же самое скажем, только другими словами )))

Mr_Anderson
02.04.2007, 20:26
Народ, массивы это конечно очень круто, но надо решать задачи без них, поскольку на тот момент они нами не проходились. Тупо использовать циклы, ну и условный оператор и оператор выбора, если потребуется.

Apo
02.04.2007, 20:46
В решениях от kainen'а массивы не используются...

Mr_Anderson
02.04.2007, 20:49
В решениях от kainen'а массивы не используются...
Я думал он просто сократил решение с массивами и не смотрел на него, значит буду переводить на синтаксис паскаля.

maniac
02.04.2007, 21:00
2 maniac: Давайте ещё в третий раз то же самое скажем, только другими словами )))

говори ;)