- •О.Ф.Власенко, и.В.Беляева изучение си после паскаля: циклы, развилки, функции, обработка одномерных массивов
- •Оглавление
- •Вывод в языке си Простейшая программа «Привет, мир!»
- •Функция printf – форматированный вывод
- •Циклы в языке си «Привет, мир!» 100 раз
- •Цикл с предусловием в Паскале и Си
- •Цикл с постусловием в Паскале и Си
- •Цикл for в Паскале и Си
- •Задачи простые
- •Задачи средней сложности
- •Задачи сложные
- •Функции в языке си Локальные и глобальные переменные
- •Функции без параметров в Си
- •Функции с параметрами
- •Способы передачи параметров в подпрограммы
- •Работа с указателями: операции взятия адреса и разыменования адреса
- •Ввод в языке си Функция getch – ввод символа
- •Функция scanf - форматированный ввод
- •Развилки Пример задачи: размер файла в байтах
- •Усеченные развилки
- •Полные развилки
- •Варианты для простых заданий и для заданий средней сложности
- •Задания среднего уровня сложности
- •Рекуррентные соотношения для вычисления корней
- •Разложение в ряд некоторых функций
- •Пример выполнения лабораторной работы по заданиям среднего уровня сложности
- •Сложные задания
- •Пример выполнения лабораторной работы по сложным заданиям
- •Варианты для сложных заданий
- •Организация меню. Управляющая структура Выбор (switch) Организация простейшего меню
- •Массивы в си Объявление и инициализация одномерных массивов в Си
- •Вычисление адреса элемента массива
- •Адресная арифметика
- •Имя массива является указателем на нулевой элемент массива
- •Передача массива в функцию через параметр
- •Примеры обработки массивов в Си
- •Задание для лабораторной работы по теме «Обработка одномернЫх массивОв» Цель работы
- •Общее задание
- •Пример выполнения лабораторной работы
- •Задачи простые
- •Задачи средней сложности
- •Задачи сложные
- •Список литературы
- •Изучение си после паскаля: циклы, развилки, функции, обработка одномерных массивов
- •432027, Г. Ульяновск, Сев. Венец, 32.
Развилки Пример задачи: размер файла в байтах
Необходимо решить следующую задачу. Задан размер файла в байтах. Требуется вывести размер в тех единицах измерения, которые удобнее всего использовать в конкретном случае.
Пример:
Файл имеет размер 10240 байт (б). Это то же самое, что 10 килобайт (Кб) или 0.0098 мегабайта (Мб). Ясно, что в данном случае удобнее всего размер выдавать в килобайтах.
Файл имеет размер 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 (УСЛОВИЕ) ОПЕРАТОР
