Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

14. Символы, строки, текстовые файлы

Предыдущий раздел:

Следующий раздел:

Задание 14: Символы, строки, текстовые файлы

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 электродов (отведений). Каждому отведению соответствует столбец чисел. Столбцы разделены символом табуляции. Создайте процедуру, выделяющую в отдельный текстовый файл отведение с заданным номером.

Следующий раздел:

Предыдущий раздел:

46 комментариев

  1. Таня

    А в 4*) числа же только целые положительные?

  2. Таня

    И вводимое выражение только из чисел и знаков операций?

  3. Таня

    И бывает ли Chartoint?

  4. Taras

    Числа любые в том числе и дробные (это вроде бы не должно влиять на сложность задачи). Отрицательных, строго говоря, нет, так как это просто соответствует вычитанию числа.

    CharToInt’а нет. Если надо, можешь каждый символ StrToInt’ом преобразовывать.

  5. Таня

    Спасибо

  6. Сергей

    а несколько арифметических действий в одной строке может быть? Например 2*2-1

  7. Taras

    Может

  8. Таня

    Можно передавать в процедуру, которая в цикле, передавать счётчик этого цикла?

  9. Taras

    Почему бы нет. Обычная переменная.

  10. Таня

    А вот не передаёт. И даже элементы строки внутри процедуры не понимает. А саму строку вроде нормально.

  11. Taras

    У меня все нормально понимает:

    program test;
    var
      i: integer;
      s: string;
    
    procedure P1(n: integer);
    begin
      writeln(n);
    end;
    
    procedure P2(s: string);
    begin
      writeln(s);
    end;
    
    procedure P3(c: char);
    begin
      writeln(c);
    end;
    
    begin
      s:='Hello';
      for i:=1 to length(s) do
      begin
        P1(i);
        P2(s[i]);
        P3(s[i]);
      end;
    end.
    
  12. Таня

    А Delete только со строками работает? Для динамического массива есть что-то подобное?

  13. Таня

    С этим разобралась. А может быть например
    "2*3/-7"? Ну, чтобы отрицательные элементы не только вначале были?

  14. Taras

    1) Delete работает только со строками. Для массивов надо свой создать :)

    2) Нет, так не может быть. Минус надо тащить в начало: -2*3/7.
    Или позволять использовать скобки: 2*3/(-7), но это серьезное усложнение задачи.

  15. Таня

    а может так просто нельзя вводить и всё? хотя от этого не легче будет, он у меня всё равно только 2 числа умножать умеет(

  16. Taras

    Я как раз и хотел сказать что "2*3/-7" нельзя вводить. Если пользователь хочет делить на -7, пусть вводит "-2*3/7".

  17. Таня

    Попробую. И ещё я поняла что для каждого знака кажется всё-таки нужно отдельную процедуру. А то когда он второй считает, там с массивом из чисел проблемы, я же его длину изменяю. И ещё массив знаков сделала, его тоже короче после каждой операции делаю

  18. Таня

    Кажется получилось! Можно будет 27 прийти на зачёт показать?

  19. Таня

    И как обычно ложная тревога(
    но я не сдаюсь))

  20. Taras

    Приходи, конечно.

  21. Таня

    Тарас Викторович, а как выглядит уравнение для частотно-модулированной (ЧМ) синусоиды?

  22. Taras

    Частота должна меняться. Например, тоже синусоидально:

    \omega=\frac{\displaystyle d\phi}{\displaystyle dt}=\omega_0+a_m\sin(\omega_m\cdot t),

    где a_m и \omega_m — амплитуда и частота модуляции. Соответственно, фаза равна

    \phi(t)=\omega_0\cdot t-\frac{\displaystyle a_m}{\displaystyle \omega_m}\cos(\omega_m\cdot t).

    Ну, и сама синусоида:

    x(t) = \sin(\phi(t))=\sin(\omega_0\cdot t-\frac{\displaystyle a_m}{\displaystyle \omega_m}\cos(\omega_m\cdot t))

  23. Таня

    спасибо!

  24. оксана

    Здравствуйте)))), проверьте, пожалуйста:
    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.

  25. Аноним

    задание строки 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.

  26. оксана

    с нового компа я аноним получилась)))

  27. Taras

    Привет! )) Давно, так сказать, не виделись.

    14.1.-2 — не исправляй, но просто скажи, откуда в первой строке 17-й столбец? А так, все хорошо.

    и 14.1.-3 — ок

    задание строки 2 — не очень хорошо, что функция FIO не только возвращает преобразованную строку, но и меняет свой параметр s. Стоило бы возвращать результат каким-то одним из этих способов. И еще хотелось бы получить результат за один проход строки, а не за два, как сейчас.

  28. оксана

    Вроде 17-й столбец не в первой строке.. Как это один проход строки? Чтобы один цикл был?

  29. Taras

    У меня в 1-й:

    Да, с одним циклом.

  30. оксана

    так девятка сдвинулась почему-то)))

  31. оксана

    задание 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*) «*» означает задача повышенной сложности? я уже весь мозг сломала)))

  32. оксана

    задание строки 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.

  33. оксана

    опять забыла про теги)))
    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.

  34. оксана

    задание 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;

  35. Taras

    >> так девятка сдвинулась почему-то)))

    Чего это она? ))

    >> задание 14-2-3:

    s и x должны быть локальными переменными, а не параметрами. Ты же никак не используешь переданные значения (s1, x1).

    >> а в задании 4*) «*» означает задача повышенной сложности? я уже весь мозг сломала)))

    Да, чуть сложнее прочих.

    >> задание строки 2 так пойдет?:

    Пойдет.
    Кстати, можно было бы не удалять лишнее из полной строки, а формировать новую. Получилось бы короче — там, где у тебя сейчас удаления можно было бы просто ничего не делать.

    >> задание 14-3-1:

    f1 — опять локальная переменная, зачем-то помещенная в список параметров.

    Вместо Append я бы использовал Rewrite. Apend можно оставить, но это подразумевает, что в одном файле могут быть записаны или несколько массивов или какая-то другая информация кроме массива. Тогда соответствующая обратная процедура должна содержать указания на то, начиная с какой строки, следует читать массив. И читать его не до конца файла, а до конца массива. Вообще проверка, что ты не выходишь за конец массива, в любом случае бы, не помешала.

    TextMas не читает данные из файла в массив, а только печатает содержимое файла на экране.

  36. оксана

    задание 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;

  37. оксана

    а в задание 14-1-2 нужно наверное внести в цикл дополнение:
    if i=8 then
    begin
    write(a,’ ‘,i);
    end else
    begin
    write(a,’ ‘,i,#9);
    end;

  38. оксана

    задание 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.

  39. оксана

    ну вот…(((

  40. Helene

    задание 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.

  41. Helene

    задание 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.

  42. Ruslan

    //Задание 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.

  43. Сергей

    PascalABC.NET
    бипает:
    begin
    System.Console.Beep(1000,500);
    end.

  44. оксана

    Тарас Викторович, в 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.

  45. Taras

    Вы не присвоили элементам m никаких значений, а по-умолчанию они оказались нулями.

  46. оксана

    Тарас Викторович, задача 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.

Добавить комментарий