m9c1k
Гость
|
|
« : 24-06-2009 08:45 » |
|
Написать программу, в которой для конечных упорядоченных множеств реализовать все основные операции (Объединением,Пересечением,Разностью,Симметрической разностью) с помощью алгоритма типа слияния . Допустима организация множеств в виде списка или в виде массива. 1. На вход подаются два упорядоченных множества A и B (вводятся с клавиатуры, элементы множеств – буквы латинского алфавита). 2. После ввода множеств выбирается требуемая операция (посредством текстового меню, вводом определенного символа в ответ на запрос – выбор по желанию автора). 3. Программа посредством алгоритма типа слияния определяет результат выбранной операции и выдает его на экран с необходимыми пояснениями. Одновременно с результатом на экране должны присутствовать и исходные множества. 4.Возврат на п.2 (выбор операции). 5. Завершение работы программы – из п.2 (например, по ESC). Множества ввожу ,а дальше никак.Подскажите как правильно процедуры описать,чтобы их можно было в меню вызывать.Помогите исправить плз. Program dm1; uses crt; Type Simvol = set of 'a'..'z'; Var A,B:simvol; i:integer; x,key:char; begin A:=[]; B:=[]; i:=1; repeat clrscr; writeln(' Vvedite ',i,'-y element mnogestva A '); readln(x); if (x in A) then begin writeln(x,' uje sodergitsya v mnogestve A '); i:=i-1; end else begin writeln(x,' pomeschon v mnogestvo A '); A:=A+[x]; end; i:=i+1; until i>5; i:=1; repeat clrscr; writeln(' Vvedite ',i,'-y element mnogestva B '); readln(x); if (x in B) then begin writeln(x,' uje sodergitsya v mnogestve B '); i:=i-1; end else begin writeln(x,' pomeschon v mnogestvo B '); B:=B+[x]; end; i:=i+1;
until i>5; clrscr; writeln(' mnojestvo A: '); writeln; for x:='A' to 'z' do if x in A then write(x,' '); writeln; writeln(' mnojestvo B: '); writeln; for x:='A' to 'z' do if x in B then write(x,' '); procedure obyedinenie(c:chat):simvol; begin C:=A+B; writeln(C); end; procedure perese4enie(c:chat):simvol; begin C:=A*B; writeln(C); end; procedure raznosty(c:chat):simvol; C:=A-B; writeln(C); repeat clrscr; writeln('==========================='); writeln('1: obyedinenie'); writeln('2: perese4enie'); writeln('3: simmetr. raznosty'); writeln('4: raznosty'); writeln('o: vyhod'); key:=readkey; clrscr; case key of '1': obyedinenie(); '2': perese4enie(); '3': simmetr(); '4': raznosty();
until key='0'; end.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #1 : 24-06-2009 08:59 » |
|
Это работает? (оно даже не скомпилится) Не верю!
5. Завершение работы программы – из п.2 (например, по ESC). почитай про keypressed
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #2 : 24-06-2009 09:43 » |
|
упрощаем программу procedure vvod (name_set:string; var num_elem:integer; var one_set:simvol); var x:char; begin writeln('vvedite ', num_elem, ' element mnogestva ', name_set); readln(x); if (x in one_set) then begin writeln(x,' uje sodergitsya v mnogestve ', name_set); end else begin writeln(x,' pomeschon v mnogestvo', name_set'); one_set:=one_set+[x]; num_elem:=num_elem+1; end; end;
И программа превращается в элегантный код begin A:=[]; B:=[]; i:=1; repeat vvod('A',i,A); until i>5; i:=1; repeat vvod('B',i,B); until i>5; clrscr; vyvod('A',A); vyvod('B',B); repeat clrscr; writeln('==========================='); writeln('1: obyedinenie'); writeln('2: perese4enie'); writeln('3: simmetr. raznosty'); writeln('4: raznosty'); writeln('o: vyhod'); writeln('->'); repeat until KeyPressed; key:=ReadKey; case key of '1': begin obyedinenie();vyvod('C',C);end; '2': begin perese4enie();vyvod('C',C);end; '3': begin simmetr();vyvod('C',C);end; '4': begin raznosty();vyvod('C',C);end; end;
until ord(key)=ESC; end.
procedure vyvod (name_set:string; var one_set:simvol); var x: char; begin writeln(' mnojestvo ', name_set); for x:='a' to 'z' do if x in A then write(x,' '); writeln; end;
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
m9c1k
Гость
|
|
« Ответ #3 : 24-06-2009 10:45 » |
|
Огромное Пасибо Sla! Теперь буду разбираться)
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #4 : 24-06-2009 10:58 » |
|
тут я ошибся
procedure vyvod (name_set:string; var one_set:simvol);
но ошибка не сложная - связано с копипастом, думаю что разберешься и сделаешь по аналогии с procedure vvod ...
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
m9c1k
Гость
|
|
« Ответ #5 : 24-06-2009 11:25 » |
|
Можете помоч с этими процедурами? obyedinenie() perese4enie() simmetr() raznosty()
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #6 : 24-06-2009 11:29 » |
|
procedure obyedinenie(first_set,second_set:simvol; var tird_set:simvol); begin third_set:=first_set+second_set; end;
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
m9c1k
Гость
|
|
« Ответ #7 : 24-06-2009 13:17 » |
|
Теперь ему third_set не нравится в '1': obyedinenie(['C'],third_set); Пишет что неизвестный( Program dm1; uses crt; Type Simvol = set of 'a'..'z'; Var A,B,C:simvol; i:integer; x,key:char; procedure vvod(name_set:string; var num_elem:integer; var one_set:simvol); var x:char; begin writeln('vvedite ',num_elem,' element mnojestva ',name_set); readln(x); if (x in one_set) then begin writeln(x,' uje soderjitsya v mnojestve',name_set); end else begin writeln(x,' pomeschon v mnojestvo',name_set); one_set:=one_set+[x]; num_elem:=num_elem+1; end; end; procedure vyvod(name_set:string;var one_set:simvol); var x:char; begin writeln(' mnojestvo ',name_set); for x:='a' to 'z' do if x in A then write(x,' '); writeln; end;
procedure obyedinenie(first_set,second_set:simvol; var third_set:simvol); begin third_set:=first_set+second_set; end; procedure perese4enie(first_set,second_set:simvol; var third_set:simvol); begin third_set:=first_set*second_set; end; procedure raznosty(first_set,second_set:simvol; var third_set:simvol); begin third_set:=first_set-second_set; end; procedure simmetr(first_set,second_set:simvol; var third_set:simvol); begin third_set:=(first_set-second_set)+(second_set-first_set); end; begin A:=[]; B:=[]; i:=1; repeat vvod('A',i,A); until i>5; i:=1; repeat vvod('B',i,B); until i>5; clrscr; vyvod('A',A); vyvod('B',B); repeat clrscr; writeln('==========================='); writeln('1: obyedinenie'); writeln('2: perese4enie'); writeln('3: simmetr. raznosty'); writeln('4: raznosty'); writeln('o: vyhod'); writeln('->'); repeat until keyPressed; key:=readkey; case key of '1': obyedinenie('C',third_setC); vyvod('C',C);end; '2': perese4enie('C',third_set); vyvod('C',C);end; '3': simmetr('C',third_set); vyvod('C',C);end; '4': raznosty('C',third_set); vyvod('C',C);end; end; until ord(key)=ESC; end.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #8 : 24-06-2009 13:24 » |
|
m9c1k, так ведь правильно пишет!!! что(какое множество) должно быть передано в качестве third_set?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
m9c1k
Гость
|
|
« Ответ #9 : 24-06-2009 13:58 » |
|
Пишет после vyvod(... - ошибочная ссылка '1': obyedinenie(['C'],A,B); vyvod(['C'],C);end; '2': perese4enie(['C'],A,B); vyvod(['C'],C);end; '3': simmetr(['C'],A,B); vyvod(['C'],C);end; '4': raznosty(['C'],A,B); vyvod(['C'],C);end;
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #10 : 24-06-2009 14:16 » |
|
m9c1k, открываем учебник по паскалю, читаем про передачу параметров в процедуры и функции
процедура объявлена след. образом procedure obyedinenie(first_set,second_set:simvol; var tird_set:simvol);
прочитав про параметры, возможно ты поймешь, почему были использованы параметры-значения и параметр-переменная
Как правильно записать вызов процедуры obyedinenie ?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
m9c1k
Гость
|
|
« Ответ #11 : 25-06-2009 08:22 » |
|
Помогите исправить создание меню. Выход не работает и процедуры странно вводяться. Program dm1; uses crt; Type Simvol = set of 'a'..'z'; Var A,B,C:simvol; i:integer; x,key:char; procedure vvod(name_set:string; var num_elem:integer; var one_set:simvol); var x:char; begin writeln('vvedite ',num_elem,' element mnojestva ',name_set); readln(x); if (x in one_set) then begin writeln(x,' uje soderjitsya v mnojestve',name_set); end else begin writeln(x,' pomeschon v mnojestvo',name_set); one_set:=one_set+[x]; num_elem:=num_elem+1; end; end; procedure vyvod(name_set:string;var one_set:simvol); var x:char; begin writeln(' mnojestvo ',name_set); for x:='a' to 'z' do if x in one_set then write(x,' '); writeln; end;
procedure obyedinenie(first_set,second_set:simvol; var third_set:simvol); begin third_set:=first_set+second_set;
end; procedure perese4enie(first_set,second_set:simvol; var third_set:simvol); begin third_set:=first_set*second_set; end; procedure raznosty(first_set,second_set:simvol; var third_set:simvol); begin third_set:=first_set-second_set; end; procedure simmetr(first_set,second_set:simvol; var third_set:simvol); begin third_set:=(first_set-second_set)+(second_set-first_set); end; begin A:=[]; B:=[]; i:=1; repeat vvod('A',i,A); until i>5; i:=1; repeat vvod('B',i,B); until i>5; clrscr; vyvod('A',A); vyvod('B',B); repeat clrscr; writeln('======================='); writeln('1: obyedinenie'); writeln('2: perese4enie'); writeln('3: simmetr. raznosty'); writeln('4: raznosty'); writeln('0: vyhod'); writeln('======================='); writeln('->');
repeat until keyPressed; key:=readkey; case key of '1':begin obyedinenie(A,B,C); vyvod('C',C);end; '2':begin perese4enie(A,B,C); vyvod('C',C);end; '3':begin simmetr(A,B,C); vyvod('C',C);end; '4':begin raznosty(A,B,C); vyvod('C',C);end; end; readln(key); until ord(key)=0;
end.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #12 : 25-06-2009 08:29 » |
|
m9c1k, сделай следующее
repeat until keyPressed; key:=readkey; writeln('key =',key,'ord(key)=',ord(key));
и понажимай
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
m9c1k
Гость
|
|
« Ответ #13 : 25-06-2009 08:36 » |
|
всеравно не выходит ( clrscr; vyvod('A',A); vyvod('B',B); repeat clrscr; writeln('======================='); writeln('1: obyedinenie'); writeln('2: perese4enie'); writeln('3: simmetr. raznosty'); writeln('4: raznosty'); writeln('esk: vyhod'); writeln('======================='); writeln('->');
repeat until keyPressed; key:=readkey; writeln('key=',key,'ord(key)=',ord(key)); case key of '1':begin obyedinenie(A,B,C); vyvod('C',C);end; '2':begin perese4enie(A,B,C); vyvod('C',C);end; '3':begin simmetr(A,B,C); vyvod('C',C);end; '4':begin raznosty(A,B,C); vyvod('C',C);end; end; readln(key); until ord(key)=27;
end.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #14 : 25-06-2009 08:39 » |
|
m9c1k, какой результат?
напиши маленький кусочек программки (только меню) и расскажи что выводит почему ты сравниваешь с нулем, почему...
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
m9c1k
Гость
|
|
« Ответ #15 : 25-06-2009 08:44 » |
|
Процедуры вводятся,а выход не работает. Меню выше отослал. Ноль на esc исправил.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #16 : 25-06-2009 10:02 » |
|
Меню выше отослал.
Куда отослал? и зачем?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
m9c1k
Гость
|
|
« Ответ #17 : 25-06-2009 11:36 » |
|
Sla спасибо за пошощь! Все работает как часики) Program Mnojestva; uses crt; Type Simvol = set of 'a'..'z'; Var A,B,C:simvol; i:integer; x,key:char; procedure vvod(name_set:string; var num_elem:integer; var one_set:simvol); var x:char; begin writeln('vvedite ',num_elem,' element mnojestva ',name_set); readln(x); if (x in one_set) then begin writeln(x,' uje soderjitsya v mnojestve',name_set); end else begin writeln(x,' pomeschon v mnojestvo',name_set); one_set:=one_set+[x]; num_elem:=num_elem+1; end; end; procedure vyvod(name_set:string;var one_set:simvol); var x:char; begin writeln(' mnojestvo ',name_set); for x:='a' to 'z' do if x in one_set then write(x,' '); writeln; end;
procedure obyedinenie(first_set,second_set:simvol; var third_set:simvol); begin writeln(' obyedinenie '); third_set:=first_set+second_set;
end; procedure perese4enie(first_set,second_set:simvol; var third_set:simvol); begin writeln(' perese4enie '); third_set:=first_set*second_set; end; procedure raznosty(first_set,second_set:simvol; var third_set:simvol); begin writeln(' raznosty '); third_set:=first_set-second_set; end; procedure simmetr(first_set,second_set:simvol; var third_set:simvol); begin writeln(' simmetr raznosty '); third_set:=(first_set-second_set)+(second_set-first_set); end; begin A:=[]; B:=[]; i:=1; repeat vvod('A',i,A); until i>5; i:=1; repeat vvod('B',i,B); until i>5; clrscr; vyvod('A',A); vyvod('B',B); repeat clrscr; writeln('======================='); writeln(' 1: obyedinenie'); writeln(' 2: perese4enie'); writeln(' 3: simmetr. raznosty'); writeln(' 4: raznosty'); writeln('esk: vyhod'); writeln('======================='); writeln('->');
repeat until keyPressed; key:=readkey; writeln('key= ',key);
case key of '1':begin obyedinenie(A,B,C); vyvod('C',C);end; '2':begin perese4enie(A,B,C); vyvod('C',C);end; '3':begin simmetr(A,B,C); vyvod('C',C);end; '4':begin raznosty(A,B,C); vyvod('C',C);end;
end; if key <> #27 then readln; until key=#27; end.
|
|
|
Записан
|
|
|
|
|