Статистика |
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
1608.
Евгений
(10.05.2008 15:19)
0
Здравствуйте, Борис! С прошедшим Вас праздником!
Подскажите, пожалуйста, как можно определить нахождение какого-либо символа, в моем случае - пробела (а так любой символ) при счете справа налево. Путанно? Попробую объяснить.
Дана строка: drdg ygbkjdfgffygd gawe yzyg yyg
Надо найти положение первого справа пробела (ну или буквы z, например). Если использовать что-то типа: For i := length(St) downto 1 do begin z := pos('' '', St); break end; то z показывает положение пробела слева, т.е. цифру 5, а мне надо, чтобы или 4, если справа считать, или 29, если считать слева (а для буквы z значения будет: 26, а надо 7).
Прогонять же всю строку, чтобы в переменной осталось последнее значение, которое будет искомым - не рационально. Типа такого примера: For i := 1 to length(St) do z := pos('' '', St); Как решить? Помогите, пожалуйста! =============================================== *** Евгений ***
Ответ: Да нет, как раз "прогонять" будет самым рациональным решением. Тем более, что произойдёт очень быстро:
CONST Space_needed: Integer = 4; VAR Space_pos, Space_count: Integer; ..... BEGIN Space_count:=0; for i:=1 to length(St) do if St[i] = '' '' then begin inc(Space_count); if (Space_count) = SpaceNeeded then Space_pos:=i; Break end; END.
|
1607.
Павел
(10.05.2008 13:33)
0
Хочу всех поздравить с прошедшим праздником 9 мая. Помогите решить задачи: Вариант №1 1,Дано натуральное число: а)найти сумму цифр этого числа; б)верно ли, что число начинается и заканчивается одной и той же цифрой. 2,Найти все трёхзначные цифры, такие, что сумма цифр равна А, а само число делится на В (А и В вводятся с клавиатуры). 3,Найти количество делителей натурального числа. Сколько из них чётных? 4,Найти все натуральные числа a, b и c из интервала от 1 до 20, для которых выполняется равенство: a2 + b2 = c2.
Спасибо!
|
1606.
Евгений
(09.05.2008 15:44)
0
Здравствуйте, Борис! Подскажите, пожалуйста, как надо изменить программу, чтобы при вводе неправильного значения происходило повторное приглашение на ввод до тех пор, пока оно не будет введено правильно. В качестве примера выкладываю программку. ==========================================================
{ P_K-P-2.PAS Kontrol''naya rabota 2, zadanie 20, vypolnil Евгений. } Program Summa;
Uses CRT;
Const M = 255;
Var sum, d, Q, R, Z : Real; i : byte; N : integer;
BEGIN { === VVOD I VYVOD ISHODNYH DANNYH === } WriteLn; WriteLn(''Vvedite chislo ot 0 do 255 vklyuchitel''''no:''); Read(N); WriteLn(''Vy vveli chislo: '',N:2); WriteLn(''***********************'');
If ((n > 0) and ( N <= M)) then { Uslovie vypolneniya programmy }
begin { === VYCHISLENIE === } Q := 1; R := 1; Z := 1; { Ishodnye dannye } sum := 0; { Nachal''''noe znachenie summy }
For i := 1 to N do begin d := 0.7*sqr(Q)*Q + 0.3*R - 0.1*Z; { Formula posledovatel''nosty } sum := sum + d; { Nakoplenieh summy } Z := R; R := Q; Q := d; { Sdvig znacheniy } end;
{ === VYVOD REZUL''''TATOV NA EKRAN === } WriteLn(''Summa '',N,'' elementov posledovatel''''nosti sostavlyaet: '',sum:9:6); WriteLn(''==================================================''); end;
If ((N > M) or (N <= 0)) then { Uslovie ostanovki programmy }
begin WriteLn(''Chislo '',N:2,'' nevernoe.''); WriteLn(''Vvedite chislo v diapazone ot 0 do 255 vklyuchitel''''no.'') end; ReadKey;
END.
========================================================== Евгений.
Ответ: Для решения проблемы нужно отключить контроль операций ввода/вывода с помощью директивы {$I-}. При этом не происходит аварийного завершения программы при неправильном вводе, но генерируется код ошибки. Его можно узнать с помощью вызова функции IOResult. Про нее достаточно знать только три вещи: 1) правильный ввод = 0. Все остальные ошибки не 0. 2) вызов функции - это тоже операция ввода/вывода, а потому следующий вызов ее даст 0 (ведь успешно прошло!). Аналогично, вызов других функций также обновляет буфер, где хранится код ошибки, считываемый IoResult. Следовательно, нужно сразу же прочитать код и сохранить 3) Надолго отключать контроль операций нельзя. Любой другой вывод/ввод - на дискету, сигналы системы о неправильной работе нуждаются во включенном контроле. (Замечу, что это было страшно в DOS, там это отключение действовало глобально. У Windows своя система. Ее этим не нарушишь). Итак, нужно действовать так: VAR Code, Num: Integer; {к примеру, у Вас байты, но Code должен иметь тип Integer} BEGIN Write(''Input of integer: ''); repeat {$I-} ReadLn(Num); {$I+} Code := IOResult; if Num > 255 then Code := 0; {к примеру} if Code <> 0 then WriteLn(''Error. Try again''); until Code = 0; ... END.
|
1605.
Татьяна
(08.05.2008 14:51)
0
n и k задаются с клавиатуры, матрицы тоже
|
1604.
Павел
(08.05.2008 13:43)
0
Вот задачи: 1. Дано натуральное число: a. найти произведение цифр числа; b. верно ли, что в данном числе нет данной цифры А (цифру А вводить с клавиатуры). 2. Найти все трёхзначные цифры, которые при увеличении на 1 делятся на 2, при увеличении на 2 делятся на 3, при увеличении на 3 делятся на 4, а при увеличении на 4 делятся на 5. 3. Из данного натурального числа удалить все цифры А (а вводятся с клавиатуры). 4. Найти сумму нечётных делителей натурального числа. 5. Найти все равновеликие прямоугольники, стороны которых выражены целыми числами a и b, а площадь равна S (a и b принадлежит интервалу от 1 до 20, а S вводится с клавиатуры).
Заранее спасибо!
Ответ: Ответы - решения найдёте в разделе "Простые программы" от № 56 до 63
|
1603.
Павел
(08.05.2008 13:33)
0
За 2 вариант Контрольная работа №1 контрольная работа "2, а те решены за 8 вариант
|
1602.
Павел
(08.05.2008 08:21)
0
в паскале
Ответ: :) Это-то понятно. Делал ведь Что решать-то, какие задания? Те, что ниже приведены - уже сделаны
|
1601.
Павел
(07.05.2008 16:30)
0
Помогите пожалуйста решить контрольную работу 1 и контрольную работу 2 За вариант №2! заранее спасибо!
Я в пскале вообще ничего не понимаю. а задают вообще много!
Ответ: А что это такое?
|
1600.
nextmaniac
(07.05.2008 10:54)
0
почему при попытке запустить исходники дурака он выдает kovaj на тему eror. че за?
Ответ: Взяли на http://borlpasc.narod.ru/igra.htm? Сейчас скачаю, посмотрю. Но, скорее, к вечеру поближе
|
1599.
red-white forces
(07.05.2008 09:51)
0
Есть какя нибудь прога для перевода текста из шрифта TERMINAL в TIMES NEW ROMAN? А то Паскаль работает с терминалом, а редактировать удобнее times new roman
Ответ: Не забывайте, когда был написан Borland Pascal!! Тогда доминировал DOS. Можно использовать более современные редакторы, например, Notepad++, Programmers Notepad, ... их много сейчас. А написанное передавать строчному компилятору bpc.exe. Но появятся проблемы с русскими буквами (кодировки разные)
|
1598.
Павел
(05.05.2008 19:07)
0
Где можно найти решения к контрольным работам?
Ответ: :( Плохо со временем Решение первого задания можно взять в разделе "Простые программы" № 53 :) И решения всех = номера от 53 по 57
|
1597.
Павел
(05.05.2008 07:38)
0
Помогите пожалуйста решить задачи! Пожалуйста все отдельно! и самм легким способом!!!
1. Дано натуральное число: найти количество цифр данного числа, больших А (А вводится с клавиатуры); верно ли, что данное число принадлежит промежутку от А до В и кратно 3, 4 и 5 (А и В вводятся с клавиатуры). 2. Найти сумму всех чисел из промежутка от А до В, кратных 13 и 5 (А и В вводятся с клавиатуры). 3. Найти все симметричные натуральные числа из промежутка от А до В (А и В вводятся с клавиатуры). 4. Найти все натуральные числа из промежутка от a до b, у которых количество делителей превышает заданное число К. 5. Найти все натуральные числа a, b и c из интервала от 1 до 20, для которых выполняется равенство: a + b = c2.
|
1596.
Татьяна
(04.05.2008 18:53)
0
Здравствуйте, помогите, пожалуйста, решить задачу: необходимо написать программу для нахождения произведения n (n<=10)матриц размерности k*k (k<=10).
Ответ: Как задаются n и k?
|
1595.
Евгений
(29.04.2008 15:27)
0
Борис! 5) Помучаетесь сами? Или пришлете задание? Мучаться я все-таки буду, а вот само задание то есть в тексте программы, вначале... Вот оно: Dana stroka simvolov St, sostoyaschcaya iz latinskih bukv. Gruppy simvolov, razdelennye probelami i ne soderzhaschie probelov vnutri sebya, budem nazyvat` slovami. Preobrazovat` ishodnuyu stroku v strki St1 i St2 v sootvetstvii s punktami 1 i 2 zadaniya. Esli kakaya-libo is itogovyh strok okazhetsya pustoy, vyvodit` sootvetstvuyuschee soobschenie.
p.1 Napechatat` slova,otlichnye ot poslednego slova, kotorye simmetrichny.
p.2 Napechtat` vse slova, otlichnye ot poslednego slova, zameniv pervoe vhozhdenie X na KX, esli takoe est`.
Ответ: Начну понемногу помогать :) В разделе "Простые программы" под № 52 пример того, как нужно удалять двойные, тройные и т.д. пробелы --- Вот текст: {Простой способ удалить двойные, тройные и т.д. пробелы Читаем из заданного файла или, если его нет, то используем предпределенное значение} CONST FileName: String = ''Strings.txt''; S: String = '' sadfghj D Gajds ghs ASDHJg sdhgjhsad ''; VAR f: Text; S: String; BEGIN Assign(f, FileName); {$I-}Reset(f); {$I+} if IOResult = 0 then begin ReadLn(f, S); Close(f) end; WriteLn(S); while (POS('' '', S) > 0) do delete(S, POS('' '',S), 1); {Первый и последний пробелы} if (lenght(S) > 1) and (S[1] = '' '') then Delete(S, 1, 1); if (length(S)>1) and (S[length(S)] = '' '') then Delete(S, length(S), 1); END.
|
1594.
Евгений
(29.04.2008 13:30)
0
Здравствуйте, Борис! Вынужден снова обратиться за помощью. В данной программе не происходит удаление delete(St5, 1 n) в разделе четного слова с количеством знаков больше двух. Исходная строка для программы: thdf gf ffff jj kkkkk ssfss rr qweewq vde vde
По контролю переменных (Ctrl+F7) найти причину не могу (все прееменные показывают правильные значения), а именно, в момент должного удаления символов (в данном случае 5 символов) удаляется только 2 символа, хотя я в самой программе прописал использовать переменную "n" и она высвечиваетется в Ctrl+F7 (просмоторщик что ли...) цифрой 5, а удаляется только 2 символа.
Я пытался по разному составлять алгоритм, примером другого варианта является блок: ----------------- { Esly v nechetnom slove znakov bol`she 2 } If ((z mod 2 <> 0) and (z > 2)) then begin Repeat if SlY[a] = SlY[b] then flag2:=true else flag2:=false; If (flag2=false) then begin delete(St5, 1, n); exit end; c:=b-a; inc(a); dec(b);
Until ((b=a) or (flag2=false));
If (flag2=true) then begin St3:=St3+SlY+pr; WriteLn(''Нечетные слова St3:'',St3); delete(St5, 1, n) end; end;
----------------- Интересно получается, если я в выражении delete(St5, 1 n) принудительно ставлю число вместо переменной "n", то удаление символов происходит. Написал много, подведу итог: - При использовании в программе слов с одинаковыми буквами (четная или нечетная длина) все проходило нормально; - При внесении в строку хоть одного несимметричного (с четной длиной слова) работа нарушается; - Проблема только с блоком: { --- ЧЕТНОСТЬ И НЕЧЕТНОСТЬ СЛОВ --- } (так мне кажется...) ====================
{ File: STR-1_1.PAS ** OAIP ** Laboratornaya rabota 2, variant 3.
Dana stroka simvolov St, sostoyaschcaya iz latinskih bukv. Gruppy simvolov, razdelennye probelami i ne soderzhaschie probelov vnutri sebya, budem nazyvat` slovami. Preobrazovat` ishodnuyu stroku v strki St1 i St2 v sootvetstvii s punktami 1 i 2 zadaniya. Esli kakaya-libo is itogovyh strok okazhetsya pustoy, vyvodit` sootvetstvuyuschee soobschenie.
p.1 Napechatat` slova,otlichnye ot poslednego slova, kotorye simmetrichny.
p.2 Napechtat` vse slova, otlichnye ot poslednego slova, zameniv pervoe vhozhdenie X na KX, esli takoe est`. }
Program Stroki_STR_1; Uses CRT; Var St, tempSt, tempSt1, St_no_prob, Posl_Sl, Razn_no_posl_Sl, SlY, St2, St3, St4, St5, St6 : string;
i, x, x1, n, a, b, c, z : byte; f_in : text; pr : char; flag1, flag2, flag3 : boolean; BEGIN { *************************************************************** }
{ --- OTKRYTIE TEKSTOVOGO FAYLA --- } {$I-} Assign(f_in,''e:pasStroki.txt''); Reset(f_in); if IOResult <> 0 then begin WriteLn(''OSHIBKA PRI OTKRYTII FAYLA e:pasStroki.txt''); exit; end; While not EOF(f_in) do begin readLn(f_in, St); WriteLn(St); end; {$I+}
{ *************************************************************** } { UDALENIE NACHAL`NYH I KONECHNYH PROBELOV V STROKE } pr:='' ''; WriteLn(''** КОНТРОЛЬ ** St='',St);
Repeat if (copy(St, 1, 1) = pr) then delete(St, 1, 1); if (copy(St, length(St), 1) = pr) then delete(St, length(St), 1); until (copy(St, 1, 1) <> pr) and (copy(St, length(St), 1) <> pr);
{ UDALENIE LISHNIH PROBELOV VNUTRI STROKI, VYDELENIE POSLEDNEGO SLOVA } Repeat x:=pos(pr, St); if (copy(St, x+1, 1) = pr) then delete(St, x, 1) else begin St_no_prob := St_no_prob + copy(St, 1, x); delete(St, 1, x); end; Until (pos(pr, St)=0);
WriteLn(''Stroka bez lishnih probelov:'',St_no_prob); Posl_Sl:=St; WriteLn(''Последнее слово:'',St);
{ POISK SLOV OTLICHNYH OT POSLEDNEGO I NE SODERZH. POSLEDNEGO SLOVA }
Razn_no_posl_Sl:=''''; Repeat x1:=pos(pr, St_no_prob); if (copy(St_no_prob, 1, x1-1)) <> Posl_Sl then Razn_no_posl_Sl:=Razn_no_posl_Sl+copy(St_no_prob, 1, x1); delete(St_no_prob, 1, x1); Until (St_no_prob = ''''); WriteLn(''Все отличн. от посл. и без последнего:'',Razn_no_posl_Sl); { *************************************************************** }
{ --- ЧЕТНОСТЬ И НЕЧЕТНОСТЬ СЛОВ --- }
St2:=''''; St3:=''''; St6:=''''; St5:=Razn_no_posl_Sl; { ВРЕМЕННО !!! }
Repeat n:=pos('' '', St5); SlY:=copy(St5, 1,n-1); a:=1; z:=length(SlY); b:=z; { ------------------------------------------- } { Esly v slove tol`ko odin znak }
If z=1 then delete(St5, 1, n);
{ ------------------------------------------- } { Esly v slove tol`ko dva znaka }
If ((z = 2) and (SlY[a]=SlY[b])) then begin flag3:=true; St6:=St6+SlY+pr; delete(St5, 1, n);
if (flag3=false) then delete(St5, 1, n); end;
{ ------------------------------------------- } { V chetnom slove znakov bol`she 2 } {FLAG 1} If ((z mod 2 = 0) and (z > 2)) then begin if SlY[a] <> SlY[b] then begin delete(St5, 1, n); break end; For a:=1 to b do begin if SlY[a] = SlY[b] then begin flag1:=true; c:=b-a; inc(a); dec(b) end; end;
If (flag1=true) then begin St2:=St2+SlY+pr; WriteLn(''Четные слова St2='',St2); delete(St5, 1, n) end; end; { ------------------------------------------- } { Esly v nechetnom slove znakov bol`she 2 } If ((z mod 2 <> 0) and (z > 2)) then begin Repeat if SlY[a] = SlY[b] then flag2:=true else flag2:=false; If (flag2=false) then begin delete(St5, 1, n); exit end; c:=b-a; inc(a); dec(b);
Until ((b=a) or (flag2=false));
If (flag2=true) then begin St3:=St3+SlY+pr; WriteLn(''Нечетные слова St3:'',St3); delete(St5, 1, n) end; end; { ------------------------------------------- }
St4:=St2+St3+St6;
flag1:=false; flag2:=false; flag3:=false; Until (St5='''');
WriteLn(''St2:'',St2); WriteLn(''St3:'',St3); WriteLn(''St6:'',St6); If (St4='''') then writeLn(''Вышла пустая строка (строка St4)'') else WriteLn(''Получена первая строка (п.1__St4):'',St4);
WriteLn('' ---------------------------------------------- '');
WriteLn(''***********************''); WriteLn; ReadKey
END. ==================
Ответ: 1) А зачем сравнивать буквы? Из задания не понял. Сроки можно сравнивать целиком как цифры, что ли: if String1 <> String2 then ... 2) удобнее завести счетчик слов или простую булевскую переменную, которую, как только слово началось переключать bool := NOT bool; И удалять, если ИСТИНА. 3) Надо завести счетчик - положение в строке и разбирать буквы, пока значение этого счетчика меньше длины строки k <= length(...); 4) если удалить нужно только те, что не совпадают с последним, то сначала найти это слово перебирая буквы с конца. И лишь потом по буквам перебирая исходное слово, составлять слова. И удалять тут же (не забывая про счетчик). Конечно, можно завести массив строк, но это как-то дико 5) Помучаетесь сами? Или пришлете задание?
|
|
|
|