Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Изучение Си после Паскаля.rtf
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.01 Mб
Скачать

Развилки Пример задачи: размер файла в байтах

Необходимо решить следующую задачу. Задан размер файла в байтах. Требуется вывести размер в тех единицах измерения, которые удобнее всего использовать в конкретном случае.

Пример:

  1. Файл имеет размер 10240 байт (б). Это то же самое, что 10 килобайт (Кб) или 0.0098 мегабайта (Мб). Ясно, что в данном случае удобнее всего размер выдавать в килобайтах.

  2. Файл имеет размер 1500000 байт (б). Это то же самое, что 1464,84 килобайта (Кб) или 1.043 мегабайта (Мб). Ясно, что в данном случае удобнее всего размер выдавать в мегабайтах.

Пересчет из байт в другие единицы измерения производится по формулам:

1 Кб = 1024 б

1 Мб = 1024 Кб = 1024*1024 б = 1 048 576 б

1 Гб = 1024 Мб = 1024*1024*1024 б = 1 073 741 824 б

Уточним задачу.

Дано число X. 0 <= X <= 2 000 000 000.

Нужно вывести X, если X < 1024.

Если 1024 <= X < 1024*1024, нужно вывести X / 1024.

Если 1024*1024 <= X < 1024*1024*1024, нужно вывести X / (1024*1024).

Если X >= 1024*1024*1024, нужно вывести X / (1024*1024*1024).

Усеченные развилки

Решение задачи на Паскале:

var

x: longint;

Begin

Write(‘Введите размер файла:’);

read(x);

if x < 0 then

begin

writeln(‘Вы ввели неправильный размер файла!’);

exit;

end;

if x < 1024 then

writeln(‘size = ‘, x, ‘ б’);

if (x >= 1024) and (x < 1024*1024) then

writeln(‘size = ‘, (x / (1024)):0:2, ‘ Кб’);

if (x >= 1024*1024) and (x < 1024*1024*1024) then

writeln(‘size = ‘, (x / (1024*1024)):0:2, ‘ Мб’);

if x >= 1024*1024*1024 then

writeln(‘size = ‘, (x / (1024*1024*1024)):0:2, ‘ Гб’);

End.

В Паскале существует две операции деления. Обычная операция деления обозначается знаком / - в результате выполнения такой операции получается результат - вещественное число. Операция целочисленного деления обозначается DIV. Оба операнда операции DIV должны иметь целый тип.

В данном примере используется обычное деление, в результате которого получается вещественное число.

В примере обратите внимание на формат вывода :0:2. Такая запись означает нулевую минимальную ширину поля и две цифры после запятой. Нулевая минимальная ширина поля означает, что число при выводе будет занимать столько позиций, сколько нужно.

Реализация на Си:

#include <stdio.h>

int main()

{

long x;

printf(“Введите размер файла:”);

scanf(“%ld”, &x);

if (x < 0)

{

pritnf(“Вы ввели неправильный размер файла!”);

return 1; //Возвращаем из main не 0 – сигнал об ошибке

//во время исполнения программы

}

if (x < 1024)

printf(“size = %d б“, (int) x); // x имеет тип long,

// а в форматной строке указан %d – int,

// поэтому необходимо приведение типа (int) x

if (x >= 1024 && x < 1024.0*1024)

printf(“size = %0.2f Кб”, x / 1024.0);

if (x >= 1024.0*1024 && x < 1024.0*1024*1024)

printf(“size = %0.2f Мб“, x / (1024.0*1024));

if (x >= 1024.0*1024*1024)

printf(“size = %0.2f Гб“, x / (1024.0*1024*1024));

return 0;

}

В отличие от Паскаля, в Си операция деления одна, и обозначается она /. Но (!) если хотя бы один операнд имеет вещественный тип, то результат вычисляется по правилам деления вещественных чисел (то есть как при использовании операции / в Паскале). Если оба операнда имеют целый тип, то результат получается по правилам деления целых чисел (как при использовании DIV в Паскале). Это означает, что если разделить целое число 2000 на 1024, то получится 2000 / 1024 = 1, а не 1.95. В нашем примере нам нужно, чтобы деление не было целочисленным. Поэтому при делении 2000 / 1024 выполняем 2000 / 1024.0. Поскольку один из операндов вещественный, то и результат будет вещественный 2000 / 1024.0 = 1.95.

Сравним усеченную развилку в Паскале и в Си:

Паскаль

Си

if x < 1024 then

writeln(x);

if (x < 1024)

printf(“%d “, (int)x);

Отличие усеченной развилки в Паскале и Си видно из примера и из формального описания синтаксиса:

Паскаль:

If УСЛОВИЕ Then ОПЕРАТОР

Си:

if (УСЛОВИЕ) ОПЕРАТОР