Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование

.pdf
Скачиваний:
48
Добавлен:
30.03.2015
Размер:
544.24 Кб
Скачать

Выражение, стоящее после оператора if может содержать операторы сравнения (==, <, >, <=, >=, !=) и логические функции (&& - “И”, || - “ИЛИ”, !- “НЕ”).

Оператор множественного выбора имеет следующий синтаксис: switch ( <выражение> ) {

case <консатнта1> : <группа операторов1>; case <консатнта2> : <группа операторов2>;

...

case <консатнтаN> : <группа операторовN>; default : <операторы>;

};

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

Сначала вычисляется выражение в скобках за ключевым словом switch. Затем просматривается список меток (case <константа1> и т. д.) до тех пор, пока не находится метка, соответствующая значению вычисленного выражения. Далее происходит выполнение соответствующей последовательности операторов, следующих за двоеточием. Если же значение выражения не соответствует ни одной из меток оператора switch, то выполняется последовательность операторов, следующая за ключевым словом default.

Допускается конструкция оператора switch, когда слово default и соответствующая последовательность операторов могут отсутствовать.

Пример. Составить программу для начисления зарплаты согласно следующему правилу: если стаж работы сотрудника менее пяти лет, то зарплата равна 50$, при стаже работы от пяти до 15 лет - 100$, свыше 15 лет зарплата повышается с каждым годом на 10$, причем при стаже превышающем 30 лет она составляет 300$.

Для программирования решения этой задачи определим математическую формулировку задачи:

50, если ST 5;

100, если 5 ST 15;

ZP 100 ST 15 *10, если 15 ST 30;300, если ST 30.

где ZP – зарплата, ST – стаж работы. Далее, построим алгоритм решения, показанный на (рис.1), ей соответствует следующая программа

11

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

day

 

 

 

 

 

 

 

 

 

 

day=1

 

да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

не

 

Monday

 

 

 

day=2

 

да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Tuesday

 

 

 

 

 

 

 

 

 

не

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

day=7

 

да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Saturda

 

 

 

 

 

 

y

 

 

 

Non

 

 

 

 

 

 

 

 

 

 

existed

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Конец

 

 

 

 

 

 

 

Рис. 1.

 

 

 

 

Рис. 2.

 

 

 

 

 

 

 

 

 

 

 

#include <stdio.h>

// библиотека, содержащая описание

 

// операторов ввода/вывода

 

 

 

 

 

 

 

# include <conio.h>

// библиотека, содержащая описание

 

// операторов для работы с экраном

void main()

// заголовок главной функции программы

{ float st, zp;

// описание вещественных идентификаторов

clrscr ();

//

процедура очистки экрана

printf(“Vvedite stag st \n”);

// вывод информационного сообщения

scanf (“%f”, &st);

 

// ввод значения st

 

 

 

 

 

 

 

if (st<5) zp=50;

 

// вычисление значения переменной zp

else if (st>=5 && st<=15) zp=100;

 

 

 

 

 

 

 

 

 

else if (st>15 && st<=30) zp=100+(st-15)*10;

 

 

 

 

 

 

 

else zp=300;

 

 

 

 

 

 

 

 

 

 

 

printf (“Zarplata Zp=%4.2f\n”, zp);

// вывод результата

getch();

 

// процедура задержки экрана, пока не

// нажата любая клавиша

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

12

Пример. Выведите название дня недели, соответствующее введенному числу. Алгоритм решения данной задачи приведен на рис. 2.

#include <stdio.h>

// библиотека, содержащая описание

 

// операторов ввода/вывода

# include <conio.h>

// библиотека, содержащая описание

 

// операторов для работы с экраном

void main()

// заголовок главной функции программы

{ int day;

// описание целого идентификатора

clrscr ();

// процедура очистки экрана

printf(“Input day of week \n”); // вывод информационного сообщения

scanf (“%d”, &day);

// ввод значения day

switch (day)

 

{

 

case 1 : printf(“Monday \n”); break; case 2 : printf(“Tuesday \n”); break; case 3 : printf(“Wednesday \n”); break; case 4 : printf(“Thursday \n”); break; case 5 : printf(“Friday \n”); break; case 6 : printf(“Saturday \n”); break; case 7 : printf(“Sunday \n”); break;

default : printf(“This day not existed \n”);

}

getch();

// процедура задержки экрана, пока не

// нажата любая клавиша

 

}

 

Лабораторная работа 3 ПРОГРАМИРОВАНИЕ ЦИКЛИЧЕСКИХ АЛГОРИТМОВ С ЗАДАНЫМ

ЧИСЛОМ ПОВТОРЕНИЙ

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

Вязыке С/С++ известно три вида оператора цикла:

1)итерационный цикл (оператор цикла со счетчиком) (for (инициализация; выражение_условие; список_выражений;) тело_цикла;

2)цикл с предусловием (while (выражение_условие) тело_цикла;)

13

3)цикл с постусловием (do тело_цикла while(выражение_условие;).

Тело_цикла – это либо отдельный оператор (в том числе и пустой), либо составной оператор, либо блок.

Оператор цикла со счетчиком (итерационный цикл):

for (<выражение инициализации>;<выражение проверки условия>;<выражение коррекции>) <тело цикла>;

где <выражение инициализации> служит для инициализации счетчика, и оно осуществляется только один раз при входе в цикл; <выражение коррекции> вычисляется на каждой итерации (вычислительном шаге) после выполнения

операторов тела цикла.

 

Примеры записи оператора for():

 

1.

for (n=10;n<0;n--)

// переменная n в цикле на

каждом шаге уменьшается на 1 до тех пор пока не станет равной 0

2.

for (x=1; y<=75; y=5*x+++15)

// выражение коррекции

представляет собой сложное алгебраическое выражение, в котором одновременно х увеличивается с шагом 1, а у рассчитывается по формуле

3.

for (x=1,y=1.5;y<=5.5;x++,y+=x*0.3)

//

выражения

инициализации и коррекции могут состоять более чем из одной операции

4.

for(; ;)

// бесконечный цикл

При работе с операторами цикла самыми распространенными являются ошибки:

1.организация «бесконечного» цикла, в случае если выражение проверки условия записано некорректно;

2.«лишний шаг» возникает при работе с массивами, когда программа должна обратиться к несуществующему элементу. Компилятор не выдает сообщений об ошибках такого рода.

Оператор цикла с предусловием:

while ( <выражение условие> ) <оператор>;

Оператор может быть простым, составным или пустым оператором. Цикл выполняется до тех пор, пока условие принимает значение «истинно» (т.е. отлично от нуля). Когда же условие примет значение «ложно», программа передаст управление следующему оператору программы. Так же, как и в цикле for, в цикле while сначала проверяется условие, а затем выполняется оператор – это, так называемый, цикл с предусловием. Тип «условия» должен быть арифметическим или приводимым к нему.

Пример: while (i<100) p++;

14

Оператор цикла с постусловием

В отличие от предыдущих циклов в цикле do - while условие проверяется в конце оператора цикла.

do {<операторы>} while ( <условие выполнения> );

Пример: do {

n *= i; i++;

}

while (i <= 100);

Пример 2. Вычислить сумму элементов s=1+1/2+1/3+…+1/n. Для любого целого значения n.

Данная задача является классическим примером использования операторов цикла. На рис. 3. показан алгоритм ее решения.

#include <stdio.h>

 

 

// библиотека, содержащая описание

 

 

// операторов ввода/вывода

# include <conio.h>

 

// библиотека, содержащая описание

 

 

 

// операторов для работы с экраном

void main()

 

 

// заголовок главной функции программы

{int i, n;

 

// описание целых переменных

float s=0, r;

 

// описание вещественных переменных

clrscr();

 

// очистка экрана

printf (“Vvedite n”);

// вывод информационного сообщения

scanf (“%d”,&n);

 

// ввод с клавиатуры значения n

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

 

//

итерационный цикл i от 0 до n

{r=1/(i*i);

 

//

вычисление текущего элемента ряда

s+=r;

// расчет суммы ряда

}

 

 

 

printf (“Summa S=%3.1 f\n”); // вывод результата

getch();

// процедура задержки экрана, пока не

 

// нажата любая клавиша

}

 

15

Начало

Начало

Ввод n

Ввод a, b,n

S=0

dx=|b-a|/(n-1)

i=1

x=a

r=1/i*i

i++, x+=dx

S=S+r

f1, f2

i<=n

Вывод i, x, f1, f2

Вывод S

x<=b

 

Конец

Рис. 3.

Рис. 4.

Пример. Вычислить значение двух функций F1(x)=tg(x) и F2(x)=sin(x) в точка, равномерно распределенных на интервале axb , где a=− π /4 , b= π

Алгоритм решения задачи показан на рис. 4.

#include <stdio.h>

// библиотека, содержащая описание

// операторов ввода/вывода

 

# include <conio.h>

// библиотека, содержащая описание

 

// операторов для работы с экраном

# include <math.h>

// библиотека, содержащая описание

//математических операторов

void main()

// заголовок главной функции программы

{const float a=M_PI_4, b=M_PI;

int i=1, n;

// описание целых переменных

float f1, f2, x=a, dx;

// описание вещественных переменных

clrscr();

// очистка экрана

printf (“Vvedite n”);

// вывод информационного сообщения

scanf (“%d”,&n);

// ввод с клавиатуры значения n

printf(“-------------------------------------------------

”);

16

printf(“| i

|

X |

F1 |

F2 |”);

printf (“|--------

|-----------

|--------------

 

|-------------

|”)

dx=(b-a)/(n-1);

 

// вычисление шага изменения аргумента х

while (x<=b)

 

 

// оператор цикла с предусловием, пока х<=b

{f1=tan(x);

 

 

// вычисление функции f1

f2=sin(x);

 

 

// вычисление функции f2

x+=dx;

 

 

// шаг изменения х

 

i++;

 

 

// номер точки

 

printf (“%3d %3.2f %3.2f %3.2f\n”, i,x,f1,f2);

// вывод результата

}

printf (“________________________________”); // вывод результата getch(); // процедура задержки экрана, пока не

// нажата любая клавиша

}

Лабораторная работа 4 СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ОБРАБОТКИ МАССИВОВ

Массив – это упорядоченная последовательность данных одного типа, имеющих одно имя. Массив описывается следующим образом:

<тип> <имя массива> [n1] [n2]…

где n1, n2 – размер массива по данному измерению.

Элемент массива представляет собой индексированную переменную, индекс которой указывается в квадратных скобках. Индекс может быть целой константой, целой переменной или выражением целого типа. Все массивы индексируются с нуля.

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

float a[3]={1.2, 3.4, -0.1}; где a[0]=1.2, a[1]=3.4, a[2]=-0.1.

Имя массива является константой указателем на адрес первого элемента массива. Начальный адрес массива определяется компилятором в момент описания массива и не может быть переопределен.

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

Массивы хранятся в памяти как сплошные последовательности

17

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

Обращение к элементу массива производиться указанием имени массива и индексов, заключенных в квадратные скобки:

<имя>[<индекс>]

В данном типе определена единственная операция присваивания. Можно присваивать массив лишь массиву, например: А=С. Операции сравнения производиться только поэлементно.

При работе с массивами выделяют следующие типовые операции:

1. Заполнение массива возможно либо с помощью генератора случайных чисел (random()), либо с клавиатуры, либо по определенному правилу.

Пример.

for (i=0; i<n; i++) for (j=0; j<n; j++) cin>> a [i][j];

В квадратной матрице выделяют главную и побочную диагонали, относительно которых элементы могут находиться выше или ниже (рис. 5).

I

IV II

III

Рис. 5. Принятое деление матрицы на четверти.

Условия нахождения элементов в каждой из частей матрицы следующие:

1.I: (i<j) && (i+j<n-1)

2.II: (i<j) && (i+j>n-1)

3.III: (i>j) && (i+j>n-1)

4.IV: (i>j) && (i+j<n-1)

5.на главной диагонали: i = = j

6.на побочной диагонали: i+j = = n-1

где i – номер строки, j – номер столбца, в которых находится элемент матрицы, n – размерность квадратной матрицы.

2. Вычисление суммы, произведения, среднего арифметического, среднего геометрического, количества элементов, удовлетворяющих некоторому условию.

Пример. Вычислить сумму положительных элементов матрицы и количество отрицательных элементов.

for (i=0; i<n; i++) for (j=0; j<n; j++)

18

{if a[i][j]>0 s+=a[i][j]; else k++;

}

3. Сортировка массива Идея метода сортировки выбором состоит в том, чтобы создавать

отсортированную последовательность путем присоединения к ней одного элемента за другим в правильном порядке.

Шаги алгоритма:

1.находим минимальное значение в текущем списке;

2.производим обмен этого значения со значением на первой позиции;

3.сортируем хвост списка, исключив из рассмотрения уже отсортированный первый элемент.

Будем строить выходную последовательность, начиная с левого конца массива. Алгоритм состоит из n последовательных шагов, начиная с нулевого и заканчивая (n-1)-м.

На i-м шаге выбираем наименьший из элементов x[i] ... x[n] и меняем его местами с x[i]. Последовательность шагов при n=5 изображена на рис. 6.

Рис. 6. Сортировка выбором.

Вне зависимости от номера текущего шага i, последовательность x[0]...x[i] (выделена курсивом) является упорядоченной. Таким образом, на (n-1)-м шаге вся последовательность, кроме x[n], оказывается отсортированной, а x[n] стоит на последнем месте по праву: все меньшие элементы уже ушли влево.

Пример программной реализации. for (i = 0; i < n-1; i++) {

min = i;

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

if (x[min] > x[j]) { // сортировка по убыванию min = j;

}

}

19

temp = x[i]; x[i] = x[min]; x[min] = temp;

}

4. Вставка и удаление элементов массива Удаление одного элемента из массива происходит по следующей схеме:

-указывается или ищется порядковый номер элемента, который необходимо удалить из массива;

-все элементы, стоящие за удаляемым элементом, сдвигаются на одну позицию влево;

-количество элементов уменьшается на единицу.

for (i=0; i<n; i++) // n – номер удаляемого элемента

a[j]=a[j+1];

 

k-=1;

// количество элементов

Пример.

Найти значение и номер наименьшего элемента в массиве.

Алгоритм решения задачи показан на рис.7.

#include <stdio.h>

// библиотека, содержащая описание

 

 

// операторов ввода/вывода

# include <conio.h>

// библиотека, содержащая описание

 

 

// операторов для работы с экраном

# include <stdlib.h>

// библиотека, содержащая описание

 

 

// генератора случайных чисел

void main()

// заголовок главной функции программы

{int a*, i, min, n;

// описание целых переменных

clrscr();

 

// очистка экрана

cout<<”Input size of array”; // вывод информационного сообщения

cin>>n;

 

// ввод размерности массива

randomize();

// генератор случайных чисел, инициализация

 

 

// первого элемента ряда

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

// заполнение массива

{

 

 

a[i]=random(100);

 

cout<<” ”<<a[i];

// вывод содержимого массива на экран

}

 

 

min=a[0];

 

 

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

// поиск минимального элемента

if (a[i]<min)

 

20