Нд, 26.05.2019, 07:04
Форум інформатиків України
Головна Реєстрація Вхід
Вітаю Вас, Гість · RSS
Вітання на форумі
Незнайомець
Вітаємо на форумі,
Незнайомцю!

 
зареєструйтесь
Перед реєстрацією обов’язково прочитайте:
Оновлення Учасники Пошук
Особисті повідомлення
Видавництво ’’Аспект’’ Видавництво

Модератор форуму: Bandalak, Ktara, НІКОЛЯ, volevikt  
Форум інформатиків » РОЗДІЛ VIІІ: ОБМІН ДОСВІДОМ (УРОКИ, ФАКУЛЬТАТИВИ, ПОЗАКЛАСНА РОБОТА) » 8.6 Факультатив з програмування » Розв'язування задач методами процедурного програмування (Розв'язки цікавих задач олімпіадного та шкільного рівнів.)
Розв'язування задач методами процедурного програмування
Ковальчук_Олександр Дата: Нд, 21.10.2007, 16:37 | Повідомлення № 1
Ветеран спілкування
Повідомлень: 3705
Нагороди: 18
Рейтинг: 209
Пропоную в даній темі таке спілкування: хтось пише умову цікавої задачі з програмування, інші - намагаються розв'язати цю задачу і надіслати текст програми в цю тему з повним роз'ясненням розв'язку. Задачі можуть бути як шкільного, так і олімпіадного рівнів. Дана тема допоможе реально підвищити знання з програмування вчителям, які погано розуміються на задачах олімпіадного рівня. Нажаль, я також відносюся до цієї групи вчителів. Соромно, але факт.

Шановні форумчани!!!!!
Повідомлення, які не відповідають темі або несуть некорисний зміст будуть видалятись без попередження!!!
dpi Дата: Ср, 09.04.2008, 11:43 | Повідомлення № 46
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
Что касается темы, без процедурного программирования и функций будет тоскливо для тех, кто пойдет дальше массивов.
AndruK Дата: Ср, 21.05.2008, 01:40 | Повідомлення № 47
Новий користувач
Повідомлень: 2
Нагороди: 0
Рейтинг: 0
Привет!...помогите мне пожалуста с завданням...але ево нада решыть в GWBASIC ...вот задача:
Сформувати файл, що містить інформацію про книги за таким зразком: прізвище автора, назва, рік видання. Використовуючи сформований файл, знайти назви книг даного автора, рік видання. Прізвище автора ввести з клавіатури.
KulAlex Дата: Чт, 22.05.2008, 13:58 | Повідомлення № 48
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
Да................ "Заставили" пригадати дитинство.
Якщо Ви вивчаєте basic в школі, то раджу перейти хоча б на Pascal, рекомендую С++ або С#.

Розвязати цю задачу можна приблизно так.

10 CLS
20 INPUT "kilkist knig";K
30 OPEN "basa.txt" FOR OUTPUT AS #1
40 FOR I=1 TO K
45 PRINT "zapis",I
50 INPUT "Avtor";A$
60 INPUT "Kniga";N$
70 INPUT "Rik",R
80 PRINT #1,A$
90 PRINT #1,N$
100 PRINT #1,R
110 NEXT I
120 CLOSE #1
125 OPEN "basa.txt" FOR INPUT AS #1
130 INPUT "Avtor dlya poisk"; P$
140 FOR I=1 TO K
150 INPUT #1, A$
160 INPUT #1, N$
170 INPUT #1, R
180 IF P$=A$ THEN PRINT A$,N$,R
190 NEXT I

Якщо виникли питання звертайтесь

Відредаговано: KulAlex - Чт, 22.05.2008, 14:29
Varkan Дата: Чт, 22.05.2008, 14:18 | Повідомлення № 49
Викладач ВУЗу
Повідомлень: 425
Нагороди: 0
Рейтинг: 6
Широко известна игра "Города". Называется какой-нибудь город, допустим, "Саратов". Кончается на "в", значит требуется назвать другой город, у которого в названии первая буква "в". Это может быть "Воронеж". Следующий город должен начинаться на "ж" и т.д. Запрещено повторять название городов. Надо написать программу, которая из набора названий городов (все названия разные) строит цепочку максимальной длины.
dpi Дата: Нд, 08.06.2008, 14:19 | Повідомлення № 50
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
Quote (KulAlex)
Да................ "Заставили" пригадати дитинство.

Quote (KulAlex)
10 CLS...90 NEXT I

Супер!!!

Додано (08.06.2008, 14:19)
---------------------------------------------
На самом деле, было приятно прочитать код на Бейсике, мы все снего начинали.

Morpheuz Дата: Нд, 08.06.2008, 22:13 | Повідомлення № 51
Я тут недавно...
Повідомлень: 36
Нагороди: 0
Рейтинг: 3
dpi,
В C# не надо обнулять переменные, потому что они есть обьекты, и они обнуляються при вызове конструктора.
Ладно и подкину задачку интересную, в универах часто такие дают на олимпиадах, думаю и на школьных подобные могу попадаться.
Есть два 32-х значных числа, нужно найти их сумму(произведение, частное...). Вот такая задачка, если в кратце, естественно нужно переменные эти вводить, результат выводить...
dpi Дата: Пн, 09.06.2008, 11:22 | Повідомлення № 52
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

void ReadLong(long A[],char *dch);
void fwrite(long A[]);
void sum (long A[],long B[],long C[]);
const int N=1000;
//-------------------------------------------------------------
int main()
{ clrscr();
long mas1[N]={0};
long mas2[N]={0}; //v mas1[0]-m kolichestvo grup po 4
long mas3[N]={0}; //v ostalnih grupi v obratnom poriadke

char *ch1="1231223546540054644521000554"; // fin>>ch1;!!!
char *ch2="5452184584121212551001201";
cout<<"chislo 1:\n\n"<<ch1;
cout<<"\n\nchislo 2:\n\n"<<ch2;

ReadLong(mas1,ch1);
cout<<"\n\n\n\n1 massiv v obratnom poriadke:\n\n";
for (int i=0;i<=mas1[0];i++)
cout<<mas1[i]<<" ";

ReadLong(mas2,ch2);
cout<<"\n\n2 massiv v obratnom poriadke:\n\n";
for (i=0;i<=mas2[0];i++)
cout<<mas2[i]<<" ";

sum (mas1,mas2,mas3);
cout<<"\n\n\n\n3 massiv - summa 1+2:\n\n";
for (i=0;i<=mas3[0];i++)
cout<<mas3[i]<<" ";

cout<<"\n\n\nVvivod summi dlinih chisel:\n\n";
fwrite(mas3);

getch();
return 0;
}//------------------------------------------------------------

void ReadLong(long A[],char *dch)
{
char *ch;
int j=0;
while (dch[j]!='\0')
{
ch[0]=dch[j];
for (int i=A[0];i>=1;i--)
{
A[i+1]=A[i+1]+(A[i]*10)/10000;
A[i]=(A[i]*10)%10000;
}
A[1]=A[1]+atoi(ch);
if (A[A[0]+1]>0) A[0]++;
j++;
}
}//-------------------------------------------------------------

void fwrite(long A[])
{
int s,k;
cout<<A[A[0]];
for (int i=A[0]-1;i>=1;i--)
{
s=A[i];k=0;
while (s!=0)
{
s=s/10; k++;
}
while (k<4)
{
cout<<0; k++;
}
cout<<A[i];
}
cout<<"\n\n\n\nPress key to continue...";
}

void sum (long A[],long B[],long C[])
{
int i,k;
if (A[0]>B[0]) k=A[0];
else k=B[0];
for (i=1;i<=k;i++)
{
C[i+1]=(A[i]+B[i]+C[i])/10000;
C[i]=(A[i]+B[i]+C[i])%10000;
}
if (C[k+1]==0) C[0]=k;
else C[0]=k+1;
}

В 2006 году переделывал с Паскаля Окулова да и то на Борланде 3.1
Только складывает. Но работала.

KulAlex Дата: Ср, 11.06.2008, 10:46 | Повідомлення № 53
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
Взагалі довга арифметика це окремий розділ і необхідний розділ олімпіадного програмування!!!!!! Є багато алгоритмів додавання, віднімання ....., я пропоную один із них, на мою думку простий.

Додавання:
var a,b:string;
mc:array[1..300] of byte;
i:integer;
la:byte absolute a;
lb:byte absolute b;
Function max(a,b:byte):integer;
begin
max:=a;
if b>max then max:=b
end;
begin
readln(a);
readln(b);
for i:=1 to la do
mc[i]:=byte(a[la-i+1])-48;
for i:=1 to lb do
inc(mc[i],byte(a[lb-i+1])-48);
for i:=1 to max(la,lb) do
if mc[i]>9 then
begin
inc(mc[i+1]);
dec(mc[i],10);
end;
for i:=max(la,lb)+1 downto 1 do
write(mc[i])
end.

Додано (11.06.2008, 07:55)
---------------------------------------------
Множення довго на коротке:
var a:string;
b:longint;
mc:array[1..300] of longint;
i:integer;
la:byte absolute a;

begin
readln(a);
readln(b);
for i:=1 to la do
mc[i]:=byte(a[la-i+1])-48;
for i:=1 to la do
mc[i]:=mc[i]*b;
for i:=1 to la do
if mc[i]>9 then
begin
inc(mc[i+1],mc[i] div 10);
mc[i]:=mc[i] mod 10;
end;
for i:=la+1 downto 1 do
write(mc[i])
end.

Додано (11.06.2008, 10:17)
---------------------------------------------
Множення довго числа на довге:
var a,b:string;
ma,mb,mc:array[1..300] of longint;
i,j:integer;
la:byte absolute a;
lb:byte absolute b;

begin
readln(a);
readln(b);
for i:=1 to la do
ma[i]:=byte(a[la-i+1])-48;
for i:=1 to lb do
mb[i]:=byte(b[lb-i+1])-48;
for i:=1 to la do
for j:=1 to lb do
inc(mc[i+j-1],ma[i]*mb[j]);
for i:=1 to la+lb-2 do
if mc[i]>9 then
begin
inc(mc[i+1],mc[i] div 10);
mc[i]:=mc[i] mod 10;
end;
for i:=la+lb-1 downto 1 do
write(mc[i])
end.

Додано (11.06.2008, 10:46)
---------------------------------------------
Ділення довго на коротке:

var a:string;
b:longint;
ma,mc:array[1..300] of longint;
i,ost:integer;
la:byte absolute a;

begin
readln(a);
readln(b);
for i:=1 to la do
ma[i]:=byte(a[i])-48;
ost:=0;
for i:=1 to la do
begin
ost:=ost*10+ma[i];
mc[i]:=ost div b;
ost:=ost mod b
end;
for i:=1 to la do
write(mc[i]);
writeln('(',ost,')');
end.

Відносно цього алгоритму, чому я його написав:
1. ost - це остача від ділення;
2. Масив mc - це ділення націло;
3. А якщо потрібно поділити з якоюсь точністю то дописати до числа "а" відповідну кількість "0".

Ну все нехочу більше писати, якщо потрібно ще щось відносно довгої арифметики ЗВЕРТАЙТЕСЬ.

Відредаговано: KulAlex - Ср, 11.06.2008, 10:22
dpi Дата: Чт, 12.06.2008, 09:37 | Повідомлення № 54
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
У меня в MinGW нет файла large.h, но есть largeint.h.
Как работать со второй или где взять первую?
Pro100 Дата: Ср, 05.11.2008, 19:41 | Повідомлення № 55
Новий користувач
Повідомлень: 1
Нагороди: 0
Рейтинг: 0
А помогите мне решить задачку
Ввести число (0..255) и вывести его факториал.Если можна написать на Pascal
filnick Дата: Ср, 05.11.2008, 19:53 | Повідомлення № 56
Мудрий вчитель
Повідомлень: 2238
Нагороди: 7
Рейтинг: 124
Quote (Pro100)
Ввести число (0..255) и вывести его факториал.Если можна написать на Pascal

Если требуется в ответе получить разбитые на разряды ВСЕ цифры, то нужно представить числа в текстовом формате.
В противном случае - решение в школьном учебнике по программированию.
TYP Дата: Ср, 05.11.2008, 20:19 | Повідомлення № 57
Прописаний назавжди
Повідомлень: 467
Нагороди: 6
Рейтинг: 58
А можна ще про черепаху? на сайті http://olympiads.ru/sng/2/description1.shtml є пояснення розвязку. Там взагалі дуже цікаві задачі.
dpi Дата: Чт, 06.11.2008, 07:58 | Повідомлення № 58
Досвідчений вчитель
Повідомлень: 1438
Нагороди: 1
Рейтинг: 39
Из раздела "Динамическое программирование" - это самая первая и простая задача.
Срздать пустой массив.
Передвигаясь по закону, который вы описали, двигаться по всем клеткам заполняя их наименьшими суммами
складывая число из первого массива с меньшей суммой слева или сверх второго массива.
b[i][j]=a[i][j]+max(a[i-1][j],a[i][j-1]);
Нижняя правая ячейка - ответ.
KulAlex Дата: Чт, 06.11.2008, 20:58 | Повідомлення № 59
Знаток програмування
Повідомлень: 326
Нагороди: 6
Рейтинг: 19
Quote (Pro100)
Ввести число (0..255) и вывести его факториал.Если можна написать на Pascal

var a:string;
b:longint;
mc:array[1..1000] of longint;
k,i:integer;

begin
mc[1]:=1;
readln(k);
if k=0 then writeln('0!=1') else
begin
for b:=1 to k do
begin
for i:=1 to 1000 do
mc[i]:=mc[i]*b;
for i:=1 to 999 do
if mc[i]>9 then
begin
inc(mc[i+1],mc[i] div 10);
mc[i]:=mc[i] mod 10
end
end;
k:=1000;
while mc[k]=0 do dec(k);
write(b,'!=');
for i:=k downto 1 do
write(mc[i])
end
end.

Неоптимально, але працює

Відредаговано: KulAlex - Чт, 06.11.2008, 21:00
Bandalak Дата: Вт, 11.11.2008, 11:19 | Повідомлення № 60
Лідер форуму
Повідомлень: 6174
Нагороди: 43
Рейтинг: 285
Quote (KulAlex)
la:byte absolute a;
lb:byte absolute b;

Я такий запис не зустрічав! Що це означає?

Форум інформатиків » РОЗДІЛ VIІІ: ОБМІН ДОСВІДОМ (УРОКИ, ФАКУЛЬТАТИВИ, ПОЗАКЛАСНА РОБОТА) » 8.6 Факультатив з програмування » Розв'язування задач методами процедурного програмування (Розв'язки цікавих задач олімпіадного та шкільного рівнів.)
Пошук:


© Форум інформатиків України, 2007-2019.