Консультация № 31181
10.12.2005, 02:37
0.00 руб.
0 4 3
Здравствуйте!

Следующее моё задание: Дана строка символов. Удалить из неё каждое слово нечетной длины. Я пол дня над нею сидел и всё-таки сделал :). Но я там так “наворотил”, смотрите в приложении, но главное работает. Можно ли код этой программы облегчить?

С уважением ALL_mikky


Приложение:
Program Stroca_ALL_mikky;var S1,Pr,S,S10: string[100];M: array [1..100] of integer;k,c,i,a,a1,v,Mi: integer;label 1,2;BeginWriteln (‘Vvedite stroky do 100 simvolov, kagdoe slovo okanchivaetse probelom‘);readln (S);Pr:=‘ ‘; for i:=1 to 100 do Begin if S[i]=Pr then Begin A:=A+1; M[i]:=i; Writeln (‘i=‘,i); end; end;Writeln (‘Probelov A=‘,A);A1:=0; for i:=1 to 100 do begin if M[i]<>0 then Begin writeln (‘M[i]=‘,M[i]); if A>=A1 then Begin if A1=0 then Begin k:=M[i]-1; writeln (‘Pervoe slovo iz bykv k=‘,k); c:=k mod 2; if c=0 then S1:=copy(S,1,k); writeln (‘Pervoe S1=‘,s1); A1:=A1+1; v:=M[i]; goto 1; end; Begin writeln (‘Prohloi m[i] v=‘,v); k:=M[i]-v-1; writeln (‘slovo iz bykv k=‘,k); c:=k mod 2; Mi:=M[i]; S10:=copy(S,Mi-k-1,k+1); writeln (‘dob s10=‘,s10); if c=0 then S1:=concat(S1,S10); writeln (‘Sled S1=‘,s1); A1:=A1+1; v:=M[i]; if A<A1 then goto 2 else goto 1; end; end; end; 1: end; 2:writeln (‘s1=‘,s1);end.

Обсуждение

Неизвестный
10.12.2005, 07:06
общий
это ответ
Здравствуйте, ALL_mikky!
Я не совсем понял вашу программу. Но, если я правильно понял задание, сделал её заново. Она берёт строку и выводит её же, но без слов нечётной длины

С уважением, romodos.

Приложение:
var n,m,s:string[100]; l,i,a:integer;const pr=‘ ‘;begin writeln(‘Vvedite stroku‘); readln(s); l:=length(s); for i:=1 to l do begin if (s[i]=pr) then begin if a mod 2=0 then m:=m+n+‘ ‘; n:=‘‘; a:=0; end else begin inc(a); n:=n+s[i]; if (i=l) and (a mod 2=0) then m:=m+n; end; end; writeln(m);end.
Неизвестный
10.12.2005, 13:47
общий
это ответ
Здравствуйте, ALL_mikky!
А зачем ограничения в 100 символов???
У меня будет без ограничений.
Сначала проверяем i-тый символ в строке, чтобы он не был пробелом(это будет первая буква в слове)
Если так, то узнаем позицию последней буквы(j-1).
J-i будет длиной данного слова. Если она не четная, то удаляем это слово оператором delete. А если она нечетная, то i задаем значение j+1, т.е. позицию символа после слова(и пробела после него. Вообще можно сколько угодно ставить пробелов между словами).
А если i-тый символ пробел, то удаляем попторяющиеся пробелы.

Приложение:
Program stamm;Var s:string; j,i,k:byte;Begin Readln(s); i:=1; while i<length(s) do Begin if s[i]<>‘ ‘ then begin j:=i; while s[j]<>‘ ‘ do inc(j); if (j-i) mod 2=1 then delete(s,i,j-i) else i:=j+1; end else begin k:=i+1; repeat inc(k); until s[k]<>‘ ‘; if k-i>1 then delete(s,i,k-i); end; end; Writeln(s); readln;End.
Неизвестный
11.12.2005, 09:29
общий
это ответ
Здравствуйте, ALL_mikky!
Я приведу своё решение этой задачи.

Приложение:
var s:string; //Собственно строка i:integer; //Номер текущего символа b:integer; //Номер первого символа текущего словаbegin readln(s); i:=1; b:=1; while i<=length(s) do begin if s[i]=‘ ‘ then begin if (i-b) mod 2=1 then //Если кол-во букв в слове нечётно то.. begin delete(s,b,i-b+1); //Удаляем это слово i:=b-1; //Перемещаем номер текущего символа на пробел перед словом end; b:=i+1; //Начало нового слова после пробела end; inc(i); end; if (i-b) mod 2=1 then //Дополнительная проверка в конце строки delete(s,b,i-b+1); writeln(s);end.
Неизвестный
11.12.2005, 13:35
общий
ЭТо stamm. Я немного исправил код:Program stamm;Var s:string; j,i,k:byte;Begin Readln(s); i:=1; while i<length(s) do Begin if s[i]<>‘ ‘ then begin j:=i; while (s[j]<>‘ ‘) and (j<=length(s)) do inc(j); if (j-i) mod 2=1 then delete(s,i,j-i) else i:=j+1; end else begin if s[i]=‘ ‘ then delete(s,i,1); end; end; Writeln(s); readln;End.
Форма ответа