Вопросы и ответы нах / Zadachi_Gosy_1
.doc
30. Заменить отрицательные элементы линейного массива их модулями, не пользуясь стандартной функцией вычисления модуля. Подсчитать количество произведенных замен.
type mas=array[1..100] of integer;
var i,n,k:integer;
a:mas;
begin
writeln('Vvedite kolvo elementov massiva:');
readln(n);
for i:=1 to n do
begin
if random(5) mod 2 = 0 then
a[i]:=random(100)
else
a[i]:=(-1)*random(100);
write(a[i],' ');
end;
k:=0;
writeln;
for i:=1 to n do
begin
if a[i]<0 then
begin
a[i]:=(-1)*a[i];
k:=k+1;
end;
write(a[i],' ');
end;
writeln;
writeln('kolvo otricatelnih chisel: ', k);
end.
31. Найти наименьший нечетный натуральный делитель К (К<>1) любого заданного натурального числа n.
program lab;
var
n,k,i:integer;
begin
writeln('Vvedite n:');
readln(n);
i:=1; k:=1;
while (k=1) and (i<n) do
begin
i:=i+1;
if ((i mod 2)=1) and ((n mod i)=0) then k:=i;
end;
if k<>1 then writeln('Min nechet delitel: ',k)
else writeln('Net min nechet delitelya <> 1');
end.
32. Найти все натуральные n-значные числа, цифры в которых образуют строго возрастающую последовательность (например, 1234,5789).
program lab32;
var
i, i1, i2: integer;
n: byte;
procedure Check(x:longint; num:byte);
var
S: string;
c: byte;
begin
S:=inttostr(x); //пеğеводим число в стğоку
for c:=2 to num do // и со втоğого символа числа пğовеğяем
if S[c]<=S[c-1] then break //если пğедыдущий символ меньше либо ğавен
//текущему, выходим из цикла
else if c=num then write(S,' '); // иначе если текущий символ - последний
//пишем число
end;
begin
Writeln('Введите количество символов в числе ',n);
Readln(n);
i1:=round(exp((n-1)*ln(10)));
i2:=round(exp(n*ln(10)))-1;
for i:=i1 to i2 do
Check(i,n);
end.
33. Составить программу, определяющую, в каком из данных двух чисел больше цифр. Задачу решить с использованием процедуры или функции.
program lab33;
var a,b:longint;
function Check(n:integer):integer;
var
temp,c:integer;
begin
temp:=n;
c:=0;
while temp<>0 do
begin
inc(c);
temp:=temp div 10
end;
Check:=c
end;
begin
Writeln('Vvedite 1 chislo');
Readln(a);
Writeln('Vvedite 2 chislo');
Readln(b);
if Check(a)>Check(b) then writeln('V 1 chisle znakov bolshe')
else if Check(a)<Check(b) then writeln('Vo 2 chisle znakov bolshe')
else writeln('V chislah znakov odinakovo');
end.
34. Услуги телефонной сети оплачиваются по следующему правилу: за разговоры до А минут в месяц - В руб., а разговоры сверх установленной нормы оплачиваются из расчёта С руб., за минуту. Написать программу, вычисляющую плату за пользование телефоном для введённого времени разговоров за месяц.
program lab34;
const
a=360;
b=180;
c=2;
var
k,p:integer;
begin
writeln('Vvedite skolko vremeni vi naboltali (v min.):');
readln(k);
if k<=A then
begin
p:=b;
writeln('Vi ulojilis v normu (',a,'min.)');
end
else
begin
p:=b+((k-a)*c);
writeln('Vi NE ulojilis v normu (',a,'min.)')
end;
writeln('Vasha oplata za telefon sostsvlyaet ',p,' rub.');
end.
35. Дана строка; слова разделены пробелами. Подсчитать, сколько в ней букв r, k, t.
program lab35;
var s:string;
n,i:integer;
begin
writeln('Vvedite stroku');
readln(s);
n:=0;
for i:=1 to length(s) do
if (s[i]='r') or (s[i]='k') or (s[i]='t') then
n:=n+1;
writeln('V stroke naydeni bukvi r, k, t : ', n, ' raz');
end.
Второй вариант
Program lab35_1
var s:string;
nr,nk,nt,i:integer;
begin
writeln('Vvedite stroku');
readln(s);
nr:=0;
nk:=0;
nt:=0;
repeat
if pos(‘r’,s)<>0 then begin inc(nr); delete(s,pos(‘r’,s),1); end
else
if pos(‘k’,s)<>0 then begin inc(nk); delete(s,pos(‘k’,s),1); end
else
if pos(‘t’,s)<>0 then begin inc(nt); delete(s,pos(‘t’,s),1); end
else break;
until false;
writeln('V stroke naydeni bukvi r: ', nr, ' raz');
writeln('V stroke naydeni bukvi k: ', nk, ' raz');
writeln('V stroke naydeni bukvi t: ', nt, ' raz');
end.
36. Составить программу, определяющую результат гадания на ромашке – «любит – не любит», взяв за исходное данное количество лепестков n.
program lab36;
var
k:integer;
begin
writeln('Vvedite kolichestvo lepestkov');
readln(k);
if k mod 2 =0 then writeln('Ne lubit') else writeln('Lubit');
end.
Второй вариант
program lab36;
var
k:integer;
begin
writeln('Vvedite kolichestvo lepestkov');
readln(k);
if Odd(k) then writeln('Lubit') else writeln('Ne lubit');
end.
37. Задана последовательность N целых чисел. Вычислить сумму элементов массива, порядковые номера которых совпадают со значением этого элемента.
program lab37;
var
a:array [1..100] of integer;
i,n,l:integer;
begin
randomize;
l:=0;
writeln('Vvedite kolvo elementov');
readln(n);
for i:=1 to n do
begin
a[i]:=random(100);
write(a[i],' ');
if a[i]=i then l:=l+a[i];
end;
writeln;
writeln('Summa: ',l);
end.
38. Вычислить у = sin1 + sin1,1 + sin1,2 + … + sin2.
program lab38;
var g,x:real;
k:integer;
begin
x:=1;
g:=0;
repeat
g:=g+sin(x);
writeln('sin(',x,') = ',g:4:3);
x:=x+0.1;
until (x>2);
writeln('Summa = ',g:4:3);
end.
39. Заполнить таблицу размерности n*n:
1 1 1 1 … 1
0 2 2 2 … 2
0 0 3 3 … 3
……………
0 0 0 0 … n
program lab39;
type mas=array[1..10, 1..10] of integer;
var n,i,j:integer;
a:mas;
begin
writeln('Vvedite razmernost matrici (<10): ');
readln(n);
for i:=1 to n do
for j:=1 to n do
begin
if j<i then a[i,j]:=0
else a[i,j]:=i;
end;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;
end.
40. Дана строка, содержащая английский текст; слова разделены пробелами. Найти количество слов, начинающихся с буквы b.
program lab40;
type mas=array[1..100] of string;
var
s,sr:string;
i,f,k:integer;
m:mas;
procedure sl(s:string; var m:mas);
begin
sr:=''; k:=1;
for i:=1 to length(s) do
if s[i]<>' ' then sr:=sr+s[i]
else
begin
m[k]:=sr;
k:=k+1;
sr:='';
end;
m[k]:=sr;
end;
begin
writeln('Vvedite stroku');
readln(s);
sl(s,m);
for i:=1 to k do
begin
sr:=m[i];
f:=0;
if (sr[1]='b') or (sr[1]='B') then
f:=1;
if f=1 then writeln(m[i]);
end;
end.
41. Дана строка символов, среди которых есть одна открывающаяся и одна закрывающаяся скобка. Вывести на экран все символы, расположенные внутри этих скобок.
program lab41;
var
s,sl:string;
i,k,p,l:integer;
begin
writeln('Vvedite stroku:');
readln(s);
k:=0;
p:=0;
for i:=0 to length(s) do
begin
k:=pos('(',s);
p:=pos(')',s);
end;
if (k<>0) and (p<>0) then
begin
sl:=copy(s,k+1,p-k-1);
writeln('Tekst vnutri skobok: ', sl);
end;
end.
42. Дана последовательность действительных чисел а1,а2,…,аn. Указать те элементы, которые принадлежат отрезку [c,d].
program lab42;
var
a:array [1..100] of integer;
i,k,c,d,n:integer;
begin
randomize;
writeln('Vvedite c and d:');
readln(c,d);
writeln('Vvedite kolvo elementov posledovatelnosti');
readln(n);
writeln('Elementi posledovatelnosti:');
for i:=1 to n do
begin
a[i]:=random(40);
write(a[i],' ');
end;
writeln;
write('Elementi posledovatelnosti iz [',c,',',d,']: ');
k:=0;
for i:=1 to n do
if (a[i]>=c) and (a[i]<=d) then
begin
write(a[i],' ');
k:=k+1;
end;
if k=0 then write('ne takih');
end.
43. Запишите двойственную задачу к задаче:
f=-12x1-4x2→min,
x1,x2 0,
3x1+x2 4,
-x1-5x2 -1,
2x1 2,
x1-x2 0,
x1+x2 1.
Укажите значение целевой функции и оптимальный план двойственной задачи (не решая ее), решив графически или другим способом исходную задачу.
Решение:
1) 3*x1 + 2*x2 = 4
x1 x2
0 2
1 1
2) x1 + x2 = 1
x1 x2
0 1
1 0
3) 2x1 = 2
4) -x1 – 5x2 = -1
x1 x2
1 0
6 -1
5) x1 - x2 = 0
x1 x2
0 0
1 1
Построим графики всех функций и найдем область, которую они ограничивают.
grad: (0,0) : (-12, -4).
Область допустимых решений – пустое множество (т.е. система ограничений несовместима).
Проверим на Maple.
> with(plots);
> inequal({3*x1+2*x2>=4, x1+x2>=1, 2*x1>=2, x1-x2>=0, -x1-5*x2>=-1, x1>=0, x2>=0}, x1=-5..5, x2=-5..5, optionsfeasible=(color=blue),optionsexcluded=(color=white));

44. В строке имеется одна точка с запятой (;). Подсчитать количество символов до точки с запятой и после неё.
var s:string;
i,k,n:integer;
begin
writeln('Vvedite stroku:');
readln(s);
i:=0;
i:=pos(';',s);
k:=i-1;
n:=length(s)-i;
if i<>0 then writeln('Do ";" : ',k,' simv., posle ";" ', n, ' simv.')
else writeln('; NE naydena');
end.
45. Решите задачу линейного программирования графическим методом.
f=2x1+x2→min,
x1, x2 0,
2x1+3x2 6,
2x1+x2 4,
x1 1,
x1-x2 -1,
2x1+x2 1.
Решение:
1) 2*x1 + 3*x2 = 6
|
x1 |
x2 |
|
0 |
2 |
|
3 |
0 |
2) 2*x1 + x2 = 4
|
x1 |
x2 |
|
0 |
4 |
|
2 |
0 |
3) x1 = 1
4) x1 – x2 = -1
|
x1 |
x2 |
|
0 |
1 |
|
-1 |
0 |
5) 2*x1 + x2 = 1
|
x1 |
x2 |
|
0 |
1 |
|
0.5 |
0 |
Построим графики всех функций и найдем область, которую они ограничивают.
grad: (0,0) : (2,1).
Точка находится на пересечении 1 и 3 уравнений.
Решим систему:
2*x1 + x2 = 1
x2 = 0
x1 = 0.5
x2 = 0
f(max) = 2*0.5 + 0 = 1.
Проверим на Maple.
> with(plots);
> inequal({2*x1+3*x2<=6, 2*x1+x2<=4, x1<=1, x1-x2>=-1, 2*x1+x2>=1, x1>=0, x2>=0}, x1=-5..5, x2=-5..5, optionsfeasible=(color=blue),optionsexcluded=(color=white));

> with(simplex);
> minimize(2*x1+x2, {2*x1+3*x2<=6, 2*x1+x2<=4, x1<=1, x1-x2>=-1, 2*x1+x2>=1}, NONNEGATIVE);
![]()
46. При поступлении в вуз абитуриенты, получившие двойку на первом экзамене, ко второму не допускаются. В массиве A[n] записаны оценки экзаменующихся, полученные на первом экзамене. Подсчитать, сколько человек не допущено ко второму экзамену.
var
b:array[1..100,1..3] of string;
n,k,i,j:integer;
begin
k:=0;
writeln('Vvedite n:');
readln(n);
for i:=1 to n do
begin
writeln('Vvedite familiu abiturienta:');
readln(b[i,1]);
writeln('Vvedite ocenku abiturienta:');
readln(b[i,2]);
end;
for i:=1 to n do
begin
for j:=1 to 2 do
write(b[i,j],' ');
writeln;
end;
writeln('Nedopusheni:');
for i:=1 to n do
if (b[i,2]<'3') then
begin
write(b[i,1],' ');
writeln;
k:=k+1;
end;
writeln('Kolichestvo nedopusenih: ', k);
end.
47. Дана строка; слова разделены пробелами. Подсчитать, сколько слов в строке.
program lab47;
var s:string;
i,k:integer;
begin
writeln('Vvedite stroku');
readln(s);
k:=1;
for i:=1 to length(s) do
if (s[i]=' ') and (s[i+1]<>' ') then
k:=k+1;
writeln(k);
end.
48. Заполнить таблицу размерности n*n:
1 1 1 … 1
2 2 2 … 2
………….
n n n … n
program lab48;
type mas=array[1..100, 1..100] of integer;
var a:mas;
i,n,j:integer;
begin
writeln('Vvedite n');
readln(n);
for i:=1 to n do
for j:=1 to n do
a[i,j]:=i;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j],' ');
writeln;
end;
end.
49. У вас есть доллары. Вы хотите обменять их на рубли. Есть информация о стоимости купли-продажи в банках города. В городе N банков. Составьте программу, определяющую, какой банк выбрать, чтобы выгодно обменять доллары на рубли.
var
a:array[1..100]of integer;
i,j,n,k:integer;
begin
writeln('Vvedite kolichestvo bankov:');
readln(n);
writeln('Vvedite stoimost pokupki dollara v bankah:');
for i:=1 to n do
begin
write('V ',i,'-om banke ');
readln(a[i]);
end;
k:=1;
for i:=1 to n do
if a[i]>a[k] then k:=i;
writeln('Vigodney prodat dollar v',' ',k,' ','banke za',' ',a[k],' ','rub');
end.
50. Строка содержит одно слово. Проверить, будет ли оно читаться одинаково справа налево и слева направо (т.е. является ли оно палиндромом).
var
word: string;
j: integer;
sim: boolean;
begin
writeln('Vvedite stroku');
readln(word);
sim := true;
for j := 1 to length(word) div 2 do
sim := sim and (word[j] = word[length(word) - j + 1]);
if sim then writeln('palindrom') else writeln('ne palindrom');
end.
