Помогите пожалуста..полный завал... Мне нужно написать обучающую программу по переводу чисел... Она должна обучать переводу пользователя... Совсем не знаю как это сделать.. Буду очень благодарен!!!
volvo
3.06.2009 21:21
Переводу чисел КУДА? Каких чисел? Точнее можно изъясняться?
DeIYIoN
3.06.2009 21:25
Перевод из одной системы счисления в другую...системы счисления могут быть разными...
volvo
3.06.2009 21:32
А теперь - уточни, что именно ты подразумеваешь под
Цитата
Она должна обучать переводу пользователя...
Вот я - пользователь, что должна делать программа, если я хочу обучиться переводу чисел из СС с основанием 10 в СС с основанием 7? Пошагово, пожалуйста...
Это ни разу не придирка, ты просто написал "обучить", но чтоб обучить одного, достаточно показать ему результат и написать алгоритм (словами), а чтоб научить другого - надо рассказывать, какая цифра откуда взялась, и еще цветную "мультипликацию" сделать, чтоб он понял... Итак, что должна делать программа в моем случае?
Опять же, числа - только целые, или возможны еще и вещественные?
DeIYIoN
3.06.2009 21:40
Т. е. если конечно я сам понимаю правильно...она должна показывать как осуществляется перевод числа из одной системы счисления в другую пошагово...т.е. что как бы делал я что бы перевести это чило в ручную.. Наверно необхадимо сделать что то вроде меню..с выбором пути перевода(из n-ой в 10-ную, из 10-ной в n-ую)...у меня сложность и возникла с тем что я не знаю как сделать программу обучающей...
Добавлено через 2 мин. ..да забыл...нужно хотя бы сделать только для целых чисел...
Добавлено через 3 мин. ..да и ещё забыл...было бы конечно не плохо с, как ты написал, "мультипликацией"(это сложно наверно очень)...но наверно достаточно было бы что б был написан алгоритм перевода и ответ...
Lapp
3.06.2009 22:56
Цитата(DeIYIoN @ 3.06.2009 18:40)
как сделать программу обучающей... ... было бы конечно не плохо с, как ты написал, "мультипликацией"(это сложно наверно очень)...но наверно достаточно было бы что б был написан алгоритм перевода и ответ...
Я шибко звиняюсь за оффтоп, но странна мне эта идея весьма.. Забавен сам ход мысли преподавателя, который такое задает. Так и видится, что он насмотрелся всяких флэшек подобного рода, и в его сознании они подменили суть мишурой..
DeIYIoN
3.06.2009 23:00
Так значит никто мне не поможет....жаль...если не здам прогу могу собираться в армию...
Lapp
3.06.2009 23:09
Цитата(DeIYIoN @ 3.06.2009 20:00)
Так значит никто мне не поможет....жаль...если не здам прогу могу собираться в армию...
Эй, cool down, pal)). Зачем так? Поможем, конечно. Главное, чтоб ты помогал нам помогать тебе)). Я подумаю..
PS Ты бы лучше убрал первую строчку...
DeIYIoN
3.06.2009 23:14
Так значит никто мне не поможет....жаль...если не здам прогу могу собираться в армию...
Добавлено через 8 мин. Сори за повтор...не совсем разобрался как удалять первуюю строчку..
Добавлено через 1 мин.
Цитата(Lapp @ 3.06.2009 20:09)
Эй, cool down, pal)). Зачем так? Поможем, конечно. Главное, чтоб ты помогал нам помогать тебе)). Я подумаю..
Просто я уже отчаялся...
Lapp
3.06.2009 23:29
Цитата(DeIYIoN @ 3.06.2009 20:14)
Просто я уже отчаялся...
Ты можешь для начала посмотреть в FAQе про перевод и сделать просто прогу для перевода? Потом ее доработаем для обучения.
DeIYIoN
3.06.2009 23:56
Прога для перевода есть...написано правда коряво, но...
Lapp
4.06.2009 0:11
Цитата(DeIYIoN @ 3.06.2009 20:56)
Прога для перевода есть
Дык. Давай..
DeIYIoN
4.06.2009 0:14
коряво потому что писал сам...
Вот...(Показать/Скрыть)
program schisleniya; uses crt; label 1,2,3,4; var a:char; b2,ss,b,s:string; os,c,e,ch,p,i,j,n,k,t:integer;
procedure goto_xy(x,y:byte); assembler; asm mov ah,2 xor bh,bh mov dh,y mov dl,x dec dh dec dl int 10h end;
procedure Zast; const LU = #218; RU = #191; LD = #192; RD = #217; H = #196; V = #179; X1 = 6; Y1 = 10; X2 = 83; Y2 = 35; Txt = 'Press any key'; Var k : integer; begin clrscr; TextBackground(11); clrscr; Window(X1, Y1, X2, Y2); TextBackground(8); TextColor(Yellow); Clrscr;
1: clrscr; ch:=0; ss:=''; writeln('1. PEREVOD CHISEL IZ 10-nou SISTEMU SCHISLENIYA VO VVEDENNYU'); writeln; writeln('2. PEREVOD CHISEL IZ VVEDENNOY SISTEMU SCHISLENIYA V 10-nuy'); writeln; write('viberete neobhadimoe deistvie (1/2) '); readln(t); if t=1 then goto 3; if t=2 then goto 4 else writeln; writeln('Takogo punkta v menu net!!!'); ReadKey; goto 1;
3: clrscr; s:='123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_';{36} writeln('PEREVOD CHISEL IZ 10-nou SISTEMU SCHISLENIYA VO VVEDENNYU'); writeln; writeln('Vvedite chislo'); read(n); writeln('Vvedite sistemy schisleniya'); read(k); while n>=1 do begin p:=n mod k; if p>=10 then b:=copy(s,p,1) else str(p,b); ss:=b+ss; n:=n div k; end; writeln('polychilos ',ss); goto 2;
4: clrscr; writeln('PEREVOD CHISEL IZ VVEDENNOY SISTEMU SCHISLENIYA V 10-nuy'); writeln; writeln('Vvedite sistemy schisleniya'); readLN(k); writeln('Vvedite chislo v vvedennoy sisteme schisleniya'); readln(sS); c:=length(ss); for i:=1 to c do begin b:=copy(ss,i,1); for j:=1 to 36 do begin b2:=copy(s,j,1); if b=b2 then os:=j; end; ch:=k*ch+os; end; writeln('polychilos ',ch);
2: goto_xy(1,9); write('Џа®¤®«¦Ё¬, (Y/N)? '); read(a); case a of 'Y','y': goto 1; 'N','n': halt else goto 2; end; End.
Сча попробую изменить используя информацию которую нашел тут...
DeIYIoN
5.06.2009 1:06
Нашел темы В FAQ про перевод чисел с двумя функциями перевода..и как их объеденить в одной программе..там ведь переменая "n" разных типов....я не очень силен в Поскале...
Вот что у меня получилось...(Показать/Скрыть)
program schisleniya; uses crt; label 1,2,3,4; var a:char; i,t:integer; radix: longint; n:string;
procedure goto_xy(x,y:byte); assembler; asm mov ah,2 xor bh,bh mov dh,y mov dl,x dec dh dec dl int 10h end;
procedure Zast; const LU = #218; RU = #191; LD = #192; RD = #217; H = #196; V = #179; X1 = 6; Y1 = 10; X2 = 83; Y2 = 35; Txt = 'Press any key'; Var k : integer; begin clrscr; TextBackground(11); clrscr; Window(X1, Y1, X2, Y2); TextBackground(8); TextColor(Yellow); Clrscr;
function FromDec(n, radix:longint):string; var s:string; const digit: string[16]='0123456789ABCDEF'; begin s:=''; repeat s:=digit[(n mod radix)+1]+s; n:=n div radix; until n=0; FromDec:=s; end;
function ToDec(n:string; radix:longint):longint; var m, i:longint; const digit:string[16]='0123456789ABCDEF'; begin m:=0; while(n[1]='0') and (length(n)>1) do delete(n,1,1); for i:=1 to length(n) do m:=m*radix+pos(n[i],digit)-1; ToDec:=m; end;
begin Zast;
writeln('1. PEREVOD CHISEL IZ 10-nou SISTEMU SCHISLENIYA VO VVEDENNYU'); writeln; writeln('2. PEREVOD CHISEL IZ VVEDENNOY SISTEMU SCHISLENIYA V 10-nuy'); writeln; write('viberete neobhadimoe deistvie (1/2) '); readln(t); if t=1 then goto 3; if t=2 then goto 4 else writeln; writeln('Takogo punkta v menu net!!!'); ReadKey; goto 1;
3: clrscr; writeln('PEREVOD CHISEL IZ 10-nou SISTEMU SCHISLENIYA V "G" SISTEMY SCHISLENIYA'); writeln;
4: clrscr; writeln('PEREVOD CHISEL IZ "G" SISTEMU SCHISLENIYA V 10-nuy'); writeln; writeln('Vvedite sistemy schisleniya '); readln(radix); writeln('Vvedite chislo '); readln(n); writeln('polychilos ',ToDec(n,radix));
2: goto_xy(1,9); write('Џа®¤®«¦Ё¬, (Y/N)? '); read(a); case a of 'Y','y': goto 1; 'N','n': halt else goto 2; end; End.
Lapp
5.06.2009 19:43
Я долго думал, как "обучать", и придумал нечто совсем простое. Но мне кажется, что основная идея тут соблюдена. Программа не дописана, поскольку я решил, что надо спросить, пойдет ли такой стиль.
type var a: string; b,v: LongInt; d: integer; c: char; i,n: integer; Good: boolean; Digs: set of char;
begin Write('Введите основание исходной системы счисления (от 1 до 37): '); ReadLn(b); if b>9 then d:=9 else d:=b-1; WriteLn('В системе с основанием ',b,' для ввода числа вы можете использовать'); Write('цифры от 0 до ',d); if b=11 then Write(' и латинскую букву A') else if b>11 then Write(' и латинские буквы от A до ',Chr(b+54)); WriteLn; if b>10 then WriteLn('при этом буквы имеют такие числовыме значения:'); for i:=10 to b-1 do WriteLn(Chr(i+55),' = ',i); WriteLn;
Digs:=[]; for c:='0' to Chr(d+48) do Include(Digs,c); for c:='A' to Chr(b+54) do Include(Digs,c);
repeat Write('Введите число для перевода: '); ReadLn(a); for i:=1 to Length(a) do a[i]:=UpCase(a[i]); Good:=true; for i:=1 to Length(a) do Good:=Good and (a[i] in Digs); if not Good then WriteLn('Вы ввели неправильный символ. Повторите ввод.'); until Good; n:=Length(a);
WriteLn('Теперь переведем число в машинное представление.'); WriteLn('Для этого воспользуемся формулой:'); WriteLn('m = a[0] + a[1]*b + a[2]*b^2 + a[3]*b^3 + ... + a[n]*b^n'); WriteLn('Здесь символ ^ означает возведение в степень,'); WriteLn('цифры в числе пронумерованы справа налево.'); WriteLn; WriteLn('В нашем случае это будет выглядеть так:'); for i:=1 to n do begin if i>1 then Write(' + '); Write(DigVal(a[n-i+1])); if i>1 then Write('*',b); if i>2 then Write('^',i-1); end;
v:=DigVal(a[1]); for i:=2 to n do v:=v*b+DigVal(a[i]);
WriteLn; WriteLn('Произведя вычисления, получим:'); WriteLn(v); WriteLn('- тут использована десятичная запись.');
WriteLn('Теперь введите основание системы счисления,'); Write('в которую вы хотите преревести ваше число (от 1 до 37): '); ReadLn(b); WriteLn; WriteLn('Перевод будем осуществлять в цикле...');
ReadLn end.
Естественно, всяких красивостей можно добавить. Типа чистить экран, разноцветность всякая..
DeIYIoN
5.06.2009 21:51
А можно как нить переносить текст сразу в Паскаль...не переписывая вручную..?
Lapp
5.06.2009 22:00
Цитата(DeIYIoN @ 5.06.2009 18:51)
А можно как нить переносить текст сразу в Паскаль...не переписывая вручную..?
copy - paste?
а, понял, у тебя кодировка слетает.. Ты FAR'ом не пользуешься?
1. Скопируй текст программы (выделить и Ctrl-C) 2. в Фаре начни новый файл Shift-F4 3. Сделай кодировку DOS до вставки 4. Вставь (Ctrl-V) 5. Сохрани с нужным названием (F2) 6. выйди и зайти в ТР 7. открой этот файл в ТР
Добавлено через 1 мин. Менять кодировку клавишей F8, кодировка написана в верхней строке
DeIYIoN
5.06.2009 22:11
Долго буду смотреть..потому что у меня в Паскале нет руского языка..так что я пока переписываю текст что б понять программу...
Добавлено через 10 мин. Всё супер...можно доделывать программу...
DeIYIoN
5.06.2009 23:40
Долго ещё дописывать..?
Lapp
6.06.2009 2:28
Цитата(DeIYIoN @ 5.06.2009 20:40)
Долго ещё дописывать..?
Вот, не знаю, с какой скоростью ты дописываешь. Оценивай сам.
Слушай, я тебе дал идею и написал половину проги. Ты серьезно считаешь, что совсем не должен приложить руку, а все тебе только должны? Я готов помогать и дальше, но только если ты что-то будешь делать.
DeIYIoN
6.06.2009 16:24
Нет, я так не считаю..извини что надоел уже изрядно...я просто не очень силен в программировании... И я честно говоря не могу понять что должно идти дальше...
DeIYIoN
9.06.2009 0:08
В общем вот что у меня получилось...(Показать/Скрыть)
program schisleniya; uses crt; var a,c:char; i,t,d:integer; radix: longint; n_str,b:string; n_long,h:longint; Digs: set of char;
procedure Zast; const LU = #218; RU = #191; LD = #192; RD = #217; H = #196; V = #179; X1 = 6; Y1 = 10; X2 = 83; Y2 = 35; Txt = 'Press any key'; Var k : integer; begin clrscr; TextBackground(11); clrscr; Window(X1, Y1, X2, Y2); TextBackground(8); TextColor(Yellow); Clrscr;
function FromDec(n, radix:longint):string; var s:string; const digit: string[16]='0123456789ABCDEF'; begin s:=''; repeat s:=digit[(n mod radix)+1]+s; n:=n div radix; until n=0; FromDec:=s; end;
function ToDec(n:string; radix:longint):longint; var m, i:longint; const digit:string[16]='0123456789ABCDEF'; begin m:=0; while(n[1]='0') and (length(n)>1) do delete(n,1,1); for i:=1 to length(n) do m:=m*radix+pos(n[i],digit)-1; ToDec:=m; end;
begin Zast;
repeat writeln; writeln('1. PEREVOD CHISEL IZ 10-nou SISTEMU SCHISLENIYA V "G"'); writeln; writeln('2. PEREVOD CHISEL IZ "G" SISTEMU SCHISLENIYA V 10-nuy'); writeln; writeln('3. Vihod.'); Writeln; write('viberete neobhadimoe deistvie (1/2) '); readln(t); case t of 1: begin clrscr; writeln('PEREVOD CHISEL IZ 10-nou SISTEMU SCHISLENIYA V "G" SISTEMY SCHISLENIYA'); writeln; Writeln('Perevod chisel iz 10-noy sistemi schisleniya v "G" osyschestvlyaetsya'); Writeln('po sleduyschemy pravilu:'); Writeln; Writeln('1. Razdelit chislo na osnovanie sistemi "G", toy sistemi, v kotoruy '); Writeln(' vi hotite perevesti eto choslo.'); Writeln; Writeln('2. Poluchenoe nepolnoe chastnoe opyat razdelit na osnovanie sistemi.'); Writeln; Writeln('3. Povtoryat punkt 2 do teh por, poka poluchennoe nepolnoe chstnoe'); Writeln(' ne budet menshe osnovaniya.'); Writeln; Writeln('4. Zapisat ostatki ot deleniya v poryadke "ot poslednego k pervomy",'); Writeln(' nachinaya s poslednego chastnogo.'); Writeln; if radix>9 then Writeln('Cifri bolshie 9 zapisivaem soglasno ih bykvennomu ekvivalentu!'); Writeln; readkey; clrscr; Writeln('Rassmotrim primer: perevesti chislo 11 iz 10-noy v 2-nuy sistemu schisleniya.'); Writeln; Writeln('11:2=5 (ostatok "1");'); Writeln('5:2=2 (ostatok "1");'); Writeln('2:2=1 (ostatok "0").'); Writeln; Writeln('Zapisivaem ostatki v obratnom ot ih polucheiya poryadke, nachinaya'); Writeln('s poslednego chastnogo:'); Writeln('11(v 10-noy) = 1011(v 2-noy)'); Writeln; Writeln('Teper proverim vashi znaniya...'); Writeln; readkey; clrscr; repeat write('Vvedite sistemy schisleniya, v kotoruy vi hotite perevesti chislo: '); readln(radix); Writeln; if radix>9 then d:=9 else d:=radix-1; WriteLn('V sisteme s osnovaniem ',radix,' dlya zapisi chisla vi mogete ispolzovat'); Write('cifri ot 0 do ',d); if radix=11 then Write(' i latinskyu bykvy A') else if radix>11 then Write(' i latinskie bykvi ot A do ',Chr(radix+54)); WriteLn; if radix>10 then WriteLn('pri etom bykvi imeut takie znacheniyaя:'); for i:=10 to radix-1 do WriteLn(Chr(i+55),' = ',i); WriteLn; Digs:=[]; for c:='0' to Chr(d+48) do Include(Digs,c); for c:='A' to Chr(radix+54) do Include(Digs,c); Writeln; write('Vvedite chislo, kotoroe vi budete perevodit: '); readln(n_long); writeln; writeln('Teper ispolzuyte pravila perevoda i perevedite chislo v neobhadimuy'); writeln('sistemu schisleniya'); writeln; write('Vvedite chislo, kotoroe u vas poluchilos - ');readln(b); if b<>FromDec(n_long,radix) then Writeln('Otvet ne verniy! Poprobuyte eche raz...') else Writeln('Congratilation!!! Otvet veren!'); until b=FromDec(n_long,radix); end; 2: begin clrscr; writeln('PEREVOD CHISEL IZ "G" SISTEMU SCHISLENIYA V 10-nuy'); writeln; WriteLn('Dlya perevoda chisla iz "G" sistemi schisleniya v 10-nuy nugno vospolzovatsya'); WriteLn('pravilom: '); Writeln; Writeln('1. Pronumerovat razryadi chisla s prava na levo, nachinaya s 0.'); Writeln; Writeln('2. Predstavit ishodnoe chislo v vvide:'); Writeln(' A = a[0]*G^0 + a[1]*G^1 + a[2]*G^2 + a[3]*G^3 + ... + a[n]*G^n,'); Writeln(' gde v skobkah ykazan razryad chisla, simvol ^ oznachaet vozvedenie v stepen,'); Writeln(' A - nashe chislo v 10-noy sisteme schisleniya.'); Writeln; readkey; Writeln('Rassmotrim primer: perevesti chislo 1011 iz 2-noy v 10-nuy sistemy shisleniya.'); Writeln; Writeln('1011(v 2-noy)=1*2^0+1*2^1+0*2^2+1*2^3=1+2+0+8=11(v 10-noy)'); repeat write('Vvedite sistemy schisleniya, iz kotoroy vi budete perevodit chislo: '); readln(radix); Writeln; if radix>9 then d:=9 else d:=radix-1; WriteLn('V sisteme s osnovaniem ',radix,' dlya zapisi chisla vi mogete ispolzovat'); Write('cifri ot 0 do ',d); if radix=11 then Write(' i latinskyu bykvy A') else if radix>11 then Write(' i latinskie bykvi ot A do ',Chr(radix+54)); WriteLn; if radix>10 then WriteLn('pri etom bykvi imeut takie znacheniyaя:'); for i:=10 to radix-1 do WriteLn(Chr(i+55),' = ',i); WriteLn; Digs:=[]; for c:='0' to Chr(d+48) do Include(Digs,c); for c:='A' to Chr(radix+54) do Include(Digs,c); Writeln; write('Vvedite chislo, kotoroe vi budete perevodit: '); readln(n_str); writeln; writeln('Teper ispolzuyte pravila perevoda i perevedite chislo v 10-nuy sistemu'); writeln('schisleniya'); writeln; write('Vvedite chislo, kotoroe u vas poluchilos - ');readln(h); writeln; if h<>ToDec(n_str,radix) then Writeln('Otvet ne verniy! Poprobuyte eche raz...') else Writeln('Congratilation!!! Otvet veren!'); writeln; until h=ToDec(n_str,radix); end;
3: halt
else begin writeln('Takogo punkta v menu net!!!'); ReadKey; end; end;
write('once again? (Y/N)'); readln(a); clrscr; until not (a in ['Y', 'y']); End.
Но тут есть проблема...во 2 пункте..нужно ввести число в выбранной системе счисления...но там буквы ввести нельзя...не подскажете как это можно исправить..? И еще может у кого нить есть идеи как разместить весь этот текст на экране..?
Lapp
9.06.2009 1:05
Цитата(DeIYIoN @ 8.06.2009 21:08)
во 2 пункте..нужно ввести число в выбранной системе счисления...но там буквы ввести нельзя...не подскажете как это можно исправить..?
Я не понял, где этот ввод. Скопируй сюда кусок, о котором ты говоришь.
DeIYIoN
9.06.2009 1:13
Прошу прощения! Ошибся немного...запутался...
volvo
9.06.2009 1:15
Ну, так у тебя H описано как LongInt, а когда вводишь число в СС отличной от 10, надо вообще-то вводить его как строку.
Но: у тебя ж написано, что надо перевести число в 10-ную СС, и "показать, что получилось", какие же буквы A .. F? Так что ты для себя реши, тебе надо 10-ное представление вводить, или все-таки в другой СС...
DeIYIoN
9.06.2009 1:20
Lap хочу поблагодарить Вас за помощь и Volvo тоже первого за идеи...второго за помощь в создании меню.. БАЛЬШОЕ СПАСИБО!!!
А как вам такой метеод "обучающей" программы..?
Добавлено через 2 мин. И что нить скажете по размещению текста..?
Lapp
9.06.2009 2:51
Цитата(DeIYIoN @ 8.06.2009 22:20)
Lap хочу поблагодарить Вас за помощь и Volvo тоже первого за идеи...второго за помощь в создании меню.. БАЛЬШОЕ СПАСИБО!!!
Пожалуйста
Я глану попозже сегодня, что ты там нахимичил))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.