close

Вход

Забыли?

вход по аккаунту

?

Язык С

код для вставкиСкачать
Программирование
ЯЗЫК С
1. Введение
2. Оперативная память и типы данных
3. Переменные , адреса и указатели
4. Оператор присваивания
5. Арифметические операторы
6. Логические операторы
7. Приоритет операций
8. Структура программы
9. Простейший ввод-вывод
10. Линейный алгоритм
11. Разветвляющийся алгоритм
12. Цикл с предусловием
13. Цикл с постусловием
14. Вариант
15. Одномерные массивы
16. Функции
Что такое программирование?
Программирование – разработка
алгоритмов для решения разнообразных
задач (прикладных и системных) и запись
их на определенном языке
программирования.
Исполнитель алгоритмов?
Компьютер
Система команд исполнителя?
Машинный язык (машинный код)
Языки программирования
Низкого уровня –
машинные языки
Высокого уровня –
языки, понятные
человеку
Компилятор – переводчик с
человеческого на машинный
Программа
на языке
высокого
уровня
Компилятор
(Это тоже
программа!)
Текстовый файл, который
создается программистом и
имеет тип, соответствующий
языку программирования,
например .С
Программа
на машинном
языке
(в машинном
коде)
Исполняемый файл,
тип .EXE
История создания языка C
Начало компьютерной эры – 1970 год.
Кен Томпсон и Дэннис Ритчи из Bell Labs
В 60-е годы для каждого типа
поставили задачу совместного
компьютеров независимо
использования компьютеров
разных типов.
разрабатывались операционные
Томпсон и Ритчи решили
создать
системы,
каждая на своем
универсальную мобильную
операционную
машинном
языке.
систему, а для этого понадобился не менее
универсальный и мобильный
языкоперационная
Unix – это первая
система, практически полностью
программирования.
не на машинном
Таким языком стал С,написанной
а такой операционной
языке, а на языке высокого
системой – Unix. уровня, понятном человеку, на
языке С.
История создания языка C
Новое время ставит новые задачи –
например, создание удобных
пользовательских интерфейсов.
В начале 80-х годов Бьерн Страуструп в Bell
Labs стал разрабатывать расширение
языка С под названием C++. Рождением
языка можно считать выход в 1985 году
книги Страуструпа . С этого момента C++
начинает набирать всемирную
популярность.
Как объяснить непосвященному
что такое программирование?
Если вы когда-нибудь задавались этим вопросом, то знаете,
насколько непросто на него ответить.
Что такое программирование?
Представьте, что вы подробно описываете надевание
штанов: "взять штаны так, чтобы ширинка была спереди, а
задний карман - сзади; нагнуться, опустить руки до уровня
коленок..." и т. д. Это и есть программирование.
Что такое программирование на машинном языке?
Представьте, что вы описываете надевание штанов очень
подробно, в виде: "сократить такую-то мышцу, растянуть
такую-то..."
Что такое тестирование программы?
Протестировать программу - значит попробовать надеть
штаны. Могу гарантировать, что с первого раза у вас ничего
не получится: штаны вы наденете задом наперед или на
голову.
Что такое ошибка в программе?
Если, надев штаны по своему описанию, вы обнаружили,
что ширинка застегнута у вас на затылке или что вы не
можете ее застегнуть совсем (из-за стянутых штанами рук),
значит, вами была допущена ошибка в программе.
Что такое ошибка, приводящая к зависанию компьютера?
Если, надев штаны, вы обнаружили, что задохнулись.
Что такое переносимость?
Это когда по вашему алгоритму можно надеть любые штаны
на любого человека.
Что такое крах системы?
Исчезновение ваших штанов - как результат вашей
деятельности.
Вопросы для повторения
Что такое алгоритм?
Что такое (или кто такой) исполнитель?
Что такое Система Команд Исполнителя?
Что такое программирование?
Что такое машинный язык?
Что такое язык высокого уровня?
Как из программы, понятной человеку,
получается программа, понятная
компьютеру?
Информационные
взаимодействия в компьютере
Процессор
Оперативная память
Внешние запоминающие
устройства
Собственно процессор и
есть ИСПОЛНИТЕЛЬ,
именно он выполняет все
операции по обработке
данных.
Чтобы процессор имел
доступ к данным, они
должны быть помещены в
Оперативную Память.
Обрабатываемая
компьютером информация
называется ДАННЫЕ. Все
данные хранятся на Внешних
Запоминающих Устройствах.
Логическое устройство
Оперативной Памяти (ОП)
ОП можно представить как линейную
последовательность ячеек размером в 1
байт (8 двоичных цифр).
Каждая ячейка имеет АДРЕС, который
можно представить как ее порядковый
номер.
Типы данных
Все данные в ОП – числовые, отличаются друг от
друга объемом занимаемой памяти и способом
интерпретации содержимого.
Основные типы данных в
языке C
Целочисленные типы
char
int
long
Типы с плавающей точкой
float
double
long
double
Целочисленные типы (часть)
Тип данных
Байты Биты
Min
Max
сhar
1
8
-128
127
unsigned char
1
8
0
255
int
2
16
-32 768
32 767
long
4
32 -2 147 483 648
2 147 483 647
unsigned - беззнаковый
С плавающей точкой (часть)
Тип данных
Байты
Биты
Min
Max
float
4
32
±3.4E-38
±3.4E+38
double
8
64
±1.7E-308
±1.7E+308
long double
10
80
±3.4E-4932
±3.4E+4932
E означает «10 в степени», т.е.
1.7E+308 = 1,7∙10308
Комментарии в программе
Комментарий – текст в программе, не
влияющий на ее компиляцию и
исполнение.
Предназначен для
Пояснения программы
Временного отсечения фрагментов
программы
Обозначается: /* комментарий */
Вопросы для повторения
Чем внешняя память отличается от внутренней?
Какое устройство в компьютере является
Исполнителем программ?
Как устроена оперативная память?
Что такое адрес в оперативной памяти?
Какие два вида типов данных используется в
языке C?
Перечислите основные целочисленные типы
Перечислите основные типы с плавающей точкой
Если данные содержат номер месяца, то какой
самый экономный тип данных для них подходит?
Если данные содержат объем ВВП страны в
рублях, то какой тип данных для них подходит?
Переменная
Переменная – это область памяти, имеющая имя.
Давая переменной имя, программист одновременно тем же именем
называет и область памяти, куда будут записываться значения
переменной для хранения.
Имя
должно быть осмысленным.
может содержать от одного до 32 символов.
разрешается использовать большие и маленькие английские
буквы, цифры и символ подчёркивания. Большие и маленькие
буквы – РАЗНЫЕ!
начинается обязательно с буквы или подчеркивания.
не может совпадать с зарезервированными словами.
Какие из этих имен допустимы?
mama
g7830
divan-krovat
Dima
45kalibr
_45
ok!
hjkjhkzdsf
RazmerPartiiTovara
X
x
int
Оператор создания переменной
Все переменные обязательно должны быть
объявлены (созданы).
При объявлении (создании) переменной
компилятор отводит ей место в памяти в
зависимости от её типа.
тип_данных имя_переменной = значение;
Примеры:
int max_bal=0;/*максимальный балл*/
float AbsUsp; /*абсолютная успеваемость*/
long x1,x2,x3,x4;/*изменяющиеся значения */
double tochnost=1E-5;/*точность вычислений*/
Оператор создания переменной
Что происходит в ОП, когда выполняется
оператор объявления переменной и задания
ее начального значения?
int x=10;
В свободной области ОП выделяется 2 байта.
Теперь эта область памяти называется “x”.
Потом значение “10” переводится в двоичный
вид и помещается в ячейки памяти.
Адреса переменных
Адресом переменной называется адрес
первой из ячеек ОП, в которых она
размещена.
Операция взятия адреса переменной: &
&x
Операция взятия значения по адресу: *
*(&x)
Вопросы для повторения
Что такое переменная?
Как связаны переменная и ОП?
Какие есть требования к имени переменной?
Что такое «объявление переменной»?
Создайте переменную для расчета количества
дней для выплаты кредита.
Что происходит в ОП, когда создается эта
переменная?
Что такое «адрес переменной»?
Как можно узнать адрес переменной?
Указатель
Указатель – это переменная, значением которой
является адрес в ОП.
Создание указателя:
тип_данных *имя_указателя;
Например:
int x=10;
int *ptr; /*pointer - указатель*/
Каковы значения:
ptr=&x;
10 6100
x
&x
*x
ptr
&ptr
*ptr
10
ptr (6100)
Нельзя!
&x (6100)
6102
x (10)
Оператор присваивания
имя_переменной = выражение;
Информация передается
Примеры:
a=x+z;
b=b–10;
5=a;
x–10=3;
Операторы изменения данных
Арифметические:
результатом является
число
Операторы
изменения данных
Логические:
результатом является
логическое значение
И (1) или Л (0)
Арифметические операторы
+
• Сложение
• a=b+c;
–
• Вычитание
• a=b-c;
*
• Умножение
• a=b*c;
/
• Деление
• a=b/c;
%
>> , <<
• Остаток от деления
• a=b%c;
• Побитовый сдвиг
• a=b<<2;
• a=b>>1;
Бинарные
операторы
(«Бинарный»
означает, что
есть два
операнда –
справа и слева)
Вопросы для повторения
Что происходит в ОП, когда с помощью оператора
описания создается целая переменная:
int a=100;
Что происходит в ОП при дальнейшем выполнении
операторов:
int *adres;
adres=&a;
Что такое указатель?
Общий вид оператора присваивания.
Пусть температура остывания расплава вычисляется по
формуле
, где T – температура (º),
t – время (минуты).
Создайте переменные и напишите оператор
присваивания для расчета температуры для времени 2,5
мин.
Арифметические операторы
++
--
• Инкремент
• Префиксная форма: ++a;
• Постфиксная форма: a++;
• Декремент
• Префиксная форма: --a;
• Постфиксная форма: a--;
Унарные
операторы
(«Унарный»
означает, что
есть один
операнд)
Арифметические операторы
В префиксной форме сначала выполняется
операция инкремента (декремента) , а потом
все остальное выражение.
В постфиксной форме сначала выполняется
все остальное выражение , а потом операция
инкремента (декремента).
int a=10, b=5, c;
c=++a-b++;
Результат:
a=11
b=6
c=6
Арифметические операторы
+=
• Увеличить на
• a+=b; /* или a=a+b */
–=
• Уменьшить на
• a–=b; /* или a=a–b */
*=
• Увеличить в
• a*=b; /* или a=a*b */
/=
• Уменьшить в
• a/=b; /* или a=a/b */
%=
• Оставить остаток от деления
• a%=b; /* или a=a%b */
Арифметические операторы
Пример:
int a=10, b=2, c;
Тип результата выражения зависит от
a*=b;
типов операндов. Все операнды
b++;
преобразуются к самому большому по
занимаемой памяти, т.е. к самому
c=a/b;
сложному из них, это и будет тип
результата.
int a=10, b=2;
float c;
float a=10, b=2, c;
a*=b;
a*=b;
b++;
b++;
c=a/b;
c=a/b;
Логические операторы
>
• Больше
• a>b
<
• Меньше
• a<b
>=
• Больше или равно
• a>=b
<=
• Меньше или равно
• a<=b
==
• Равно
• a==b
!=
• Неравно
• a!=b
Применяется
для сравнения
значений,
результатом
является
0 (Л) или 1 (И)
Логические операторы
!
• Отрицание
•!(a>5)
&&
• И (Логическое умножение)
• (2.5<=b)&&(b<=6.75)
||
• ИЛИ (Логическое сложение)
• (c<0) || (5<c)
Применяется
для комбинирования
логических
выражений,
результатом
является
0 (Л) или 1 (И)
Приоритет операций
Приоритет
Оператор
Комментарий
1
++
++ и – – в префиксной форме
2
!
3
* / %
4
+
5
>>
6
< > <= >=
7
==
11
&&
12
||
14
= += –= *= /= %=
>>= <<=
15
++
– – ()
* &
! – логическое отрицание
* и & в отношении адресов
–
<<
!=
––
++ и – в постфиксной форме
Структура программы
Программа на языке С – это набор функций,
которые могут передавать друг другу
управление (то есть могут вызывать друг
друга). Самая главная функция, с которой
все начинается, называется main
#include <stdio.h> ← подключение файлов, в
частности, stdio.h – файл,
main() ← заголовок функции содержащий описание
стандартного ввода-вывода
{ ← начало блока операторов
текст программы ← программа в виде
последовательности
операторов
} ← конец блока операторов
Простейший ввод-вывод
ОП
данные
Устройства ввода-вывода
этого
предусмотрена
форматная строка.
каждого элемента данных
1. Для
Как
данные
выглядят?
КакДля
компьютеру
форматная строка содержит свой код формата:
% количество_символов . точность символ_типа
Символы типа:
int
d
Пример:
long int
ld
%d
- формат для целых чисел
float, double
f, e, g
%5.2f - дробное в 5 позициях,
2 знака после десятичной точки
интерпретировать (понять) ту
последовательность символов, которую он
получит с клавиатуры? Или в виде каких
символов их показать на мониторе?
этого
предназначен
2. Для
Где
данные?
В каких областях памяти они
• список переменных при выводе
содержатся
или будут
содержаться?
• список
адресов переменных
при вводе
Простейший ввод-вывод
Разница между вводом и выводом:
Вывод:
printf(″формат″,переменные);
Для форматной строки: при вводе ТОЛЬКО коды
Пример:
форматов, при выводе обязательно
printf(″x=%d,
y=%d\n″,x,y);
дополнительная информация,
чтобы было понятно,
что это за цифры на экране.
Ввод:
scanf(″формат″,адреса переменных);
Для списка переменных: при выводе ТОЛЬКО
Пример:
переменные, при вводе переменные с
АМПЕРСАНДАМИ.
scanf(″%d%d″,&x,&y);
Простейшая программа
#include <stdio.h>
main()
{
int x;
printf(″x=″);
scanf(″%d″,&x);
x++;
printf(″x=%d\n″,x);
}
Алгоритмические структуры:
Линейный алгоритм
Начало
Создание переменных
Ввод данных
Расчёты
Вывод данных
Конец
Стандартные задачи:
Обмен значениями
Существует две переменные, имеющие определенные
значения. Необходимо обменять значения переменных.
#include <stdio.h>
main()
Почему нельзя просто написать
{
a=b;
int a,b,c;
b=a;
printf(″a=″);
?
scanf(″%d″,&a);
printf(″b=″);
scanf(″%d″,&b);
c=a;
a=b;
b=c;
printf(″a=%d,b=%d\n″,a,b);
}
Вычислительные задачи
Даны два значения a и b. Требуется
вычислить три значения:
Вычислительные задачи
Известно количество «5», «4», «3» и «2» по
определенному предмету в классе.
Надо вычислить абсолютную и относительную
успеваемость и СОУ.
Абсолютная успеваемость: % «5», «4», «3»
Относительная успеваемость: % «5» и «4»
СОУ:
(кол-во «5»+ 0,64 ∙ кол-во «4»+
0,36 ∙ кол-во «3»+0,14 ∙ кол-во «2»)/всего оценок
Интересная задача
Задумайте любое трёхзначное число.
Запишите шестизначное число, в записи
которого дважды повторено исходное
число. Полученное шестизначное число
разделите на 13, результат разделите на 11
и на 7. У вас должно получиться исходное
число.
Алгоритмические структуры:
Разветвляющийся алгоритм
Да
Действие 1,
выполняющееся
когда условие
ИСТИННО
Условие
Нет
Действие 2,
выполняющееся
когда условие
ЛОЖНО
Запись алгоритма ветвления
if(условие) действие 1;
else действие 2;
if(условие) действие 1;
if(условие)
{
действия 1;
}
else
{
действия 2;
}
if – означает «если»,
else – означает «иначе».
Для записи условий
используются логические
операторы.
Пример использования оператора if
Есть данные о папиной зарплате, маминой зарплате и
дедушкиной пенсии. Известно, сколько в семье человек.
Вычислить средний доход на человека и, сравнив его с
прожиточным минимумом, дать оценку благосостояния
семьи (ниже или выше прожиточного минимума).
Для справки: В Челябинской области утвержден
прожиточный минимум на III квартал 2011 года – в
среднем, величина на душу населения составила 5 614
рублей.
Чтобы выводить русские буквы:
#include <windows.h>
main()
{
SetConsoleOutputCP(1251); /*вывод*/
SetConsoleCP(1251);
/*ввод*/
#include <stdio.h>
#include <windows.h>
main()
{
SetConsoleOutputCP(1251);
float ZrplP,ZrplM,PensD,ProgMin;
int KolChel;
float Dohod;
printf("Зарплата папы: ");
scanf("%f",&ZrplP);
printf("Зарплата мамы: ");
scanf("%f",&ZrplM);
printf("Пенсия дедушки: ");
scanf("%f",&PensD);
printf("Количество членов семьи: ");
scanf("%d",&KolChel);
printf("Прожиточный минимум: ");
scanf("%f",&ProgMin);
Dohod=(ZrplP+ZrplM+PensD)/KolChel;
printf("Доход на 1 человека: %f\n",Dohod);
if(Dohod<ProgMin)printf("Доход меньше пр.минимума\n");
else printf("Доход больше пр.минимума \n");
}
Задачи
Даны три числа a, b, c, являющиеся длинами
сторон треугольника. Оценить, можно ли
построить треугольник с такими
сторонами, если можно, то будет ли он
равносторонним или равнобедренным.
Ввод длин сторон
Да
Да
Треугольник
существует?
Треугольник
равносторонний?
Треугольник
равносторонний
Да
Треугольник
равнобедренный
Нет
Треугольник
равнобедренный?
Нет
Треугольник не
существует
Нет
Треугольник
разносторонний
ввод длин сторон;
if(треугольник существует)
if(треугольник равносторонний)
printf(“треугольник равносторонний\n”);
else
if(треугольник равнобедренный)
printf (“треугольник равнобедренный\n”);
else
printf (“треугольник разносторонний\n”);
else
printf (“треугольника не существует\n”);
Существование треугольника:
Сумма любых двух сторон больше третьей
a+b>c && b+c>a && a+c>b
Равносторонность треугольника:
Каждая пара сторон равна
a==b && b==c && c==a
Равнобедренность треугольника
Одна пара сторон равна
a==b || b==c || c==a
Задачи
Значение некоторого коэффициента зависит
от температуры следующим образом:
Если t ниже 0º, то k=1,54∙t
Если t от 0º до 25º, то k=0
Если t выше 25º, то k=0,78∙(t-25)
Требуется ввести значение температуры,
вычислить и вывести значение
коэффициента.
Ввод значения t
Да
Нет
t<0?
Да
k=1.54*t
k=0
Вывод значения k
t<25?
Нет
k=0.78*(t-25)
Задачи
1. Вычислить модуль числа
2. Выбрать большее из двух чисел
3. Два числа упорядочить по возрастанию
4. Нечетное число увеличить на 1, четное –
уменьшить в 2 раза
5. Определить, сколько цифр в целом
положительном числе
6. Вывести на экран номер четверти, к
которой принадлежит точка с
координатами (x,y)
Интересная задача
Есть методика, определяющая идеальный вес человека в
зависимости от пола и роста:
Весжен= 45,4+0,9∙ (рост-153)
Весмуж= 49,9+0,9∙ (рост-153)
Известны рост, вес и пол человека (обозначим мужчин 1, а
женщин 0).
Вычислить идеальный вес для человека и распечатать:
Если отклонение от идеала не более 5%: «Вес идеальный»
Если реальный вес больше идеального: «Избыток … кг»
Если реальный вес меньше идеального: «Недостаток … кг»
Циклический алгоритм:
цикл с предусловием
Нет
Условие
проверяется
ДО ТОГО,
как выполняется
тело цикла
Условие
цикла
Да
Тело цикла – последовательность
действий, которые выполняются до
тех пор, пока истинно условие цикла
1. Цикл типа «прогрессия»
(цикл for) for(задание исх.зн.; условие; изменение)
{
Задание исходного
значения
Нет
Условие
цикла
Да
Тело цикла
Изменение значения
тело цикла
}
Пример цикла for
x=0
Нет
x<=1
Да
y=x*x;
printf(“%f %f\n”,x,y);
x+= 0.1
Вычислить значения
функции y=x2 для
x[0;1] с шагом 0,1
#include <stdio.h>
main()
{
float x,y;
for(x=0; x<=1; x+=0.1)
{
y=x*x;
printf(“%f %f\n”,x,y);
}
}
Задача
Вычислить значения функции
y = 2x2 + 4x – 10
на промежутке x [-10; 10] с шагом 1
Задача (делаем из предыдущей)
Вычислить 10 значений дробно-рациональной
функции
на промежутке, указанном пользователем.
x[a; b]
h = (b-a) / 9
a
b
2. Цикл свободного вида
(цикл while)
Нет
Условие
цикла
Да
Тело цикла
while(условие цикла)
{
тело цикла
}
Задача: что будет напечатано?
#include <stdio.h>
main()
{
int k, s;
s = 0;
k = 0;
while (s<1024)
{
s = s+10;
k = k+1;
}
printf("%d", k);
}
s
k
0
0
10
1
20
2
30
3
…
…
1010
101
1020
102
1030
103
Пример цикла while
Ввод чисел a и b
i=0;
Нет
a < b
Да
a*=a;
i++;
Вывод чисел i, a, b
Сколько раз нужно возвести
в квадрат число a, чтобы его
значение превысило число b?
#include <stdio.h>
main()
{
int a, b, i;
<ввод a, b>
i=0;
while(a < b)
{
a*=a;
i++;
}
<вывод i,a,b>
}
Задачи
1. Сколько раз нужно увеличить число a в 2,5
раза, чтобы оно превысило число b?
2. (продолжение) А если число b меньше, чем a,
тогда выяснить, сколько раз число a надо
уменьшить в 2,5 раза, чтобы оно стало
меньше числа b.
3. Вычислить таблицу значений функции
5x2-10, при x>10
y=
1/x2, при x≤10
Значения x [5;15] с шагом 0,5
Бесконечные циклы и оператор
break
Бесконечный цикл применяется тогда, когда мы
не знаем, когда он закончится.
Окончание бесконечного цикла – оператор
принудительного завершения break.
Общий вид:
while(1)
{
…
if(условие) break; Когда УСЛОВИЕ станет
истинным, выполнится
…
оператор break и цикл
}
закончится
Пример бесконечного цикла
#include <stdio.h>
main()
{
int a, b;
while (1)
{
printf(“a=“);
scanf(“%d”,&a);
if(a==0)break;
printf(“b=“);
scanf(“%d”,&b);
printf(“%d * %d =
}
}
Вычислять произведение
двух вводимых целых
чисел, пока пользователю
не надоест. Признак
окончания – ввод числа 0.
%d\n”,a,b,a*b);
Задача
Известна общая
сумма.
Пользователя
интересует, какой
процент от этой
суммы составляет
каждое из чисел
некоторого ряда.
Ряд заканчивается
нулем.
Ввод общей суммы
Ввод числа из ряда
Да
Введенное
число == 0
Нет
Вычисление процента
от общей суммы
Вывод вычисленного значения
конец
Задачи
Вычислять квадраты целых чисел, пока
пользователю не надоест. Признак
окончания – ввод нуля.
Вычислять значения квадратного
трехчлена y(x)=ax2+bx+c. Коэффициенты
a, b и c вводятся предварительно,
значения вычисляются, пока пользователю
не надоест. Признак окончания – ввод
нуля.
Написать программу по блоксхеме алгоритма
Ввод a и b
x=a
y=b
Нет
x≠y
Да
Да
x>y
x=x-y
Нет
y=y-x
Вывод x
Какие
переменные
надо создать?
Какие
алгоритмические
структуры здесь
используются ?
Что вычисляет
данный
алгоритм?
Циклический алгоритм:
цикл с постусловием
Условие
проверяется
ПОСЛЕ ТОГО,
как выполняется
тело цикла
Тело цикла – выполняются, пока
истинно условие цикла
Условие
цикла
Нет
Да
Цикл do while
do
{
Тело цикла
Условие
цикла
Нет
тело цикла
Да
}
while(условие цикла);
Пример
Вычислить все
положительные значения
функции y=10-x2, начиная
с x=0 с шагом 0,5
#include <stdio.h>
main()
{
float x=0, y;
do
{
y = 10-x*x;
printf(“%6.2f %6.2f\n”,x,y);
x += 0.5;
}while(y>0);
}
Использование цикла с постусловием
для контроля вводимых значений
Ввод значения
Ввод
НЕВЕРНЫЙ
Нет
Да
Например, нужны
только положительные
значения:
do
{
printf(“x=“);
scanf(“%d“,&x);
} while(x<=0);
Задача
Вычислять частное от деления двух чисел,
пока пользователю не надоест.
Окончание работы: первое введенное число
равно нулю.
Второе введенное число не может быть
равно нулю: осуществить контроль ввода.
Использование математических
функций
#include <math.h>
…
y=sqrt(x); /*квадратный корень*/
y=pow(x,n); /*y=xn , n – любая степень, можно дробная*/
y=sin(x); /*Все тригонометрические функции, */
/*x – в радианах
*/
…
Перевод из градусов в радианы:
градусы * π
радианы = –––––––––––––––, π = 3.1415926535
180
Задачи
1. Определить, лежит ли точка с
координатами (x, y) внутри окружности с
центром (x0, y0) и радиусом r. (Контроль
ввода: радиус положительный).
2. В прямоугольном треугольнике известна
гипотенуза и угол в градусах. Вычислить
значения катетов. (Контроль ввода:
гипотенуза положительная, угол от
нуля до 90).
Самостоятельная работа
Даны три стороны
треугольника (контроль
ввода: стороны
положительные). Если
треугольник существует:
1. Вычислить медианы
треугольника
2. Вычислить
биссектрисы
треугольника
3. Вычислить высоты
треугольника
Вычисление сумм рядов
Ряд – бесконечная сумма
Для вычисления значения π
можно использовать ряд
Грегори:
π = 4 - 4/3 + 4/5 - 4/7 + 4/9 …
Точность вычислений = 10-5
s1 – верхняя оценка
s2 – нижняя оценка
n=0; s1=0; s2=0;
n++; s1=s2+4/(2n-1);
n++; s2=s1-4/(2n-1);
Да
s1-s2>10-5
Нет
Вывод (s1+s2)/2
Вычисление сумм рядов
Оператор варианта
Алгоритмическая структура «Вариант»
Использование флагов и именованных
констант
Организация интерфейса
Задача: реализовать работу меню:
Ввод целых данных
2. Ввод дробных данных
3. Расчет a∙b/(a+b)
4. Выход
1.
Одномерный автоматический массив
Общая
сумма
найдена, но
В цикле
можно
данные
о цене и количестве
обрабатывать
товаров
потеряны,
похожие
данные
сохранились
одинаковымданные
образом
множество
раз. товаре.
только
о последнем
Пример: В накладной
указано 5 товаров,
для каждого товара
имеется цена и
количество.
Вычислить общую
сумму по накладной.
n=0;
summa=0;
Нет
n<5
Да
Ввод переменных
cena и kolvo
summa+=cena*kolvo;
n++;
Вывод
summa
Одномерный автоматический массив
Массив – способ хранить однотипную
информацию о ряде объектов (аналог таблицы).
Массивом называется ряд (набор,
последовательность) величин одного типа
(например, int, float или char), имеющих одно
имя (один идентификатор).
Массив состоит из элементов:
Цена первого товара: cena[0]
Нумеруются
Цена
второго товара: cena[1]
Ценаэлементы
третьего товара: cena[2]
итого 5
Цена четвертого товара:cena[3]
Номер
с
НУЛЯ!
Цена пятого товара: cena[4]
элемента –
его ИНДЕКС
Создание массива
Чтобы создать одномерный автоматический
массив, надо знать:
Тип данных элемента массива
Количество элементов массива
тип_данных
имя_массива [количество_элементов];
Примеры:
float cena[5];
int
kolvo[5];
Обработка массива
Обрабатываются массивы в цикла типа for.
int mas[5]; ← создание массива из 5 элементов
int i; ← создание переменной для индекса массива
for (i=0;i<5;i++) ← перебор элементов с
нулевого по четвертый, всего 5
{
обработка i-того элемента
массива, то есть mas[i]
}
Пример создания, ввода и
вывода элементов массива
#include <stdio.h>
main()
{
int mas[5], i;
for(i=0;i<5;i++)
{
printf(“mas[%d]=“,i);
scanf(“%d“,&(mas[i]));
}
for(i=0;i<5;i++)
printf(“%d “,mas[i]);
printf(“\n“);
}
Размещение массива в ОП
Что происходит в ОП, когда выполняется оператор
создания массива?
int mas[5];
В свободной области ОП выделяется 5 ячеек по 2 байта,
идущие подряд.
mas
[0]
mas
[1]
mas
[2]
mas
[3]
mas
[4]
Кроме элементов массива (mas[0], … mas[4]) можно
пользоваться переменной mas. Имя массива без
индекса – это указатель на начало массива .
Адресная арифметика
Если к указателю добавить 1, то он будет
указывать на следующий объект такого же
типа.
mas
[0]
mas
mas
[1]
mas+1
mas
[2]
mas
[3]
mas
[4]
mas+3
Адрес элемента массива
Адрес элемента массива можно получить, если
адресу начала массива прибавить номер
элемента.
&(mas[i])= mas+i
Ввод массива по элементам:
for(i=0;i<5;i++)
{
printf(“mas[%d]=“,i);
scanf(“%d“, mas+i);
}
Задача
Создать массив из 10 целых элементов,
ввести значения элементов, вывести
только положительные элементы.
Стандартные задачи: поиск
экстремума
Экстремум – максимальное или
минимальное значение.
Алгоритм поиска максимума:
1. Берем нулевой элемент в качестве
первого кандидата в максимальный.
2. Перебираем все элементы массива. Если
текущий элемент больше кандидата, то
он становится новым кандидатом.
3. По окончании перебора – кандидат и есть
максимум.
Блок-схема поиска максимума
Создание массива и ввод элементов
max = mas[0]
i = 1
i<кол-во эл-тов
Да
mas[i] > max
Да
max = mas[i]
i++
Вывод max
Нет
Условный экстремум
Найти максимальный (минимальный) элемент в
массиве среди элементов, удовлетворяющих
некоторому условию.
Разница с обычным экстремумом:
1. Искать экстремум нужно только среди
подходящих
2. Подходящих элементов может вовсе не быть
3. Первый элемент может быть не подходящим
Алгоритм поиска условного
максимума
1. Перебираем все элементы массива. Если текущий
элемент подходит под условие, он становится
кандидатом в максимум и перебор завершается.
2. Если перебор не завершился досрочно – выдать
сообщение «Не найден подходящий элемент»,
иначе действуем далее:
3. Перебираем все элементы массива. Если
текущий элемент подходит под условие, то если
он больше кандидата, он становится новым
кандидатом.
4. По окончании перебора – кандидат и есть
максимум.
Задачи на условный экстремум
Найти максимальный среди отрицательных
1.
2.
3.
4.
Найти минимальный среди положительных
Найти максимальный среди четных (Юля,
Вика)
Найти минимальный в промежутке от 10 до
20 (Женя, Маша)
Найти минимальный, кратный 3 (Артем,
Денис)
Найти максимальный в промежутке от 50 до
100 (Динара, Настя)
Д/З на условный экстремум
Юля: Ввести массив из 12 целых чисел. Найти
минимальный элемент в промежутке от 15 до 25.
Вика: Ввести массив из 8 целых чисел. Найти
минимальный элемент в промежутке от -5 до 5.
Маша: Ввести массив из 15 целых чисел. Найти
максимальный элемент , кратный 5.
Женя: Ввести массив из 11 целых чисел. Найти
максимальный элемент , кратный 7.
Артем: Ввести массив из 9 целых чисел. Найти
максимальный элемент в промежутке от -10 до -5.
Денис: Ввести массив из 7 целых чисел. Найти
максимальный элемент в промежутке от 0 до 10 .
Динара: Ввести массив из 14 целых чисел. Найти
минимальный элемент, кратный 4.
Настя: Ввести массив из 16 целых чисел. Найти
минимальный элемент , кратный 6.
Стандартные задачи:
суммирование
Алгоритм суммирования:
1. Создаём переменную, в которой будет
храниться сумма. Обязательно её
ОБНУЛЯЕМ.
2. Перебираем все элементы массива.
Текущий элемент прибавляем к сумме.
Блок-схема суммирования
Создание массива и ввод элементов
summa = 0
i = 0
i<кол-во эл-тов
Да
summa += mas[i]
i++
Вывод summa
Нет
Стандартные задачи: Условное
суммирование
Алгоритм суммирования:
1. Создаём переменную, в которой будет
храниться сумма. Обязательно её
ОБНУЛЯЕМ.
2. Перебираем все элементы массива.
Текущий
элемент
прибавляем
сумме.
Если текущий
элемент
подходиткпод
условие, прибавляем его к сумме.
Задачи
Создать массив из 5 целых элементов.
Ввести значения элементов. Вычислить
сумму элементов.
Вычислить сумму положительных
элементов.
Вычислить сумму элементов, кратных 7.
Вычислить сумму отрицательных нечетных
элементов.
Задачи самостоятельно
Юля: Ввести массив из 7 целых чисел. Вычислить сумму
четных, меньших 10.
Вика: Ввести массив из 10 целых чисел. Вычислить сумму
нечетных, больших 100.
Маша: Ввести массив из 12 целых чисел. Вычислить сумму
кратных 3, меньших 50.
Женя: Ввести массив из 9 целых чисел. Вычислить сумму не
кратных 3, больших 5.
Артем: Ввести массив из 8 целых чисел. Вычислить сумму
кратных 4, меньших 15.
Денис: Ввести массив из 11 целых чисел. Вычислить сумму
не кратных 4, больших 25.
Динара: Ввести массив из 13 целых чисел. Вычислить сумму
кратных 5, меньших 25.
Настя: Ввести массив из 14 целых чисел. Вычислить сумму
не кратных 5, больших -10.
Использование именованных
констант
#define RAZMER 10 –
определение именованной
константы.
Вставляется в самом начале,
во всём дальнейшем тексте
слово RAZMER заменится на 10.
#define N 5
main()
{
int mas[N],i;
for(i=0; i<N; i++)
...
}
Стандартные задачи: подсчёт
Подсчитать, сколько элементов в массиве
подходят под заданное условие.
Алгоритм подсчёта:
1. Создаём переменную, в которой будет
храниться количество. Обязательно её
ОБНУЛЯЕМ.
2. Перебираем все элементы массива. Если
текущий элемент удовлетворяет условию,
количество увеличиваем на 1.
Задачи
Подсчитать, сколько в массиве
положительных элементов.
Если первый элемент массива –
положительный, вычислить сколько
положительных элементов, иначе –
сколько отрицательных.
Вычислить среднее арифметическое
отрицательных элементов.
Задачи на среднее
арифметическое
Юля: В массиве из 9 целых чисел вычислить среднее арифметическое
элементов, квадрат которых лежит в диапазоне от 50 до 110.
Вика: В массиве из 10 целых чисел вычислить среднее арифметическое
элементов, квадрат которых превышает 56.
Маша: В массиве из 11 целых чисел вычислить среднее арифметическое
элементов, квадрат которых превышает 79.
Женя: В массиве из 12 целых чисел вычислить среднее арифметическое
элементов, квадрат которых не превышает 150.
Артем: В массиве из 13 целых чисел вычислить среднее арифметическое
элементов, квадрат которых лежит в диапазоне от 70 до 170.
Денис: В массиве из 14 целых чисел вычислить среднее арифметическое
четных элементов.
Динара: В массиве из 15 целых чисел вычислить среднее арифметическое
элементов, квадрат которых не превышает 130.
Настя: В массиве из 16 целых чисел вычислить среднее арифметическое
элементов, квадрат которых превышает 70.
Стандартные задачи:
Сортировка
Отсортировать массив – значит расположить
его элементы в порядке возрастания или
убывания.
Исходный массив:
5
12
10
7
2
9
1
Отсортированный по возрастанию:
1
2
5
7
9
10
12
Отсортированный по убыванию:
12
10
9
7
5
2
1
Сортировка методом ПУЗЫРЬКА
Перебираем
элементы массива.
Если находим
элементы, стоящие не
по порядку, меняем
их местами.
Если в процессе
перебора был хотя бы
один обмен,
повторяем перебор.
Исходное
состояние
5
12
10
7
2
9
1
5
10
12
7
2
9
1
5
10
7
12
2
9
1
5
10
7
2
12
9
1
5
10
7
2
9
12
1
5
10
7
2
9
1
12
5
7
2
9
1
10
12
2-ой перебор
5
2
7
1
9
10
12
3-ий перебор
2
5
1
7
9
10
12
4-ый перебор
2
1
5
7
9
10
12
5-ый перебор
1
2
5
7
9
10
12
6-ой перебор
Первый
перебор
Структура программы
пузырьковой сортировки
Создание и ввод элементов массива;
Бесконечный цикл
{
счетчик_обменов=0;
Просмотр элементов (с нулевого до предпоследнего)
{
Если (элементы не по порядку)
{
Обмен элементов местами;
счетчик_обменов ++;
}
}
Если (счетчик_обменов==0) прервать бесконечный цикл;
}
Вывод элементов массива;
Задача
10 спортсменов участвовали в соревнованиях.
Каждый получил определенное число баллов.
Как распределяются места между
спортсменами? (Спортсмен определяется
номером с 1 по 10).
10 спортсменов участвовали в соревнованию
по троеборью. В каждом виде соревнований
они зарабатывали баллы. Сумма баллов
определяет победителя. Но нас интересует
также и распределение мест между
спортсменами.
Функции
Первоначально функции были
придуманы для сокращения
объема программного кода (это
называлось подпрограмма):
одинаковые фрагменты замещаются
обращением к подпрограмме,
подпрограмма записывается
отдельно один раз.
Сейчас функции используются для
декомпозиции (разделения)
большой задачи на мелкие
подзадачи. Разработчик решает
подзадачи по очереди, не
отвлекаясь на другие подробности.
Пример:
Создание массивов
балл1,балл2, балл3, сумма,
номера;
Ввод массива балл1;
Ввод массива балл2;
Ввод массива балл3;
Вычисление массива сумма;
Вычисление массива номера;
Вывод массивов номера и
сумма;
Совместная сортировка
массивов сумма и номера;
Вывод массивов номера и
сумма;
Определение функции
тип_возвращ_значения имя_функции (описание параметров функции)
{
Может быть без
возвращаемого значения:
тело функции
void
return возвращ_значение;
}
Пример: возведение целого
Вызов функции
void main()
{
...
переменная = имя_функции (параметры);
...
имя_функции(параметры);
...
}
числа в квадрат
int kw(int a)
{
int b;
b=a*a;
return b;
}
void main()
{ int a,b;
a=325;
b=kw(a);
…
}
Пример функции
Возведение дробного
числа в квадрат
float kw(float a)
{
float b;
b=a*a;
return b;
}
начало
void main()
{
float a,b;
…
a=325;
b=kw(a);
…
}
Преимущество
использования функции:
с=
с=(12.4*a+27.1*b)*(12.4*a+27.1*b)
/ (12.4-14.6*b)/(12.4-14.6*b) +
(12.7*a+26.7*b-43.5) *
(12.7*a+26.7*b-43.5)
c=kw((12.4*a+27.1*b)/
(12.4-14.6*b)) +
kw(12.7*a+26.7*b-43.5)
Задачи
1. Разработать функцию Min с двумя целыми
параметрами, возвращающую минимальный
из своих параметров.
Разработать функцию Max с двумя целыми
параметрами, возвращающую максимальный
из своих параметров.
Вычислить с помощью созданных функций
расстояние на числовой прямой между
введенными числами.
2. Вычислить значения y(x)
y = 2x2 + 4x – 10
на промежутке x [-10; 10] с шагом 1 с
использованием функции.
Взаимное расположение функций
СНАЧАЛА ОПРЕДЕЛЕНИЕ, ПОТОМ ВЫЗОВ.
#include…
int funct(int a)
{
…
}
main()
{
b=funct(a)
}
Задачи на функции
Юля: Вычислить значения y(x)=x/(x2-4) на промежутке [-10;10]
с шагом 0,5 используя механизм функций.
Вика: Вычислить значения y(x)=(x-5)(x+5) на промежутке [0;5]
с шагом 0,1 используя механизм функций.
Маша: Вычислить значения y(x)= (x-10)/(x+1) на промежутке [2;2] с шагом 0,2 используя механизм функций.
Женя: Вычислить значения y(x)=15x(x+4) на промежутке
[10;15] с шагом 1 используя механизм функций.
Артем: Вычислить значения y(x)=(x+10)/(x-90) на промежутке
[0;100] с шагом 10 используя механизм функций.
Денис: Вычислить значения y(x)=x+2 на промежутке [0;1] с
шагом 0,1 используя механизм функций.
Динара: Вычислить значения y(x)=(x+2)(x-4)/x на промежутке
[-2;2] с шагом 0,2 используя механизм функций.
Настя: Вычислить значения y(x)=(x+5)/(x-70) на промежутке
[50;100] с шагом 5 используя механизм функций.
Передача массивов в функцию
Информация о
массиве:
Записывается в программе
с помощью:
С какой ячейки
Адрес начала массива (имя
памяти он начинается массива)
Сколько ячеек памяти Размер массива
он занимает
Размер ячейки
Тип данных элемента
массива
Передача массивов в функцию
int funct(int *mas,int n)
{
…
}
main()
{
int mas[10];
b=funct(mas,10);
}
Адрес начала
массива
Количество
элементов массива
Размер ячейки
(тип данных элемента)
void funct(int *mas,int n)
{
…
}
main()
{
int mas[10];
funct(mas,10);
}
Задачи
Создать функцию ввода массива
Создать функцию вывода массива
Создать функцию, формирующую массив целых чисел от 1 до
n (n-размер массива)
Создать функцию суммирования 3 массивов: каждый элемент
массива-результата равен сумме соответствующих элементов
исходных массивов
Создать функцию совместной сортировки двух массивов по
убыванию первого массива
Собрать из функций программу для решения задачи про
места спортсменов
Создать функцию, возвращающую сумму элементов массива
Создать функцию, возвращающую количество элементов,
больших указанного значения
С помощью этих функций выяснить, сколько спортсменов
набрали больше среднего балла.
Самостоятельно
С помощью функций ввода массива, вывода
массива, самостоятельно разработанных
функций условного суммирования и подсчета
вычислить:
Юля, Вика: среднее арифметическое
нечетных элементов массива из 10 чисел
Маша, Женя: среднее арифметическое четных
элементов массива из 9 чисел
Артём, Денис: среднее арифметическое
элементов, кратных 3, в массиве из 12 чисел
Динара, Настя: среднее арифметическое
элементов, не кратных 3, в массива из 8 чисел
Документ
Категория
Презентации
Просмотров
31
Размер файла
5 401 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа