- •О.Ф.Власенко, и.В.Беляева изучение си после паскаля: циклы, развилки, функции, обработка одномерных массивов
- •Оглавление
- •Вывод в языке си Простейшая программа «Привет, мир!»
- •Функция printf – форматированный вывод
- •Циклы в языке си «Привет, мир!» 100 раз
- •Цикл с предусловием в Паскале и Си
- •Цикл с постусловием в Паскале и Си
- •Цикл for в Паскале и Си
- •Задачи простые
- •Задачи средней сложности
- •Задачи сложные
- •Функции в языке си Локальные и глобальные переменные
- •Функции без параметров в Си
- •Функции с параметрами
- •Способы передачи параметров в подпрограммы
- •Работа с указателями: операции взятия адреса и разыменования адреса
- •Ввод в языке си Функция getch – ввод символа
- •Функция scanf - форматированный ввод
- •Развилки Пример задачи: размер файла в байтах
- •Усеченные развилки
- •Полные развилки
- •Варианты для простых заданий и для заданий средней сложности
- •Задания среднего уровня сложности
- •Рекуррентные соотношения для вычисления корней
- •Разложение в ряд некоторых функций
- •Пример выполнения лабораторной работы по заданиям среднего уровня сложности
- •Сложные задания
- •Пример выполнения лабораторной работы по сложным заданиям
- •Варианты для сложных заданий
- •Организация меню. Управляющая структура Выбор (switch) Организация простейшего меню
- •Массивы в си Объявление и инициализация одномерных массивов в Си
- •Вычисление адреса элемента массива
- •Адресная арифметика
- •Имя массива является указателем на нулевой элемент массива
- •Передача массива в функцию через параметр
- •Примеры обработки массивов в Си
- •Задание для лабораторной работы по теме «Обработка одномернЫх массивОв» Цель работы
- •Общее задание
- •Пример выполнения лабораторной работы
- •Задачи простые
- •Задачи средней сложности
- •Задачи сложные
- •Список литературы
- •Изучение си после паскаля: циклы, развилки, функции, обработка одномерных массивов
- •432027, Г. Ульяновск, Сев. Венец, 32.
Циклы в языке си «Привет, мир!» 100 раз
Напишем программу, 100 раз выводящую на экран фразу «Привет, мир!!!». Ясно, что лучшим решением будет использование цикла. Решим эту задачу с использованием всех трех циклов по очереди – while, do … while (repeat ... until), for.
Цикл с предусловием в Паскале и Си
Пример на Паскале:
var
I: integer;
Begin
I := 1;
while I <= 100 do
begin
Write(‘Привет, мир! ’);
inc(I);
end;
End.
Пример на Си:
#include <stdio.h>
int main()
{
int i;
i = 1;
while (i <= 100)
{
printf(“Привет, мир! ”);
i++;
}
return 0;
}
Сравним цикл на Паскале и на Си:
Паскаль |
Си |
I := 1; while I <= 100 do begin Write(‘Привет, мир! ’); inc(I); end; |
i = 1; while (i <= 100) { printf(“Привет, мир! ”); i++; } |
Отличие цикла while в Паскале и Си видно из примера и из формального описания синтаксиса:
Паскаль:
while УСЛОВИЕ_ПРОДОЛЖЕНИЯ_ЦИКЛА do ОПЕРАТОР
Си:
while (УСЛОВИЕ_ПРОДОЛЖЕНИЯ_ЦИКЛА) ОПЕРАТОР
Цикл с постусловием в Паскале и Си
Пример на Паскале:
var
I: integer;
Begin
I := 1;
Repeat
Write(‘Привет, мир! ’);
inc(I);
Until I > 100;
End.
Пример на Си:
#include <stdio.h>
int main()
{
int i;
i = 1;
do
{
printf(“Привет, мир! ”);
i++;
} while (i <= 100);
return 0;
}
Сравним цикл на Паскале и на Си:
Паскаль |
Си |
I := 1; Repeat
Write(‘Привет, мир! ’); inc(I); Until I > 100;
|
i = 1; do { printf(“Привет, мир! ”); i++; } while (i <= 100);
|
Отличие цикла с постусловием в Паскале и Си видно из примера и из формального описания синтаксиса:
Паскаль:
Repeat ОПЕРАТОРЫ Until УСЛОВИЕ_ВЫХОДА_ИЗ_ЦИКЛА
Си:
do ОПЕРАТОР while (УСЛОВИЕ_ПРОДОЛЖЕНИЯ_ЦИКЛА);
Обратите внимание:
В Си в теле цикла do while стоит только один оператор. Если требуется, чтобы в цикле выполнялись несколько операторов, то их нужно заключить в { }.
В Паскале цикл с постусловием выполняется до тех пор, пока не выполняется условие, записанное после UNTIL. В Си цикл с постусловием выполняется до тех пор, пока выполняется условие записанное после WHILE.
Цикл for в Паскале и Си
Пример на Паскале:
var
I: integer;
Begin
for I := 1 to 100 do
Write(‘Привет, мир! ’);
End.
Пример на Си:
#include <stdio.h>
int main()
{
int i;
for (i = 1; i <= 100; i++)
printf(“Привет, мир! ”);
return 0;
}
Сравним цикл на Паскале и на Си:
Паскаль |
Си |
for I := 1 to 100 do Write(‘Привет, мир! ’); |
for (i = 1; i <= 100; i++) printf(“Привет, мир! ”); |
Отличие цикла for в Паскале и Си видно из примера и из формального описания синтаксиса:
Паскаль:
For СЧЕТЧИК := НАЧАЛЬНОЕ_ЗНАЧЕНИЕ
To КОНЕЧНОЕ_ЗНАЧЕНИЕ
Do ОПЕРАТОР
Или
For СЧЕТЧИК := НАЧАЛЬНОЕ_ЗНАЧЕНИЕ
Downto КОНЕЧНОЕ_ЗНАЧЕНИЕ
Do ОПЕРАТОР
Си:
for (ИНИЦИАЛИЗАЦИЯ_ПАРАМЕТРОВ_ЦИКЛА; УСЛОВИЕ_ПРОДОЛЖЕНИЯ_ЦИКЛА;
ИЗМЕНЕНИЕ_ПАРАМЕТРОВ_ЦИКЛА)
ОПЕРАТОР;
Обратите внимание: в Паскале две формы цикла For. Одна для прямого подсчета – счетчик изменяется от НАЧАЛЬНОГО_ЗНАЧЕНИЯ до КОНЕЧНОГО_ЗНАЧЕНИЯ с шагом +1 (for i := 1 to 100 do). Вторая форма считает с шагом –1 (for i := 100 downto 1 do).
В Си цикл FOR значительно более универсален. В разделе ИНИЦИАЛИЗАЦИЯ_ПАРАМЕТРОВ_ЦИКЛА может быть записано через запятую любое количество любых выражений. То же самое относится к разделу ИЗМЕНЕНИЕ_ПАРАМЕТРОВ_ЦИКЛА. В УСЛОВИИ_ПРОДОЛЖЕНИЯ_ЦИКЛА может быть записано любое логическое выражение.
Пример использования цикла FOR:
Задача: вывести на экран таблицу степеней 2.
В результате работы программы должна получиться следующая таблица:
N |
2^N |
0 |
1 |
1 |
2 |
2 |
4 |
3 |
8 |
4 |
16 |
5 |
32 |
6 |
64 |
7 |
128 |
8 |
256 |
9 |
512 |
10 |
1024 |
Напишем реализацию на Паскале:
var
n, y: integer;
Begin
Writeln(‘+----+------+’);
Writeln(‘| N | 2^N |’);
Writeln(‘+----+------+’);
y := 1;
for n := 0 to 10 do
begin
writeln(‘| ’, n:2, ‘ | ’, y:4, ‘ |’);
y := y * 2;
end;
Writeln(‘+----+------+’);
End.
Реализация на Си:
#include <stdio.h>
int main()
{
int n, y;
printf(“+----+------+\n”);
printf(“| N | 2^N |\n”);
printf(“+----+------+\n”);
for (y = 1, n = 0; n <= 10; y *= 2, n++)
printf(“| %2d | %4d |\n”, n, y);
printf(“+----+------+\n”);
return 0;
}
В этом примере в цикле FOR одновременно используются два счетчика – N и Y. В Паскале этого сделать нельзя, поэтому программа на Паскале получается длиннее, чем на Си.
задание для Лабораторной работы по теме «ЦИКЛЫ и вывод в Си»
Цель работы
Изучить использование различных циклов и процедуры вывода PRINTF.
Общее задание
Необходимо разработать 3 программы, каждая из которых выполняет одни и те же действия: вывод на экран набора символов, указанных в варианте. В программе №1 требуется использовать цикл с постусловием do .. while. В программе №2 требуется использовать цикл с предусловием while. В программе №3 требуется использовать цикл for. Массивы и файлы в программе использовать нельзя.
Пример выполнения лабораторной работы
Задание: На экран нужно вывести набор символов:
A B C D E
B C D E F
C D E F G
D E F G H
E F G H I
Программа №1 (с циклом do … while):
#include <stdio.h>
#include <conio.h>
int main()
{
int i, j, c;
clrscr();
// Внешний цикл обеспечивает вывод 5 строк
// с начальными символами строки ‘A’, ‘B’, ‘C’, ‘D’ и ‘E’
i = ‘A’;
do
{
// Внутренний цикл обеспечивает вывод ровно 5 символов,
// начиная с символа i
c = i;
j = 0;
do
{
printf(“%c ”, c);
c++;
j++;
} while (j < 5);
printf(“\n\n”);
i++
} while (i <= ‘E’);
return 0;
}
Программа №2 (с циклом while):
#include <stdio.h>
#include <conio.h>
int main()
{
int i, j, c;
clrscr();
// Внешний цикл обеспечивает вывод 5 строк
// с начальными символами строки ‘A’, ‘B’, ‘C’, ‘D’ и ‘E’
i = ‘A’;
while (i <= ‘E’)
{
// Внутренний цикл обеспечивает вывод ровно 5 символов,
// начиная с символа i
c = i;
j = 0;
while (j < 5)
{
printf(“%c ”, c);
c++;
j++;
}
printf(“\n\n”);
i++
}
return 0;
}
Программа №3 (с циклом for):
#include <stdio.h>
#include <conio.h>
int main()
{
int i, j, c;
clrscr();
// Внешний цикл обеспечивает вывод 5 строк
// с начальными символами строки ‘A’, ‘B’, ‘C’, ‘D’ и ‘E’
for (i = ‘A’; i <= ‘E’; i++)
{
// Внутренний цикл обеспечивает вывод ровно 5 символов,
// начиная с символа i
for (c = i, j = 0; j < 5; c++, j++)
printf(“%c ”, c);
printf(“\n\n”);
}
return 0;
}
