Персональная страничка
| ||
Предыдущий раздел:
Следующий раздел:
14.1. Символьный тип
1) Попробуйте извлечь звук Beep путем печати соответствующего управляющего символа. PscalABC не бипает :( Если под рукой нет Borland Pascal или Free Pascal или Delphi, то делайте следующее задание.
2) Напечатайте на экране кодовую таблицу в виде «символ – его код». Чтобы все символы уместились на экране, печатайте несколько столбцов (либо печатайте, сколько умещается, а затем пусть программа ждет нажатия Enter и выводит следующую порцию символов). Для разделения столбцов используйте символ табуляции (#9).
3) В имеется функция, делающая из строчной буквы прописную (UpCase), но нет обратной функции. Создайте ее. Грамотное с точки зрения английского языка название LowCase.
Замечание: В PascalABC есть LowCase, но вы все равно создайте свою процедуру.
14.2. Строки
1) Создайте программу, которая по трем введенным строкам, содержащим фамилию, имя и отчество, формирует и печатает одну строку, содержащую все вместе. Например, на ввод
Ivanov
Ivan
Ivanovich
Она должна сформировать и напечатать строку ‘Ivanov Ivan Ivanovich’.
2) Создайте функцию, которая по строке, содержащей ФИО формирует строку, содержащую фамилию с инициалами. Например, по ‘Ivanov Ivan Ivanovich’ создаст ‘Ivanov I.I.’.
3) Усовершенствуйте стандартную процедуру readln (создав ее аналог, который будет, например, называться readln2) таким образом, чтобы она:
а) позволяла вводить целое число.
б) если ввод вместо числа содержит что другое (например, буквы), то процедура должна информировать пользователя об ошибке ввода и запрашивать число снова до тех пор, пока не будет введено именно число.
Стандартная readln при неправильном вводе вызывает неисправимую ошибку, и программа аварийно завершается.
4*) Создайте функцию, возвращающую заданное строкой арифметическое выражение. Например, получив строку ‘2*2’, функция должна возвращать 4. Выражение может содержать числа и знаки операций (+, –, *, /) и не содержит скобок.
14.3 Текстовые файлы
1) Создайте процедуры для записи значений массива в текстовый файл и для считывания значений элементов массива из текстового файла.
2) Текстовый файл acc.txt, содержит временной ряд (в виде столбика цифр), представляющий собой запись ускорения движения руки при патологическом треморе (дрожание руки при болезни Паркинсона). При этом в качестве разделителя целой и дробной части используется запятая. Для обработки файла готовой программой требуются числа с точкой в качестве разделителя. Преобразуйте файл, заменив все запятые точками. Для этого, в частности создайте процедуру или функцию, меняющую в строке все символы c1 на символы c2 (c1 и c2 должны быть параметрами).
3) Файл eeg.txt содержит запись ЭЭГ (электроэнцефалограммы) человека, включающую сигналы с 16 электродов (отведений). Каждому отведению соответствует столбец чисел. Столбцы разделены символом табуляции. Создайте процедуру, выделяющую в отдельный текстовый файл отведение с заданным номером.
Следующий раздел:
Предыдущий раздел:
А в 4*) числа же только целые положительные?
И вводимое выражение только из чисел и знаков операций?
И бывает ли Chartoint?
Числа любые в том числе и дробные (это вроде бы не должно влиять на сложность задачи). Отрицательных, строго говоря, нет, так как это просто соответствует вычитанию числа.
CharToInt’а нет. Если надо, можешь каждый символ StrToInt’ом преобразовывать.
Спасибо
а несколько арифметических действий в одной строке может быть? Например 2*2-1
Может
Можно передавать в процедуру, которая в цикле, передавать счётчик этого цикла?
Почему бы нет. Обычная переменная.
А вот не передаёт. И даже элементы строки внутри процедуры не понимает. А саму строку вроде нормально.
У меня все нормально понимает:
А Delete только со строками работает? Для динамического массива есть что-то подобное?
С этим разобралась. А может быть например
"2*3/-7"? Ну, чтобы отрицательные элементы не только вначале были?
1) Delete работает только со строками. Для массивов надо свой создать :)
2) Нет, так не может быть. Минус надо тащить в начало: -2*3/7.
Или позволять использовать скобки: 2*3/(-7), но это серьезное усложнение задачи.
а может так просто нельзя вводить и всё? хотя от этого не легче будет, он у меня всё равно только 2 числа умножать умеет(
Я как раз и хотел сказать что "2*3/-7" нельзя вводить. Если пользователь хочет делить на -7, пусть вводит "-2*3/7".
Попробую. И ещё я поняла что для каждого знака кажется всё-таки нужно отдельную процедуру. А то когда он второй считает, там с массивом из чисел проблемы, я же его длину изменяю. И ещё массив знаков сделала, его тоже короче после каждой операции делаю
Кажется получилось! Можно будет 27 прийти на зачёт показать?
И как обычно ложная тревога(
но я не сдаюсь))
Приходи, конечно.
Тарас Викторович, а как выглядит уравнение для частотно-модулированной (ЧМ) синусоиды?
Частота должна меняться. Например, тоже синусоидально:
где и — амплитуда и частота модуляции. Соответственно, фаза равна
Ну, и сама синусоида:
спасибо!
Здравствуйте)))), проверьте, пожалуйста:
14.1. — 2:
var
i,x: integer;
c,t: char;
begin
t:=#9;
for i:=1 to 128 do
begin
c:=chr(i);
x:=ord(c);
write(c,’ ‘,x,t);
if i mod 16=0 then
writeln;
end;
end.
и 14.1.-3:
var
c,c1: char;
function lowcase(a: char):char;
var
x: integer;
begin
x:=ord(a);
if (x больше или=65) and (x меньше или =90) then
x:=x+32;
a:=chr(x);
lowcase:=a;
end;
begin
readln(c);
c1:=lowcase(c);
writeln(c1);
end.
задание строки 2:
var
s,y: string;
function FIO(var a: string): string;
var
i,x: integer;
begin
x:=pos(‘ ‘,a);
for i:=x+1 to (length(a)-1) do
begin
if (ord(a[i]) больше 64) and (ord(a[i]) меньше 91) then
a[i+1]:=’.’;
end;
i:=x+1;
while i меньше =length(a) do
begin
if (ord(a[i]) больше 96) and (ord(a[i]) меньше 123) then
begin
delete(a,i,1);
end else
begin
i:=i+1;
end;
end;
FIO:=a;
end;
begin
readln(s);
y:=FIO(s);
writeln(y);
end.
с нового компа я аноним получилась)))
Привет! )) Давно, так сказать, не виделись.
14.1.-2 — не исправляй, но просто скажи, откуда в первой строке 17-й столбец? А так, все хорошо.
и 14.1.-3 — ок
задание строки 2 — не очень хорошо, что функция FIO не только возвращает преобразованную строку, но и меняет свой параметр s. Стоило бы возвращать результат каким-то одним из этих способов. И еще хотелось бы получить результат за один проход строки, а не за два, как сейчас.
Вроде 17-й столбец не в первой строке.. Как это один проход строки? Чтобы один цикл был?
У меня в 1-й:
Да, с одним циклом.
так девятка сдвинулась почему-то)))
задание 14-2-3:
var
s1: string;
x1,y1: integer;
function Readln2(s: string; x: integer): integer;
var
e: integer;
begin
repeat
write(‘введите верное число ‘);
readln(s);
val(s,x,e);
until e=0;
Readln2:=x;
end;
begin
y1:=Readln2(s1,x1);
end.
а в задании 4*) «*» означает задача повышенной сложности? я уже весь мозг сломала)))
задание строки 2 так пойдет?:
var
s,y: string;
function FIO(a: string): string;
var
i,x: integer;
begin
x:=pos(‘ ‘,a);
i:=x+1;
while i64) and (ord(a[i])96) and (ord(a[i])<123) then
begin
delete(a,i,1);
end else
begin
i:=i+1;
end;
end;
FIO:=a;
end;
begin
readln(s);
y:=FIO(s);
writeln(y);
end.
опять забыла про теги)))
var
s,y: string;
function FIO(a: string): string;
var
i,x: integer;
begin
x:=pos(‘ ‘,a);
i:=x+1;
while i меньше или =length(a) do
begin
if (ord(a[i]) больше 64) and (ord(a[i]) меньше 91) then
a[i+1]:=’.’;
if (ord(a[i]) больше 96) and (ord(a[i]) меньше 123) then
begin
delete(a,i,1);
end else
begin
i:=i+1;
end;
end;
FIO:=a;
end;
begin
readln(s);
y:=FIO(s);
writeln(y);
end.
задание 14-3-1:
procedure MasText(f1: text; s1: string;var a1: TMassive);
var
i: integer;
begin
Assign(f1,s1);
Append(f1);
for i:=1 to n do
writeln(f1,a1[i]);
close(f1);
end;
procedure TextMas(f1: text; s1: string; x1: integer);
var
i: integer;
begin
Assign(f1,s1);
Reset(f1);
while not EoF(f1) do
begin
readln(f1,x1);
writeln(x1);
end;
close(f1);
end;
>> так девятка сдвинулась почему-то)))
Чего это она? ))
>> задание 14-2-3:
s и x должны быть локальными переменными, а не параметрами. Ты же никак не используешь переданные значения (s1, x1).
>> а в задании 4*) «*» означает задача повышенной сложности? я уже весь мозг сломала)))
Да, чуть сложнее прочих.
>> задание строки 2 так пойдет?:
Пойдет.
Кстати, можно было бы не удалять лишнее из полной строки, а формировать новую. Получилось бы короче — там, где у тебя сейчас удаления можно было бы просто ничего не делать.
>> задание 14-3-1:
f1 — опять локальная переменная, зачем-то помещенная в список параметров.
Вместо Append я бы использовал Rewrite. Apend можно оставить, но это подразумевает, что в одном файле могут быть записаны или несколько массивов или какая-то другая информация кроме массива. Тогда соответствующая обратная процедура должна содержать указания на то, начиная с какой строки, следует читать массив. И читать его не до конца файла, а до конца массива. Вообще проверка, что ты не выходишь за конец массива, в любом случае бы, не помешала.
TextMas не читает данные из файла в массив, а только печатает содержимое файла на экране.
задание 14-3-1 вторая часть так будет?:
procedure TextMas(s1: string; x1: integer);
var
i: integer;
f1: text;
begin
Assign(f1,s1);
Reset(f1);
while not EoF(f1) do
begin
for i:=1 to n do
begin
readln(f1,x1);
a[i]:=x1;
writeln(x1);
end;
end;
close(f1);
end;
а в задание 14-1-2 нужно наверное внести в цикл дополнение:
if i=8 then
begin
write(a,’ ‘,i);
end else
begin
write(a,’ ‘,i,#9);
end;
задание 14-3-2:
const
n=5;
type
TMassive=array[1..n] of string;
TMassive2=array[1..n] of real;
var
f: text;
s,g: string;
a: TMassive;
b: TMassive2;
i: integer;
z,t: char;
procedure Zamena(var h: string; c1: char; c2: char);
var
k: integer;
begin
for k:=1 to length(h) do
begin
if h[k]=c1 then
h[k]:=c2;
end;
end;
begin
readln(z);
readln(t);
s:=’C:\Users\Кипри\Desktop\паскаль\text3.txt’;
Assign(f,s);
Reset(f);
while not EoF(f) do
begin
for i:=1 to n do
begin
readln(f,g);
Zamena(g,z,t);
a[i]:=g;
b[i]:=StrToFloat(a[i]);
writeln(b[i]);
end;
end;
close(f);
assign(f,s);
rewrite(f);
for i:=1 to n do
writeln(f,b[i]);
close(f);
end.
ну вот…(((
задание 14-3-2:
var
z: string;//имя файла
c1, c2: char;//символы для произведения замены
procedure Zamena(z: string; c1, c2: char);//процедура замены символа с1 на символ с2 в файле z
var
f: text;
a, c, d: string;
b: integer;
begin
Assign(f,z);//связываем переменную с файлом
Reset(f);//открываем для чтения
while not EoF(f) do //пока не достигнем конца файла
begin
Readln(f,a);//cчитываем строку
Writeln(a);//вывод на экран строки до изменений
b:=Pos(c1,a);//найдем позицию с1 в строке
if (b=0) then Writeln//если в строке c1 нет — ничего не меняем
else
begin
Delete(a,b,1);//удаляем с1
Insert(c2,a,b);//вставляем с2
Writeln(a);//вывод на экран измененной строки
Writeln;//абзац
end;
d:=a+#13+#10;//строку запоминаем так, чтобы после нее был абзац
c:=concat(c,d);//объединяем все строки в одну строку (текст)
end;
Close(f);//закрываем файл
Writeln;//абзац
Writeln(c);//выводим на экран готовый текст
Rewrite(f);//открываем файл для перезаписи
Writeln(f, c);//записываем новый текст
Close(f);//закрываем файл
end;
begin
z:=’acc.txt’;
writeln(‘Введите знак, который нужно изменить’);
readln(c1);
writeln(‘Введите знак, на который нужно произвести замену’);
readln(c2);
Zamena(z, c1, c2);
end.
задание 14-3-3:
var
z, z1: string;//имена файлов
n: integer;//номер отведения для записи
procedure Stolbets(z, z1: string; n: integer);
var
f, f1: text;
a, c, d, e: string;
b, k, t: integer;
begin
Assign(f,z);//связываем переменную с файлом
Reset(f);//открываем для чтения
while not EoF(f) do //пока не достигнем конца файла
begin
Readln(f,a);//cчитываем строку
for k:=1 to n do
begin
b:=Pos(#9,a);//найдем позицию табуляции в строке
if (b0) then
begin
e:=copy(a, 1, b-1);//копия числа до табуляции
Delete(a,1,b);//удаляем первое число строки и табуляцию
end
else
begin
e:=copy(a, 1, length(a));//копия оставшегося числа строки
end;
end;
d:=e+#13+#10;//строку запоминаем так, чтобы после нее был абзац
c:=concat(c,d);//объединяем все строки в одну строку (текст)
end;
Close(f);//закрываем файл
Assign(f1, z1);//связываем новый файл,в который запишем нужное отделение
Rewrite(f1);//открываем этот файл для перезаписи
Writeln(f1, c);//записываем новый текст
Close(f1);//закрываем файл
end;
begin
z:=’eeg.txt’;
z1:=’321.txt’;
writeln(‘Введите номер отделения, столбец которого нужно записать’);
readln(n);
if n>16 then writeln (false) else
Stolbets(z, z1, n);
end.
//Задание 14: Символы, строки, текстовые файлы.
//14.3 Текстовые файлы
//2) Текстовый файл acc.txt, содержит временной ряд (в виде столбика цифр), представляющий собой запись ускорения движения руки при патологическом треморе
//(дрожание руки при болезни Паркинсона). При этом в качестве разделителя целой и дробной части используется запятая.
//Для обработки файла готовой программой требуются числа с точкой в качестве разделителя. Преобразуйте файл, заменив все запятые точками.
//Для этого, в частности создайте процедуру или функцию, меняющую в строке все символы c1 на символы c2 (c1 и c2 должны быть параметрами).
program a14_3_2;
var
x, dlina: integer;
f, ff: text;
s, y, yy: string;
begin
assign (f, ‘C:\PABCWork.NET\acc.txt’);
assign (ff, ‘C:\PABCWork.NET\accc.txt’);
reset (f);
rewrite (ff);
repeat
begin
readln (f, s);
dlina:= Length(s);
x:= Pos(‘,’, s);
y:= copy (s, 1, x-1);
yy:=copy (s, x+1, dlina-x);
writeln (ff, y, ‘.’, yy);
end;
until EoF(f);
close (f);
close (ff);
end.
PascalABC.NET
бипает:
begin
System.Console.Beep(1000,500);
end.
Тарас Викторович, в 14.3.1 у меня программа записывает в файл все 0 в столбик, что я сделала неправильно?
var
f:text;
m:array[1..10] of integer;
i:integer;
begin
assign(f,’vg.txt’);
rewrite(f);
for i:=1 to 10 do
writeln(f, m[i]);
close(f);
end.
Вы не присвоили элементам m никаких значений, а по-умолчанию они оказались нулями.
Тарас Викторович, задача 1.1, пробовала заполнить массив случайными числами, но опять где-то ошибка
const
n = 10;
var
f:text;
m:array[1..n-1] of real;
i:integer;
begin
assign(f,’vg.txt’);
rewrite(f);
for i:=0 to n-1 do
m[i]:=random;
for i:=0 to n-1 do
writeln(m[i]);
for i:=1 to 10 do
writeln(f, m[i]);
close(f);
end.