Основные управляющие конструкции — КиберПедия 

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Основные управляющие конструкции

2019-07-12 155
Основные управляющие конструкции 0.00 из 5.00 0 оценок
Заказать работу

Основные управляющие конструкции

 

Якутск 2011


Содержание

 

1. Построение программ.. 3

1.1. Алфавит языка. 3

1.2. Имена и зарезервированные слова. 3

1.3. Общая структура программ.. 4

1.4. Комментарии. 4

1.5. Константы и переменные. 4

1.6. Оператор простого присваивания. 5

1.7. Операторы ввода и вывода данных. 6

2. Стандартные типы данных.. 9

2.1. Целый тип данных. 9

2.2. Вещественный тип. 10

2.3. Стандартные математические функции. 10

3. Программы линейной структуры... 12

3.1. Арифметические выражения. 12

3.2. Примеры программ линейной структуры.. 12

4. Программы с ветвлением.. 16

4.1. Логический тип данных. 16

4.2. Логическое выражение. 16

4.3. Условный оператор. 17

4.4. Оператор перехода. 28

4.5. Оператор выбора. 22

5. Программы циклической структуры... 24

5.1. Оператор цикла с предусловием While. 24

5.2. Оператор цикла с постусловием Repeat 25

5.3. Оператор цикла с параметром For. 26

5.4. Вычисление сумм.. 29

Практикум на ЭВМ.. 33

Линейные алгоритмы.. 33

1. Задания для решения на компьютере. 33

2. Задания для самостоятельной работы.. 33

Алгоритмы с ветвлением.. 37

1. Задания для решения на компьютере. 37

2. Задания для самостоятельной работы.. 37

Программы с циклами. 42

1. Задания для решения на компьютере. 42

2. Задания для самостоятельной работы.. 42

Приложение.. 49

Основные операции языка С++. 49


1. Построение программ

Алфавит языка

 

Как и любой язык программирования, C/C++ имеет свой алфавит – набор символов, разрешенных к использованию и воспринимаемых компилятором. В алфавит языка входят:

1. Латинские строчные и прописные буквы:

A, B, C,…, Z и a, b, c,…,z.

2. Цифры от 0 до 9.

3. Специальные символы, участвующие в построении конструкций языка:

+ - * / = < > [ ]., ():; ^ @ { } $ # ‘? %!

 

Имена и зарезервированные слова

 

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

Имена применяют для обозначения переменных, констант и других объектов, определенных в программе. Имя может состоять из любого количества букв или цифр, но должно начинаться с буквы. В имя можно включать знак подчеркивания. Прописные и строчные буквы различаются. Программу легче понять, если имена подбираются так, чтобы в них отражался смысл обозначаемых данных. Например, сумму чисел обозначают через S или summa, максимальное значение max и т.п.

C/C++ имеет большое количество зарезервированных (ключевых) слов. Эти слова не могут быть использованы в качестве идентификаторов (имен) в программе.

Список ключевых слов таков:

asm auto bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new operator private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wcahr_t while

 

Общая структура программ

 

Начнем знакомство с C/C++ с программы, которая вводит два целых числа с клавиатуры, складывает их и выводит сумму заданных чисел на экран.

#include <stdio.h>; void main() {  int a, b, s;  scanf(”%i%i”,&a,&b);  s=a+b;  printf(”s=%i”,s); } включение заголовочного файла описание функции main начало функции описание переменных ввод значений a и b вычисление суммы вывод на экран конец функции

 

На этом примере видны основные особенности записи программ:

1. Первая строка этой программы – директива препроцессора, по которой в текст программы вставляется заголовочный файл <stdio.h>, содержащий описание использованных в программе функций ввода/вывода scanf и printf.

2. Вторая строка. Программа на C++ состоит из функций. Одна из функций должна иметь имя main. Выполнение программы начинается с первого оператора этой функции. Если функция не должна возвращать значение, указывается тип void.

3. Третья строка. Тело функции начинается с фигурной скобки.

4. Четвертая строка. Описание локальных переменных целого типа a, b, s.

5. Тело функции main состоит из отдельных операторов (команд) – 5, 6 и 7 строки. Каждый оператор заканчивается точкой с запятой. 

6. Восьмая строка. Тело функции заканчивается фигурной скобкой.

 

Комментарии

 

Кроме конструкций языка, программа может содержать комментарии. Комментарий либо начинается с двух символов // и заканчивается символом перехода на новую строку, либо заключается между символами-скобками /* и */. Внутри комментария можно использовать любые допустимые на данном компьютере символы, а не только символы из алфавита C++.

 

Константы и переменные

 

    Данные, которыми оперирует программа, могут быть определены в ней как неизменные, либо как способные изменять свое значение. Первые называются константами, а вторые переменными. И переменные и константы размещаются в памяти компьютера. Перед использованием любая переменная должна быть описана.

Общий вид оператора описания переменных:

[класс памяти][const]тип имя [инициализатор]

Здесь и далее в квадратных скобках ([]) будем писать необязательный параметр.

Рассмотрим правила задания составных частей этого оператора:

Необязательный класс памяти может принимать одно из значений auto, extern, static и register. О них расскажем позже.

Модификатор const показывает, что значение переменной изменять нельзя. Такую переменную называют константой.

При описании можно присвоить переменной начальное значение, это называется инициализацией. Инициализатор можно записывать в двух формах – со знаком равенства (=значение) или в круглых скобках (значение).

Примеры

 const int n=10; const float g=9.81;

 int a=20,b,s;

 float x(17),f;

Если тип инициализирующего значения не совпадает с типом переменной, выполняются преобразования типов по определенным правилам.

    Операция приведения типов записывается в двух формах:

тип (выражение)

(тип) выражение

Результатом операции является значение заданного типа, например

 int x=17, a;

 float y=3.14; double z;

 a=(int)y; z=double(x);

Область действия переменного – это часть программы, в которой его можно использовать для доступа к связанной с ним области памяти. В зависимости от области действия переменная может быть локальной или глобальной. Если переменная определена внутри блока (блок ограничен фигурными скобками), она называется локальной, область ее действия – от точки описания до конца блока, включая все вложенные блоки. Если переменная определена вне любого блока, она называется глобальной и областью ее действия считается файл, в котором она определена, от точки описания до его конца.

Пример

#include <stdio.h>;

#include <math.h>; // подключаем математические функции

void main()

{ int a, b, s; float x,y, pi;

 printf("a b="); scanf("%i%i",&a,&b);

 s=a+b;

 printf("s=%i\n",s);

 printf("s=%6i\n",s); // длина поля вывода=6

 pi=M_PI;

 printf("pi=%e\n",pi);

 printf("pi=%E\n",pi);

 printf("pi=+%e\n",pi); // печать со знаком

 printf("pi=%8.3f\n",pi); // длина поля вывода=8, точность=3

 printf("pi=%.3f\n",pi); // точность=3

}

Если мы введем a=17 и b=5, то на экране получим

s=22

s=ᴗᴗᴗᴗ22 // печатается в 6 позициях выравнивая по правой границе

pi=3.141593e+00

pi=3.141593E+00

pi=+3.141593e+00  

pi=ᴗᴗᴗ3.142       

pi=3.142          

Здесь символы ᴗ означают пробел.

 

Аналогично функция

scanf (format _ string [, arguments …]);

осуществляет ввод данных из стандартного ввода и преобразование их во внутреннее представление в программе.

Строка, управляющая форматом ввода, может состоять из следующих элементов:

· пробельных символов: пробела (‘ ‘), символа табуляции (‘\t’)  или новой строки (‘\n’). Пробельный символ указывает на то, что из входного потока надо читать, но не сохранять все последовательные символы вплоть до следующего непробельного символа. Один пробельный символ в строке управления форматом соответствует любому числу или комбинации пробельных символов во входном потоке;

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

· спецификации формата, которая имеет следующий вид:

%[*][width][F|N][h|l|L]type

Спецификации преобразования функции scanf практически полностью совпадают со спецификациями преобразования функции printf.

Аргументами программы ввода могут быть только простые переменные или имена символьных массивов для ввода символьных строк, причем перед именами простых переменных обязательно должен стоять знак амперсанд (& - операция получения адреса объекта).

При выполнении оператора scanf программа останавливается и ждет, пока нужное количество чисел не будет введено с клавиатуры. Вводимые числа разделяют пробелами или нажатием клавиши Enter. Заканчивается ввод всегда нажатием клавиши Enter.

Например, после выполнения оператора scanf(”%i%f%f”,&a,&b,&c), если на клавиатуре набраны числа 3 4.0 -5.025, переменные a, b, c примут значения a=3, b=4, c=-5.025.

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

       Звездочка (*), следующая за символом процент, подавляет присваивание следующего входного поля, которое интерпретируется как поле указанного типа. Поле читается, но не сохраняется.

    Поле длина (width) (положительное десятичное число) задает максимальное число символов, которое может быть прочтено из входного потока. Из входного потока читается заданное количество символов, если только раньше не встретится пробельный символ или символ, который не может быть преобразован в соответствии с заданным форматом.


Базовые стандартные типы

На первом занятии мы познакомились с понятием переменной. Переменные применяются в программе для хранения часто используемых данных. Каждая переменная имеет имя и может хранить значения определенного типа, например, целые числа, вещественные числа и др.

 

Целый тип данных

В алгоритмическом языке C++ существует четыре целых типов данных для представления целых чисел: int (целый), char (символьный), wchar_t (расширенный символьный), bool (логический). Существует четыре спецификатора, уточняющих внутреннее представление и диапазон значений: short (короткий), long (длинный), signed (знаковый), unsigned (беззнаковый).

Тип Диапазон значений Объем памяти
Bool true и false 1
Char -128..127 1
unsigned char 0..255 1
Int -32768..32767 2
unsigned short int 0..65535 2
long int -2147483..2147483647 4
unsigned long int 0..4294967295 4

Тип int тождественен типу short int.

Над величинами целого типа определены следующие операции: сложение (+), вычитание (-), умножение (*), деление нацело (/), получение остатка от деления (%).

Примеры.

N=123, a=N/6 (a=20), b=1/3 (b=0),

c=N%6 (c=3), d=N%2 (d=0).

Здесь надо отметить, что при делении нацело (/) на 10 отбрасывается последняя цифра (M=287, d=N/10, d=28), а при получении остатка от деления (%) на 10 мы получаем последнюю цифру (M=287, r=N%10, r=7).

    Тип char, как и другие целые типы, может быть со знаком или без знака. В величинах со знаком можно хранить значения в диапазоне от -127 до 127. При использовании спецификатора unsigned значения могут находиться в пределах от 0 до 255. Это достаточно для хранения любого символа из 256-символьного набора ASCII (American Standard Code For Information Interchange - американский стандартный код для обмена информацией). Этот набор символы заглавных и строчных букв, цифр и других различных символов, включая специальные управляющие символы.

    Традиционная запись символьного значения представляет собой символ, заключенный в одиночные кавычки: 'A', 'a', 'z', 'я', '(', ' '(пробел) и т. п.

 

Вещественный тип

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

195324 0 -41. +1951
-1.941 0.0011 -1812.000 .05
124E+2 -2.1E-15 9E4 0.1981e31

Как видно, они могут быть представлены: как целые, если дробная часть равна 0; обычным способом с десятичной точкой; в экспоненциальном формате. Экспоненциальный формат соответствует умножению на заданную степень 10. Например, -2.1E-15=-2.1×10-15. Написание буквы E может быть как прописным, так и строчным.

Стандарт C++ определяет три типа данных для хранения вещественных значений: float (вещественный), double (вещественный с двойной точностью) и long double.

Тип Диапазон значений Количество цифр Объем памяти
float 3.4e-38..3.4e+38 11-12 4
double 1.7e-308..1.7e+308 15-16 8
long double 3.4e-4932..3.4e+4932 19-20 10

 

Пример

#include <math.h>

#include <stdlib.h>

#include <stdio.h>

void main()

{

 float u, d, y, x; int r, k,n;

 x= 123.589; n=100;

 y=sin(M_PI/6); //a=0.5

 randomize();

 r=rand(); //случайное число из диапазона 0.. RAND_MAX

 k=random(n); //случайное число из диапазона 0..n-1

 u=ceil(x); d=floor(x); //u=124; d=123

 printf("y=%.2f r=%d k=%i u=%.0f d=%.0f\n",y,r,k,u,d);

}

RAND_MAX=32677.

 

 

Арифметические выражения

 

    Арифметические выражения строятся из имен переменных, констант, знаков операций и круглых скобок так, как это принято в математике. При вычислении их значений раньше выполняются операции *,/,%, а затем + и –. Операции одинакового старшинства выполняются слева направо.

Упражнения

Вычислить

1. 6*2-7 / 3*7 % 2;

2. 7/2*3-24%10;

3. (24/8/2+9/4%3)/(2008/1000+3/3/2/2).

Наряду с переменными и константами в арифметические выражения можно включать функции.

При определении значения выражения, прежде всего, вычисляются значения входящих в него функций.

 

Примеры программ линейной структуры

 

1. Для заданного x вычислить значение выражения

Обсуждение. Во всех алгоритмических языках программирования арифмети-ческие выражения записываются в одну строку, используя правила расстановки скобок.

#include <math.h>

#include <stdio.h>

void main()

{

float x, y;

printf("x="); scanf("%f",&x);

y=(1+1/(1+pow(x,4)))/(12.5+sqrt(1+x*x));

printf("y=%.4f\n",y);

}

2. Дано трехзначное положительное целое число N. Найти сумму цифр.

Обсуждение. Обозначим первую цифру трехзначного числа переменной a, вторую – b, третью - c.

Первую цифру трехзначного числа получим, разделив заданное число на 100 (a=N/100). Вторую цифру получить сложнее. Сначала нужно отбросить первую цифру числа, затем оставшееся двухзначное число поделить на 10 (b=N% 100/10).

Можно сделать иначе – сначала отбросить третью цифру, затем – первую (b=N/10%10). Третья цифра равна остатку, полученному при делении числа на 10 (c=N%10).

#include <math.h>

#include <stdio.h>

void main()

{

int n,a,b,c,s;

printf("n="); scanf("%i",&n);

  a=n/100; b=n/10%10; c=n%10;

  s=a+b+c;

  printf("s=%i\n",s);

}

 

3. На числовой прямой заданы две точки A и B с координатами x1, x2. Найти расстояние между ними.

Обсуждение. Расстояние между двумя точками на числовой прямой определяется по формуле d=|x2-x1|.

#include <math.h>

#include <stdio.h>

void main()

{

float x1,x2,d;

 printf("x1 x2="); scanf("%f%f",&x1,&x2);

 d=fabs(x2-x1);

 printf("d=%.3f\n",d);

}

Вопросы

1. Почему при вычислении расстояния d используется абсолютная величина числа?

2. Почему координаты точек x1, x2 и расстояние между ними d описаны как вещественные числа?

4. На плоскости заданы две точки A и B с координатами (x1,y1), (x2,y2). Найти расстояние между ними.

Обсуждение. Расстояние между двумя точками на плоскости определяется по формуле .

#include <math.h>

#include <stdio.h>

void main()

{ float x1,y1,x2,y2,d;

  printf("x1 y1="); scanf("%f%f",&x1,&y1);

  printf("x2 y2="); scanf("%f%f",&x2,&y2);

  d=sqrt(pow(x2-x1,2)+pow(y2-y1,2));

  printf("d=%.3f\n",d);

}

 

5. Составить программу вычисления площади S треугольника по заданным длинам его сторон a, b, c.

Обсуждение. Расчет площади треугольника по его трем сторонам проводится по формуле Герона.

где p – полупериметр.

#include <math.h>

#include <stdio.h>

void main()

{

float a,b,c,p,s;

 printf("a b c="); scanf("%f%f%f",&a,&b,&c);

 p=(a+b+c)/2;

 s=sqrt(p*(p-a)*(p-b)*(p-c));

 printf("S=%.3f",s);

}

6. Даны координаты концов отрезка (x1,y1) и (x2,y2). Найти координаты середины заданного отрезка.

Обсуждение. Нетрудно доказать, что координаты середины отрезка определяются по формулам

#include <math.h>

#include <stdio.h>

void main()

{

float x1,y1,x2,y2,x,y;

 printf("x1 y1="); scanf("%f%f",&x1,&y1);

 printf("x2 y2="); scanf("%f%f",&x2,&y2);

 x=(x1+x2)/2; y=(y1+y2)/2;

 printf("x=%.3f y=%.3f",x,y);

}

 

7. На плоскости даны координаты трех вершин параллелограмма (x1,y1), (x2,y2), (x3,y3). Составить программу определения координат его четвертой вершины (x4,y4), расположенной напротив вершины (x2,y2).

Обсуждение. Известно, что диагонали параллелограмма в точке пересечения (x,y) делятся пополам.  Тогда, используя знания предыдущего примера:

x =(x 1+ x 3)/2, y =(y 1+ y 3)/2, x =(x 2+ x 4)/2, y =(y 2+ y 4)/2.

Из последних двух равенств имеем

x 4=2 x - x 2, y 4=2 y - y 2,

где x и y вычисляются по первым двум формулам.

#include <math.h>

#include <stdio.h>

void main()

{

float x1,y1,x2,y2,x3,y3,x4,y4,x,y;

 printf("x1 y1="); scanf("%f%f",&x1,&y1);

 printf("x2 y2="); scanf("%f%f",&x2,&y2);

 printf("x3 y3="); scanf("%f%f",&x3,&y3);

 x=(x1+x3)/2; y=(y1+y3)/2;

 x4=2*x-x2; y4=2*y-y2;

printf("x4=%.3f y4=%.3f\n",x4,y4);

}

 

8. В некоторый момент времени часы показывают h часов, m минут, s секунд. Составить программу определения показания часов через k секунд.

Обсуждение. Чтобы определить, сколько прошло часов необходимо получить целую часть деления числа k на 3600 (k/3600). Тогда количество оставшихся секунд будет  k=k%3600. Теперь можно определить сколько прошло минут. Для этого разделим нацело k на 60 (k/60). Количество оставшихся секунд будет k=k%60. Теперь вычислим s=s+k. Далее будем учитывать переход секунд на минуты (например, 45+37=82=1 мин 22 сек.), минут на часы и, что 24 часа записывается как 0 часов.

#include <math.h>

#include <stdio.h>

void main()

{

long int h,m,s,k;

printf("h m s="); scanf("%li%li%li",&h,&m,&s);

printf("k="); scanf("%li",&k);

h=h+k/3600; k=k%3600;

m=m+k/60; k=k%60;

s=s+k; m=m+s/60; h=h+m/60;

s=s%60; m=m%60; h=h%24;

printf("h=%li m=%li s=%li\n",h,m,s);

}


Программы с ветвлением

Логический тип данных

    Переменные логического типа описываются с помощью идентифика-тора bool. Они могут иметь два значения: false (ложь) или true (истина), под них выделяется один байт памяти. Внутренняя форма представления значения false – 0 (ноль). Любое другое значение интерпретируется как true. При преобразовании к целому типу true имеет значение 1.

Свои значения переменные логического типа получают обычно в результате выполнения операций сравнения (отношения):

<= меньше или равно
< меньше
== равно
>= больше или равно
> больше
!= не равно

    Помимо операций отношения в языке C/C++ существуют три логические операции:! – отрицание, && – логическое И, || – логическое ИЛИ.

    Рассмотрим таблицу истинности

x y !x x&&y x||y
0 0 1 0 0
0 1 1 0 1
1 0 0 0 1
1 1 0 1 1

Здесь 0 – false, 1 – true.

Логическое выражение

 

    Логические операции, операции отношения и арифметические операции часто встречаются в одном выражении – такие выражения называются логическими. В логическом выражении принят следующий приоритет операций:

1.!;

2. &&, *, /, %;

3. ||, +, -;

4. операции сравнения.

Порядок выполнения операций определяется скобками.

Примеры

Обычная запись Запись на C++
0<x≤1 (x>0&&x<=1)
(-2≤x<0)V(2<x≤4) (x>-2&&x<0||x>2&&x<=4)
(x2+y2≤1)∩(y>|x|) (sqr(x)+sqr(y)<=1&&y>abs(x))
(y>x2)∩(y<9) (y>sqr(x)&&y<9)

 

Пример программы

#include <stdio.h>;

void main()

{

int f1, f2, a, Ok;

printf(”a=”); scanf(”%i”,&a);

f1=1; f2=a>7;

Ok=!(f1&&f2);

printf(”Ok=%i\n”,Ok);

}

Вопрос. Какие значения примут переменные f2 и Ok после выполнения программы, если мы введем значение a=8?

Условный оператор

 

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

Существует два вида условного оператора:

· неполная форма условного оператора

if (<логическое выражение>) <оператор>

Выполнение условного оператора начинается с вычисления значения логического выражения. Если логическое выражение принимает значение true, выполняется <оператор>. Если же логическое выражение принимает значение false, то <оператор>  не выполняется.

Примеры

1) if (x<0) Printf(”%f - отрицательное число”,x);

2) if (x>=0&&x<1) f=1/(1+pow(x,2));

Если надо пропустить или выполнить несколько операторов подряд, используется составной оператор:

{<оператор1>; <оператор2>; <оператор3>;}

Составной оператор – это последовательность операторов, перед которой стоит символ {, а после –  }. После закрывающей фигурной скобки точка с запятой не ставится.

Пример

if (a>100) {b=b-10; c-=10;}

Если a>100, то значения переменных b и c уменьшаются на 10.  

· полная форма условного оператора

if (<логическое выражение>) <оператор1>; else <оператор2>

Примеры

1) if (x<y) x=2*x; else {y=x; x++;}

2) if (a>b) {max=a; min=b;}

     else {max=b; min=a;}

 

Примеры программ

1. Составить программу вычисления значения функции

Обсуждение. Заданная функция определена на всей числовой прямой и при x≤0 принимает значение x2+1, при x>1 принимает значение 1+x, а в остальной области – значение 1+√x.

#include <stdio.h>;

#include <math.h>;

void main()

{ float x,f;

printf("x="); scanf("%f",&x);

  if (x<=0) f=pow(x,2)+1; else

  if (x>1) f=1+x; else f=1+sqrt(x);

  printf("f(%.1f)=%f\n",x,f);

}

2. Составить программу, проверяющую принадлежность точки с координатами (x,y) заштрихованной области

Рис. 1.

Обсуждение. Заштрихованная область лежит внутри круга радиуса 2, описываемого уравнением x*x+y*y=4 и при x≥0 лежит выше прямой y=x, а при x<0 ниже прямой y=x, т.е. точка (x,y) заштрихованной области удовлетворяют условию

(x*x+y*y<=4)&&((x>=0)&&(y>=x)||(x<0)&&(y<=x)).

#include <stdio.h>;

void main()

{

 float x,y;

 printf("x y="); scanf("%f%f",&x,&y);

 if (x*x+y*y<=4&&(x>=0&&y>=x||x<0&&y<=x))   

 printf("YES\n");else printf("NO\n");

}

4. Составить программу определения, является ли данное четырехзначное натуральное число палиндромом, т.е. числом, которое читается одинаково слева направо и справа налево.

Обсуждение. Обозначим первую цифру заданного четырехзначного числа переменной a, вторую – b, третью – c, четвертую – d. Так как первая цифра четырехзначного числа определяет тысячные, первая цифру находим делением нацело (/) на 1000 (отбрасываем последние три цифры), для определения второй цифры отбросим две последние цифры (N/100) и из полученного двузначного числа получим последнюю цифру (b=N/100%10) и т.д.

#include <stdio.h>;

void main()

{

int N, a, b, c, d;

printf("N="); scanf("%i",&N);

a=N/1000;

b=N/100%10;

c=N/10%10;

d=N%10;

if (a==d&&b==c) printf("YES\n");

else printf("NO\n");

}

5. Составить программу определения, является ли заданный год високосным.

Обсуждение. Високосным является год, номер которого делится на 4, но если номер года оканчивается на два нуля, то номер високосного года должен делиться еще и на 400. Например, 1700 – не високосный год, 2000 –  високосный год.

#include <stdio.h>;

void main()

{

 int year;

 printf("year="); scanf("%i",&year);

 if (year%100>0&&year%4==0||year%400==0)   

 printf("YES\n"); else printf("NO\n");

}

6. Составить программу, которая проверяет, можно ли из отрезков a, b и c построить треугольник.

Обсуждение. Используется неравенство треугольника: длина любой стороны треугольника меньше суммы длин двух других его сторон.

#include <stdio.h>;

void main()

{

 float a, b, c;

 printf("a b c="); scanf("%f%f%f",&a,&b,&c);

 if (a<b+c&&b<a+c&&c<a+b) printf("YES\n");

    else printf("NO\n");

}

7. Составить программу определения принадлежности точек A1(x1,y1), A2(x2,y2) и A3(x3,y3) одной прямой.

Обсуждение. Для того, чтобы проверить, лежат ли три точки на одной прямой, достаточно получить уравнение прямой проходящей через две заданные точки и поставить координаты третьей точки в полученное уравнение. Если третья точка удовлетворяет уравнению, то заданные точки лежат на одной прямой.

Уравнение прямой проходящей через две точки:

.

Приведем данное уравнение к общему виду Ax+By+C=0. Легко получить, что A=y2-y1, B=x1-x2, C=-A∙x1-B∙y1. Подставив координаты третьей точки в общее уравнение, ответим поставленной задаче.

#include <stdio.h>;

void main()

{

 float x1,y1,x2,y2,x3,y3,A,B,C;

printf("x1 y1=");scanf("%f%f",&x1,&y1);

printf("x2 y2=");scanf("%f%f",&x2,&y2);

printf("x3 y3=");scanf("%f%f",&x3,&y3);

A=y2-y1; B=x1-x2; C=-A*x1-B*y1;

if (A*x3+B*y3+C==0) printf("YES\n"); else printf("NO\n");

}

8. Написать программу решения системы линейных уравнений

Алгоритм решения. Для решения системы из двух уравнений рекомендуется использовать метод Крамера, который заключается в следующем: вычисляем определители

 

Если d=dx=dy=0, то система имеет бесконечно много решений.

Если d=0, dx≠0, dy≠0то система не имеет решения.

Если d≠0, то x=dx/d, y=dy/d.

 

#include <stdio.h>

#include <math.h>

void main()

{

float a1, b1, c1, a2, b2, c2, x, y, dx, dy, d;

printf("a1 b1 c1="); scanf("%f%f%f",&a1,&b1,&c1);

printf("a2 b2 c2="); scanf("%f%f%f",&a2,&b2,&c2);

d=a1*b2-a2*b1; dx=c1*b2-c2*b1; dy=a1*c2-a2*c1;

if (d==0&&dx==0&&dy==0) printf("Бескон. много реш.!");

else 

if (d==0) printf("Решения нет!");

else

{

x=dx/d; y=dy/d;

printf("x=%0.3f y=%0.3f\n",x,y);

}

}

9. Поле шахматной доски определяется парой символов: первый символ –  номер вертикали (a(97), b(98), c(99), d(100), e(101), f(102), g(103), h(104)- в скобках указаны коды соответствующих символов), второй - номер горизонтали (при счете снизу вверх). Составить программу определения: бьет ли белый слон черного коня?

Обсуждение. Слон бьет по диагонали. Две фигуры лежат на одной диагонали, если разность абсцисс и ординат фигур по абсолютной величине равны (см. рис.2). На рисунке представлены два случая расположения слона на шахматной доске. В первом случае разность равна 3, во втором – 4.

Рис.2

#include <stdio.h>;

#include <math.h>;

void main()

{

 char Cx, Kx; int Cy, Ky;

 printf("slon: "); scanf("%c%d",&Cx,&Cy);

 printf("Korolb: "); scanf(" %c%d",&Kx,&Ky);

 if (abs(Cx-Kx)==abs(Cy-Ky)) printf("YES\n");

 else printf("NO\n");

}

Ведущий пробел в формате второго оператора scanf “подавляет” нажатие клавиши Enter после ввода координат слона.

Оператор выбора

 

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

Структура оператора выбора такова:

switch <выражение> {

  case <константа выбора1>:<список операторов>

  case <константа выбора2>:<список операторов>

  case <константа выбора3>:<список операторов>

  [default <операторы>]

}

Выполнение начинается с вычисления выражения (оно должно быть целочисленным), а затем управление передается первому оператору из списка, помеченного константным выражением, значение которого совпало c вычисленным. После этого, если выход из переключателя явно не указан, последовательно выполняются все остальные ветви. Выход из переключателя обычно выполняется с помощью операторов break или return. Если совпадения не произошло, выполняются операторы, расположенные после слова default, а при его отсутствии управление передается следующему за switch оператору.

    Любому из операторов списка выбора может предшествовать не одна, а несколько констант выбора, разделенных запятыми. Например,

switch (Err)

{

 case 0:printf(”Нормальное завершение программы\n”);   

   break;

 case 2: printf(”Ошибка ввода данных\n”);

        printf(”Повторите действия\n”); break;

 default: printf(”Код ошибки %i см. в прил. 1\n”,Err);

}

Пример программы

Составить программу вычисления площади основных геометрических фигур. Программа предлагает пользователю выбрать фигуру из имеющегося перечня и задать ее параметры, после чего выводит на экран результат расчета площади фигуры с указанием формулы, по которой он выполнен.

#include <stdio.h>;

void main()

{

 float a,b,h,s; int v;

 printf("Вычисление площади фигуры:\n");

 printf("1. Квадрат\n");

 printf("2. Прямоугольник\n");

 printf("3. Треугольник\n");

 printf("4. Трапеция\n");

 printf("Ваш выбор: "); scanf("%i",&v);

 switch (v)

 {

 case 1:printf("a="); scanf("%f",&a);

   s=a*a; printf("S=a*a, S=%.2f",s); break;

 case 2:printf("a b="); scanf("%f%f",&a,&b);

    s=a*b; printf("S=a*b, S=%.2f\n",s); break;

 case 3:printf("a h="); scanf("%f%f",&a,&h);

    s=a*h/2; printf("S=a*h/2, S=%.2f\n",s); break;

 case 4:printf("a b h="); scanf("%f%f%f",&a,&b,&h);

    s=(a+b)*h/2; printf("S=(a+b)*h/2, S=%.2f\n",s);

 }

}

 


Примеры

1) k=0;

 while (n>0)

 { n=n/10; k=k+1; }

2) i=0; s=0;

while (i<100) { i++; s=s+pow(I,2); }

3) x=0; y=0;

while (x*x+y*y<4)

{ x=rand()/1000; y=rand()/1000; }

Примеры программ

1. Дано целое положительное число n (n<109). Является ли заданное число палиндромом, т.е. числом которое читается одинаково слева направо и справа налево? Например, палиндромами являются числа 797, 2002, 123321.

Обсуждение. Для проверки поставленной задачи необходимо записать цифры данного числа в обратном порядке (получить число “перевертыш”) и сравнить с исходным числом. Если они равны, то исходное число является палиндромом. “Перевертыш” строится последовательным выделением цифр с конца (a=r%10; r:=r/10) и образованием нового числа по формуле:  M=M*10+a. Здесь переменная a пробегает все цифры исходного числа с конца.

#include <stdio.h>;

void main()

{ unsigned long N, M, r, a;

printf("N="); scanf("%li",&N);

r=N; M=0;

while (r>0)

{

a=r%10;

M=M*10+a; //получение "перевертыша"

r=r/10; //отбрасывание последней цифры

}

if (N==M) printf("Палиндром");

 else printf("Не палиндром");

}

2. Алгоритм Евклида. Даны два неотрицательных числа a и b одновременно не равные нулю. Найти наибольший общий делитель.

Обсуждение. Пусть a≥b и r остаток от деления a на b (r:=a%b), тогда НОД(a,b)=НОД(b,r). Действительно, r=a%b, r=a-(a/b)*b. Если какое-то число делит нацело и a и b, то из приведенного равенства следует, что оно делит нацело и число r.

#include <stdio.h>;

void main()

{ unsigned long a, b, nod;

printf("a b="); scanf("%li%li",&a,&b);

while (a!=0&&b!=0)

if (a>b) a=a%b; else b=b%a;

nod=a+b;

printf("NOD=%li",nod);

}

Примеры

1) k=0;

 do

   {n=n/10; k=k+1;}

while (n>0);

2) i=0; s=0;

do

i++; s=s+pow(i,2);

while (i<100);

3) i=0; a=1; s=a;

do

{

i=i+1;

a=-a*x/i; s=s+a;

}

while (fabs(a)>0.0001);

Пример программы

Вычислить квадратный корень вещественного числа x с заданной точностью ε=0.0001 по итерационной схеме:

,

где yn-1 – предыдущее приближение к корню, yn – последующее приближение.

Осуждение. Начальное приближение y0 выбирается произвольно. Процесс вычислений прекращается, когда два последовательных приближения станут отличаться друг от друга по абсолютной величине менее, чем на величину заданной точности.

#include <stdio.h>;

#include <math.h>;

void main()

{ const eps=0.0001;

float x,y0,y1;

printf("Введите x>0: "); scanf("%f",&x);

y1=1;

do

{

y0=y1;

y1=0.5*(y0+x/y0);

}

while (fabs(y1-y0)>eps);

printf("sqrt(%.2f)=%f",x,y1);

}

 

Примеры

1) for (k=1;k<n;k++) if (n%k==0) printf(”%i”,k);

2) for (int i=1,s=0;i<=100;i++) s+=i*i;

3) s=0; f=1;

for (i=1;i<=n;i++)

{ f=f*i; s=s+f; }

3) for (i=n;i>=1;i--) printf(”%i ”,i*i);

4) Ok=1;

for (n=2;n<=sqrt(a);i++)

if (a%n!=0) { Ok=0; break; }

Примеры решения задач

1) Каждое число Фибоначчи вычисляется как f1=1, f2=1, а начиная с третьего, по формуле fn=fn-1+fn-2. Составить программу, которая вычисляет последовательность n (n≥3) чисел Фибоначчи.

Обсуждение. Формула, по которой вычисляются числа Фибоначчи относится  к рекуррентным формулам и для реализации данной формулы достаточно иметь три переменные: f=fn, f1=fn-1 и f2=fn-2. Подготовка к вычислению следующего элемента последовательности осуществляется присвоением f1=f2 и f2=f.

#include <stdio.h>;

void main()

{

int n, i;

unsigned long f,f1,f2;

printf("n="); scanf("%i",&n);

f1=1; f2=1; printf("%li %li ",f1,f2);

for (i=3;i<=n;i++)

{

f=f1+f2; printf("%li ",f);

f1=f2; f2=f;

}

printf("\n");

}

2) Определить, является ли заданное число n простым.

Обсуждение. Простое число – натуральное число, большее единицы, но не имеющее других делителей, кроме самого себя и единицы. Из определения следует, что, если заданное число делится хотя бы один раз на одно из чисел 2,3,…,n-1, то оно составное. В действительности, достаточно проверить делимость заданного числа на 2,3,…,n/2, или даже на 2,3,…,  (почему?).

#include <stdio.h>;

#include <math.h>;

void main()

{

int n, i, Ok;

printf("Введите n>1: "); scanf("%i",&n);

Ok=1;

for (i=2;i<=int(sqrt(n));i++)

if (n%i==0) { Ok=0; break; }

if (Ok) printf("Простое\n");

else printf("Составное\n");

}

 

Оператор перехода

 

Оператор перехода вызывает передачу управления оператору, которому предшествует метка:

goto <имя>;

...

<имя>: <оператор>

Помеченный <оператор> должен находиться в той же функции, что и оператор goto, и метка должна быть уникальна.

Метка – это просто идентификатор.  

Метка от оператора должна отделяться символом ”:”.

Пример испол


Поделиться с друзьями:

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.475 с.