#17 Явное приведение типа в Паскаль -- преобразование строки в число

В этом уроке речь пойдёт о явном приведении (конвертации, преобразовании) строки в число.

Что нужно знать

Задачи данного урока основаны на умении работать с одномерными массивами, в частности со строками, а также на использовании стандартной процедуры val(), позволяющей делать попытку конвертации строки в число.

Задачи для самостоятельного решения

  1. Пользователь вводит строку, проверьте является ли она числом, если да, то выведите в ответ это число, иначе сообщите об ошибке.
  2. Пользователь вводит строку произвольных символов, посчитайте количество цифр в ней, численное значение которых больше либо равно $5$.
  3. Пользователь вводит произвольную строку, посчитайте количество чисел в ней - тех, что больше $125$. Например, в строке:
    123ret34#2145esrt5

    такое число только одно и это:

    2145

    (сначала выделите эти числа из строки и запишите их в массив (of integer), а затем уже посчитайте число тех, что больше $125$)

  4. Пользователь вводит в консоль строку вида:
    Имя         123

    -- т.е. слева имя и через произвольное количество пробелов число баллов. Разберите эту строку получив имя пользователя как значение в переменной типа string и число баллов в перееменной типа integer;

  5. Пользователь вводит в консоль строки вида (имя + произвольное число пробелов + балл):
    Вася         485
    Коля       555
    Юра        61
    ..........
    ....
    end // признак завершения ввода
    

    (пока не введёт строку end) -- где слева указаны имена участников, а справа -- число баллов.
    Используя массив строк и массив целых чисел (пусть оба массива будут максимальной длины =3) считайте отдельно имена и баллы и определите победителя, выведя его имя и полученный им балл.

  6. Решите предыдущую задачу:

    Пользователь вводит в консоль строки вида (имя + произвольное число пробелов + балл):

    Вася         485
    Коля       555
    Юра        61
    ..........
    ....
    end // признак завершения ввода
    

    (пока не введёт строку end) -- где слева указаны имена участников, а справа -- число баллов.
    Используя массив строк и массив целых чисел (пусть оба массива будут максимальной длины =3) считайте отдельно имена и баллы и определите победителя, выведя его имя и полученный им балл.

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

  7. Подсказка: Т.е. такая процедура может иметь следующую сигнатуру:

    procedure getData(str: string; var name: string; var ball: integer);
    
  8. На вход вашей программы подается строка вида:
    <целоечисло><произвольное число пробелов> <арифм.операция> <произвольное число пробелов> <целоечисло>

    например:

     1 +  3

    или

    2 - 12

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

  9. На вход вашей программы подается строка вида:
    5 + 6 -34 + 56  - 7 + 2

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

  10. Задачи повышенной сложности:

  11. Задана последовательность символов, имеющая следующий вид: $p_1q_1p_2q_2p_3...q_{n–1}p_{n}$ , где $p_i$ — цифра, а $q_i$ — знак арифметического действия из набора {+, –, *}. Вычислите значение выражения, предполагая, что действия выполняются согласно правилам арифметики.
    • Входные данные: На вход программе подается строка указанного вида, состоящая не более чем из 9 цифр, разделенных символами арифметических операций.
    • Выходные данные: Выведите значение арифметического выражения.

    Примеры:

    Входные данные   Результат 
    
    5+2               7
    1-2*5+2          -7
    5*6+7-3*2+11      42
    5*6+7-3*2*3+11    30
    

    (задачка взята из книги Е. В. Андреевой)

vedro-compota's picture

Возможно, при решении задач будет полезен пример возврата массива из функции.

_____________
матфак вгу и остальная классика =)

fgh's picture

Вопрос про задачу "Пользователь вводит произвольную строку, посчитайте количество чисел в ней - тех, что больше 125". Здесь точно массив из целых чисел? А если он состоит из переменных типа string?

vedro-compota's picture

да, из строки вы должны выделить массив целых чисел.

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

5*6+7-3*2+11

|5|6|7|   3
5*6:
|30|6|7| (3) удалить элемент с позиции 2: |30|7|0| (2)

|'*'|'+'|'-'| (3) удалить элемент с позиции 1: |'+'|'-'|''| (2)
---------

_____________
матфак вгу и остальная классика =)