#18 Явное приведение типа в Паскаль, процедура val() - преобразование строки в число

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

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

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

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

  1. Пользователь вводит строку, проверьте является ли она числом, если да, то выведите в ответ это число, иначе сообщите об ошибке.
  2. У вас есть массив:
    type
      myArr = array[1..8] of integer; 
    var
      a: myArr;
    

    -- целочисленный тип из 8 элементов.

    Пользователь вводит любые целые числа (после каждого нажимает Enter), до тех пор пока не введет символ решетки #

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

    Примечания:

    • Изначально эта задача была в более раннем уроке, но в ходе обсуждения решили перенести её в урок, где используется val()
  3. Есть строка, в которой, среди прочих символов содержатся 3 числа, выделите эти в массив.
    Проверьте работу программы на строках:
    123fdgF34sdf45g
    123fdgF34sdfg45
    fdg123F34sdfg45
  4. Пользователь вводит строку произвольных символов, посчитайте количество цифр в ней, численное значение которых больше либо равно $5$.
  5. Пользователь вводит произвольную строку, посчитайте количество чисел в ней - тех, что больше $125$. Например, в строке:
    123ret34#2145esrt5

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

    2145

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

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

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

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

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

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

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

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

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

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

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

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

    например:

     1 +  3

    или

    2 - 12

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

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

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

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

  13. Задана последовательность символов, имеющая следующий вид: $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
    

    Как решать: Выделите массив операций и массив значений, сначала посчитайте все умножения, а потом все остальное

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

  14. Задана последовательность символов, имеющая следующий вид: $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
    

    Как решать: Посчитайте результат за одно прочтение строки, без использования массивов (в нашем курсе решение в таком стиле для этой задачки было впервые добавлено участником slavina036).

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

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)
---------

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

Pages