 |
Вітаю Вас, Гість · RSS |
 |
Розв'язування задач методами процедурного програмування
| |
kom_adm |
Дата: Su, 21.10.2007, 16:37 | Повідомлення № 1 |
Ветеран спілкування
Повідомлень: 3767
| Пропоную в даній темі таке спілкування: хтось пише умову цікавої задачі з програмування, інші - намагаються розв'язати цю задачу і надіслати текст програми в цю тему з повним роз'ясненням розв'язку. Задачі можуть бути як шкільного, так і олімпіадного рівнів. Дана тема допоможе реально підвищити знання з програмування вчителям, які погано розуміються на задачах олімпіадного рівня. Нажаль, я також відносюся до цієї групи вчителів. Соромно, але факт. Шановні форумчани!!!!! Повідомлення, які не відповідають темі або несуть некорисний зміст будуть видалятись без попередження!!!
|
|
| |
dpi |
Дата: We, 09.04.2008, 11:43 | Повідомлення № 46 |
Досвідчений вчитель
Повідомлень: 1438
| Что касается темы, без процедурного программирования и функций будет тоскливо для тех, кто пойдет дальше массивов.
|
|
| |
AndruK |
Дата: We, 21.05.2008, 01:40 | Повідомлення № 47 |
Новий користувач
Повідомлень: 2
| Привет!...помогите мне пожалуста с завданням...але ево нада решыть в GWBASIC ...вот задача: Сформувати файл, що містить інформацію про книги за таким зразком: прізвище автора, назва, рік видання. Використовуючи сформований файл, знайти назви книг даного автора, рік видання. Прізвище автора ввести з клавіатури.
|
|
| |
KulAlex |
Дата: Th, 22.05.2008, 13:58 | Повідомлення № 48 |
Знаток програмування
Повідомлень: 326
| Да................ "Заставили" пригадати дитинство. Якщо Ви вивчаєте 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 - Th, 22.05.2008, 14:29 |
|
| |
Varkan |
Дата: Th, 22.05.2008, 14:18 | Повідомлення № 49 |
Викладач ВУЗу
Повідомлень: 425
| Широко известна игра "Города". Называется какой-нибудь город, допустим, "Саратов". Кончается на "в", значит требуется назвать другой город, у которого в названии первая буква "в". Это может быть "Воронеж". Следующий город должен начинаться на "ж" и т.д. Запрещено повторять название городов. Надо написать программу, которая из набора названий городов (все названия разные) строит цепочку максимальной длины.
|
|
| |
dpi |
Дата: Su, 08.06.2008, 14:19 | Повідомлення № 50 |
Досвідчений вчитель
Повідомлень: 1438
| Quote (KulAlex) Да................ "Заставили" пригадати дитинство. Quote (KulAlex) 10 CLS...90 NEXT I Супер!!!Додано (08.06.2008, 14:19) --------------------------------------------- На самом деле, было приятно прочитать код на Бейсике, мы все снего начинали.
|
|
| |
Morpheuz |
Дата: Su, 08.06.2008, 22:13 | Повідомлення № 51 |
Я тут недавно...
Повідомлень: 36
| dpi, В C# не надо обнулять переменные, потому что они есть обьекты, и они обнуляються при вызове конструктора. Ладно и подкину задачку интересную, в универах часто такие дают на олимпиадах, думаю и на школьных подобные могу попадаться. Есть два 32-х значных числа, нужно найти их сумму(произведение, частное...). Вот такая задачка, если в кратце, естественно нужно переменные эти вводить, результат выводить...
|
|
| |
dpi |
Дата: Mo, 09.06.2008, 11:22 | Повідомлення № 52 |
Досвідчений вчитель
Повідомлень: 1438
| #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 |
Дата: We, 11.06.2008, 10:46 | Повідомлення № 53 |
Знаток програмування
Повідомлень: 326
| Взагалі довга арифметика це окремий розділ і необхідний розділ олімпіадного програмування!!!!!! Є багато алгоритмів додавання, віднімання ....., я пропоную один із них, на мою думку простий. Додавання: 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 - We, 11.06.2008, 10:22 |
|
| |
dpi |
Дата: Th, 12.06.2008, 09:37 | Повідомлення № 54 |
Досвідчений вчитель
Повідомлень: 1438
| У меня в MinGW нет файла large.h, но есть largeint.h. Как работать со второй или где взять первую?
|
|
| |
Pro100 |
Дата: We, 05.11.2008, 19:41 | Повідомлення № 55 |
Новий користувач
Повідомлень: 1
| А помогите мне решить задачку Ввести число (0..255) и вывести его факториал.Если можна написать на Pascal
|
|
| |
filnick |
Дата: We, 05.11.2008, 19:53 | Повідомлення № 56 |
Мудрий вчитель
Повідомлень: 2238
| Quote (Pro100) Ввести число (0..255) и вывести его факториал.Если можна написать на Pascal Если требуется в ответе получить разбитые на разряды ВСЕ цифры, то нужно представить числа в текстовом формате. В противном случае - решение в школьном учебнике по программированию.
|
|
| |
TYP |
Дата: We, 05.11.2008, 20:19 | Повідомлення № 57 |
Прописаний назавжди
Повідомлень: 472
| А можна ще про черепаху? на сайті http://olympiads.ru/sng/2/description1.shtml є пояснення розвязку. Там взагалі дуже цікаві задачі.
|
|
| |
dpi |
Дата: Th, 06.11.2008, 07:58 | Повідомлення № 58 |
Досвідчений вчитель
Повідомлень: 1438
| Из раздела "Динамическое программирование" - это самая первая и простая задача. Срздать пустой массив. Передвигаясь по закону, который вы описали, двигаться по всем клеткам заполняя их наименьшими суммами складывая число из первого массива с меньшей суммой слева или сверх второго массива. b[i][j]=a[i][j]+max(a[i-1][j],a[i][j-1]); Нижняя правая ячейка - ответ.
|
|
| |
KulAlex |
Дата: Th, 06.11.2008, 20:58 | Повідомлення № 59 |
Знаток програмування
Повідомлень: 326
| 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 - Th, 06.11.2008, 21:00 |
|
| |
Bandalak |
Дата: Tu, 11.11.2008, 11:19 | Повідомлення № 60 |
Лідер форуму
Повідомлень: 6386
| Quote (KulAlex) la:byte absolute a; lb:byte absolute b; Я такий запис не зустрічав! Що це означає?
|
|
| |
© Форум інформатиків України, 2007-2022.  |