Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatika_1 / 1pr opr / ЛАБОРАТОРНИЙ ПРАКТИКУМ / ЛАБОРАТОРНИЙ ПРАКТИКУМ.doc
Скачиваний:
53
Добавлен:
07.02.2016
Размер:
791.55 Кб
Скачать

Лабораторна робота №11 Тема роботи: “ Програмування циклічних процесів”

Мета роботи: дати навички студентам складати програми циклічних процесів у мові С.

Основні питання, які розглядаються в лабораторній роботі: оператори присвоюванн, введення-виведення даних, управління, циклів.

Рекомендована література

  1. Романовская Л.М. и др. Программирование в среде Си для ПЭВМ ЕС/Л.М.Романовская, Т.В.Русс, С.Г.Свитковский. – М.: Финансы и статастика, 1991. – 352 с. Ст. 74-79

  2. В.В.Подбельский, С.С.Фомин Программирование на языке Си. -М.:Финансы и статистика, 1999. Ст. 90-100

  3. В.С.Проценко, П.Й. Чалий, А.Б. Ставровський Техніка програмування мовою Ci,-К., Либідь, 1993. Ст. 17-21

  4. Березин Б.И., Березин С.Б. Начальный курс С и С++. – М.: ДИАЛОГ-МИФИ, 1999. – 288 с.Ст. 78-82

  5. Г.Шилдт Справочник программиста по С/С++. : Пер. с англ.: Уч. пос.. – М. : Издательский дом «Вильямс», 2000. – с. 21-25

Хід роботи:

  1. Вивчити теоретичний матеріал.

  2. Виконати індивідуальне завдання.

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

Контрольні запитання.

  1. Дати визначення та приклади: лексем, ідентифікаторів, строкових та числових літеральних констант, коментарів, локальних та глобальних змінних, операндів, операторів та виразів.

  2. Логічні вирази (інтерпретація значень та послідовність виконання).

  3. Пріоритети арифметичних операцій.

  4. Яка структура програми на мові С?

  5. Які функції використовується для введення та виведення даних?

  6. Який обчислювальний процес називають процесом з розгалуженням?

  7. Який оператор умови використовується у мові С?

  8. Який оператор безумовного переходу використовується у мові С?

  9. Що таке оператор вибору і коли її використовують?

  10. Як працює умовний оператор?

  11. Які значення приймають логічні величини?

  12. Які логічні оперції Ви знаєте?

  13. Як позначаються логічні операції у мові С?

  14. Як виконується операція XOR?

  15. Чим ітераційний цикл відрізняється від регулярного?

  16. Який вид циклу найкраще описує ітераційний цикл?

  17. Які задачі визначаються ітераційним циклом?

  18. Які оператори циклу раціонально використовувати при описі регулярних та ітераційних циклів?

  19. Чи можна описати ітераційний цикл, використовуючи оператор if? Показати приклади.

  20. Як використовуються оператори break та continue.

Теоретичні відомості.

Множина символів мови С (є підмножиною набору символів ASCII): великі та малі літери латинського алфавіту, арабські десятеричні цифри та спеціальні символи:

,

.

;

:

?

'

"

(

)

{

}

<

>

[

]

!

|

/

\

~

_

#

%

&

^

-

=

+

*

Ідентифікатор – це послідовність букв, цифр та знаків підкреслення, де на першому місці не може стояти цифра. Компілятор мови С чутливий до регістру символів, тобто наступні ідентифікатори – РІЗНІ:

Add ADd AdD ADD add aDd adD aDD

У мові С використовуються:

  • основні типи величин:

    тип

    призначення

    довжина в байтах

    char

    символьний

    1

    int

    цілі

    2

    float

    дійсні

    4

    double

    дійсні подвійної точності

    8

    void

    пустий

    -

  • модифікатори:

    signed

    - знакове

    unsigned

    - без знакове

    short

    - коротке

    long

    - довге

  • кваліфікатори:

    const

    - постійне значення

    volatile

    - можлива неявна зміна

  • спеціфікатори:

extern

- зовнішня прив'язка

auto

- створюється та руйнується у стеці

static

- руйнується після закінчення програми

register

- використати регістр

mutable

- зміна кваліфікатора const на змінний

Приклад визначення ідентифікаторів:

правильні

не правильні

double r1;

const int ame=bil, ttt=’1’;

unsigned long Lu = 1234567L;

char bit, _cod=’d’;

float e1 = 1.8e-7;

char str = “C++ программа”;

double 1ro;

int char til;

long unsigned weep=1;

chat ch=301;

float u2 = -.7a9;

floats tr = “C++ программа”;

Літеральна константа – представляє собою константу, тип та значення котре визначається її зовнішнім видом.

Числові літеральні константи

Задаються одним із наступних способів:

а) цілі задаються такою послідовністю – знак числа (+ або -, якщо не вказати буде додатним), потім вказівка типа (для чисел в системі числення з основою вісім – 0, для чисел в системі числення з основою шістнадцять - 0x, якщо не вказати буде – десять), потім саме число.

числа в системі числення з основою

вісім

десять

шістнадцять

правильні

-012

032

07

17

-30

79

-0x10

0xF9

0Xa

не правильні

08

09

-0A

-30e

F9

30-

0x12h

0xO3

-0xDi

б) дійсні – цілим числом в системі числення з основою десять, за яким необов’язкові частини: крапка, за якою йде дробова частина, масштабний множник (символ E або e) за яким знак і ціле число в системі числення з основою десять:

12.5 -7.6 1.25e-1 -2.4e+10 +.8e2

За умовчанням цілим константам асоціюється тип int, дійсним – double, якщо константа приймає значення відповідне множині значень вказаних типів. Якщо константа виходе за ці межі, то вона відноситься до наступного за потужністю множини припустимих значень.

в) суфіксні - числові константи можна задати явно за допомогою суфіксів:

l, L – long int; 123456l

u, U – unsigned int 45u

f, F – float 3.7e-5f

l, L – long double 1024.35e123l

Символьні літеральні константи:

  • клавіатурні символи задаються в апострофах: '7', '8', 'a', 'v'

  • кодові символи – задають керуючі або символи розділу (починаються з символу \).

'\b'

знак пробілу

'\n'

знак переходу на новий рядок

'\t'

знак табуляції

'\’'

знак апострофа

'\”'

подвійні лапки

  • кодові числові – для завдання будь-яких ASCII-кодів символів: '\xHH', '\XHH', '\0OOO', де H – цифра в системі числення з основою шістнадцять - (hexadecimal) та O – цифра в системі числення з основою вісім (octal)

Строкові константи – послідовність символів, обмежена подвійними лапками

"приклад рядка" "ERROR: повідомлення про помилку."

Коментар має наступну форму:

/*<будь-який текст>*/

де <будь-який текст> може бути будь-якою комбінацією символів з множини ASCII символів, включаючи символи нового рядка, але крім комбінації */. Це означає, що коментарі можуть займати більше одного рядка, але не можуть бути вкладеними.

Наступні приклади ілюструють деякі коментарі:

/* Тепер на

кілька рядків */

/*******************************************

Такий коментар теж правильний.

*******************************************/

Тому що коментарі не можуть містити вкладених коментарів, то наступний приклад буде помилковим:

/* Ви не можете /* так */ задати */

Структура програми:

<припроцесорні директиви>

<визначення змінних та констант1>

<тип1> main({(int <argc> {, char **<argv>}})

{

<визначення змінних та констант2>

<оператори>

{return {<вираз>};}

}

де <argc> – кількість параметрів командної строки; <argv> – масив рядків (кожен параметр командної строки виділяється в окремий рядок).

У розділі <визначення змінних та констант1> задаються глобальні змінні та константи, а <визначення змінних та констант2> – локальні. Останні можливо використовувати тільки усередині функції main.

return – ключове слово на якому виконання функції достроково завершується.

<вираз> – значення яке вертається функцією.

Приклад програми:

#include <stdio.h>

void main()

{

int a = 13;

printf(“%i”, a);

}

Після символу # починаються директиви, які обробляються препроцесором.

include – компілятор включає у позицію директиви файл з ім’ям вказаним у кутових дужках, тобто, в даному випадку, stdio.h

Функція printf визначена у модулі stdio.h та виконує функцію форматованного виводу на екран.

printf("%i %i", x, y);

Функція scanf аналогічна printf, тільки використовується для вводу, а в якості параметрів вказуються Lvalue ідентифікаторів. Наприклад:

double a; float b; int c;

scanf("%lf %f %i", &a, &b, &c);

Операнд & називають оператором взяття адресу, тому що він показує дійсну адресу (номер комірки пам’яті – Lvalue) об’єкту, котрий не є бітовим полем або заданим регістровим спеціфікатором.

Для запису математичних виразів використовують стандартні функції:

математичний запис

запис на мові С

тип аргументу

тип результату

|x|

abs(x), labs(x)

cabs(x), cabsl(x)

fabs(x), fabsl(x)

ціле

комплексне

дійсне

еквівалентний аргументу

sqrt(x)

sqrtl(x)

дійсне, комплексне

довге дійсне

–//–

sin x

sin(x)

sinl(x)

дійсне, комплексне

довге дійсне

–//–

cos x

cos(x)

cosl(x)

–//–

–//–

tan x

tan(x)

tanl(x)

–//–

–//–

arctan x

atan(x)

atanl(x)

–//–

–//–

arctan x/y

atan2(x,y)

дійсне,

довге дійсне

–//–

exp(x)

дійсне, комплексне

і довге дійсне

–//–

pow(a, x)

–//–

log(x)

–//–

–//–

log10(x)

–//–

–//–

pow10(x)

pow10l(x)

ціле

ціле

дійсне

довге дійсне

Шаблони та типи функцій asin та acos аналогічні до atan.

Арифметичні операції, за пріоритетом:

  1. унарні(необхідний тільки один аргумент) операції:

    Назва операції

    Операнд

    Пріоритет

    Приклад

    заперечення префіксне

    будь-який вираз

    найвищий

    -12, -a, -sum

    інкремент (декремент) префіксний

    Lvalue, ціле або дійсне

    змінюється до обчислення виразу

    ++a, --f

    інкремент (декремент) постфіксний

    Lvalue, ціле або дійсне

    змінюється після обчислення виразу

    id++, t--

  2. бінарні інфіксні операції двох аргументів:

Операції

Операнди

Пріоритет

Тип результату

арифметичні

додавання віднімання

a+b, a–b

цілі або дійсні

додавання

тип операнда

множення ділення

a*b, a/b

цілі або дійсні

множення

–//–

остаток від ділення

a%b

цілі

множення

–//–

Приклад, 5/2=2, а 5.0/2=2.5. Тому треба уважно слідкувати за типами і аналізувати яка саме реалізація операції буде використана компілятором.

Операція присвоювання

x1 = <вираз>;

На відміну від інших мов, наприклад С, де присвоювання є оператором, на С можливі такі записи:

a = b = c = 1; a = b + (c = d + 3);

Логічні та побітові операції

Операція

Найменування

!

Логічне НІ

<

Менше

<=

Менше або дорівнює

>

Більше

>=

Більше або дорівнює

==

Дорівнює

!=

Не дорівнює

~

Побітове доповнення

<<

Побітовий зсув уліво

>>

Побітовий зсув вправо

&

Побітове И, адреса від

|

Побітове виключне АБО

^

Побітове виключне АБО

&&

Логічне И

||

Логічне АБО

,

Послідовне виконання (кома)

Оператор умовного переходу if

if (<вираз>) <оператор1>; {else <оператор2>};

Якщо значення виразу ненульове, то виконується оператор1, інакше оператор2. Оператор if інтерпретує вираз як логічний: який вважається істинним, якщо його значення відмінне від нуля, якщо нуль – хибним. Якщо значення першого операнда у виразі досить, щоб визначити результат операції, то другий операнд не обчислюється.

Операція «?»

У С можливо використовувати тернарну операцію «?»:

<вираз1>?<вираз2>:<вираз3>;

Після обчислення значення <вираз1>1, якщо значення дорівнює нулю, то виконується <вираз3>, інакше <вираз2>.

i = 1; i = (2>3)?i+++j:j+++i;

У цьому прикладі компілятор спочатку створює послідовність із трьох знаків плюс саму довгу з можливих операцій (++), а потім обробить знак, що залишився, +, як операцію додавання (+). Вираз проінтерпретується як (i++)+(j), а не як (i)+(++j). У таких випадках необхідно використати пробільні символи або круглі дужки, щоб однозначно визначити ситуацію.

Оператор вибору switch

switch (<вираз>)

{

case <обчисл.конст1>: <посл.оператор1>

case <обчисл.конст2>: <посл.оператор2>

...

case <обчисл.констN>: <посл.операторN>

default: <посл.операторN+1>

}

Ціле значення <вираз> порівнюється з обчислювальними константами. Якщо вони збіглися, то починає виконуватись послідовність операторів, яка завершується ключовим словом break. Приклад:

int a=10;

switch (a-5){

case 4: printf("4");

case 5: printf("5");

case 6: printf("6"); break;

default: printf("def");}

У цьому прикладі на екрані з’явиться рядок "56".

Приклад. Написати програму для обчислення значення Y для заданого X:

#include <math.h>

#include <stdio.h>

void main()

{ float x,y;

printf("\n Введіть x\n");

scanf("%f", &x);

if ((x>1)&&(cos(pow(x, sin(x))))

{y = pow(tan(pow(x, sin(x))), 2);

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

}

else if ((x>=-1)&&(x<=1))

{y = pow(asin(x*x), 1/3.0);

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

}

else if ((x<-1)&&(cos(x)!=0))

{y = log(fabs(cos(x)))/log(2);

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

}

else print(“x=%f y не має розвязку”, x);

return;

}

Алгоритм циклічної структури – це алгоритм, у якому передбачене кількаразове виконання однієї і тієї ж послідовності дій. Якщо відомо кількість повторень при виконанні циклу, то він має назву "регулярний цикл", інакше "ітераційний цикл". Розглядають три види циклів: цикл "поки", цикл "до" і цикл "для".

Оператор циклу «поки» - while:

while (<вираз>) <оператор1>;

Логіка: якщо значення виразу істинне, то виконується оператор1. Якщо хибне – оператор while завершується і буде виконаний наступний оператор. Наприклад, щоб обчислити факторіал d:

b = 1;

while (d) { b*=d--; };

Після виконання у b буде значення факторіалу d, а d стане нульовим.

Оператор циклу «до» - do...while:

do <оператор1> while (<вираз>);

Логіка: Спочатку виконується оператор1, потім якщо значення виразу ненульове, виконується оператор1 за яким знову перевіряється вираз і т.д. Наприклад, щоб обчислити факторіал d:

b = 1;

do b*=d--; while (d);

Після виконання у b буде значення факторіалу d, а d стане нульовим. На відміну від попереднього прикладу значення b може стати нульовим.

Оператор циклу «для» - for:

for ({<вираз1>}; {<вираз2>}; {<вираз3>}) <оператор1>;

Перед першою ітерацією виконується вираз1. На кожній ітерації перевіряється значення вираз2, якщо воно ненульове, то виконується оператор1. Після кожної ітерації виконується вираз3. Якщо в операторній частині зустрічається ключове слово break, то на ньому завершується циклічний процес. Якщо зустрічається слово continue, то на ньому достроково завершується оператор ітерації. Усі вирази є необов’язковими, якщо відсутній вираз2, то він інтерпретується як одиниця (істинна).

Для попереднього прикладу отримаємо:

for (b=1; d; b*=d--);

Фігурні дужки { } задають початок і кінець складного оператору, який вважається для компілятора одним, наприклад:

{ a=b+c; c=b+a; b=d+c; }

Для описування алгоритму ітераційного циклу можна використовувати також рекурентну формулу. При цьому описуванні обчислення чергового елемента ґрунтується на значенні попереднього елемента.

Приклад. Обчислити суму з точністюe.

Очевидно

#include <stdio.h>

void main()

{

float S, a, x, e;

int n;

printf("\nВведіть x=");

scanf("%f", &x);

printf("\nВведіть e=");

scanf("%f", &e);

for (n=2, S=a=x; fabs(a)>e; n++)

{

a*=-x/n;

S+=a;

}

printf("%f", S);

}

Або використовуючи цикл do...while

#include <stdio.h>

void main()

{

float S, a, x, e;

int n;

printf("\nВведіть x=");

scanf("%f", &x);

printf("\nВведіть e=");

scanf("%f", &e);

n=2;

S=a=x;

do

{

a*=-x/n;

S+=a;

n++;

} while (a>=e);

printf("%f", S);

}

Хід роботи:

  1. Вивчити теоретичний матеріал.

  2. Виконати індивідуальне завдання.

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

Індивідуальні завдання: Створити програму на мові С для приведеної задачі згідно варіанту.

1. Дано натуральне число n. Обчислити суму n додатків, кожне з яких дорівнює kk.

2. Дано натуральне число n. Обчислити f0, f1, f2, …, f n, де

3. Дано натуральне число n та дійсне число х. Знайти суму 10 доданків, кожне з яких обчислюється за формулою

  1. Дано натуральне число n. З'ясувати, чи є серед чисел n, n+1, n+2, ...,2 n, близнята, тобто прості числа, які різняться між собою на 2.

  2. Для даного натурального n знайти найменше додатнє число, яке має в своєму десятковому запису тільки 0 і 1 та ділиться на n без залишку.

  3. Дано натуральне число n. Скільки цифр в цьому числі? Чому дорівнює сума його цифр? Знайти першу цифру цього числа. Знайти значередуючу суму цифр числа.

  4. Описати варіант алгоритма Евкліда, який використовує співвідношення

НОД(2а, 2b)= 2НОД(а,b); НОД(2а, b)= НОД(а, b) при непарному b.

  1. Скласти програму, яка виводить на екран розклад на прості множники заданого натурального n>0.

  2. Дано натуральне число n. Підрахувати кількість розв'язків нерівності

x2 + y2 <n в натуральних числах, не використовуючи дій з дійсними числами.

  1. Дано натуральне число n>1. Визначити довжину періода десяткового запису дробу 1/n.

  2. Дано натуральне число n. Отримати всі такі нтуральні q, що n ділиться на q2 та не ділеться на q3.

  3. Дано натуральні числа m, n. Отримати їх загальні дільники (додатні та від'ємні).

  4. Дано натуральне число n. Обчислти добуток перших n множників

  1. Для будь-якого цілого k позначимо кількість цифр в його десятковому запису через Ц(k). Визначити

  1. Для будь-якого цілого k позначимо кількість цифр в його десятковому запису через Ц(k). Визначити

  1. Дано натуральне число n. Якщо можна подати його у вигляді суми квадратів натуральних чисел, то вказати пари x, y таких натуральних чисел, що n=x2+y2, x>=y.

  2. Знайти натуральне число від 1 до 10 000 з максимальною сумою дільників.

  1. Дані цілі числа p і q. Отримати всі дільники числа q, взаємно прості з p.

  2. Натуральне число називається досконалим, якщо воно дорівнює сумі всіх його дільнків, за виключенням самого себе (6=1+2+3). Отримати всі досконалі числа, що менші за задане n.

  3. Обчислити з заданою точністю  значення суми для заданого х:

|довершеним|

  1. Обчислити з заданою точністю  значення суми для заданого х:

  1. Задано дійсне число >0. Обчислити , враховуючи тільки ті додатки, в яких множникмає величину, не менше ніж.

  2. Дано дійсне число >0. Послідовність a1, a2, … утворена за наступним законом:

. Знайти перший an, для якого виконується умова an- an-1<.

  1. Задані дійсні числа х, . Послідовність a1, a2, … утворена за наступним законом: a1=x; далі для n=2, 3, ... виконано

. Знайти перший член an (n>=2), для якого виконується умова an- an-1<.

  1. Задані дійсні числа a, b. Послідовності x1, x2, …, y1, y2, … утворені за наступним законом: xn=a+bcos(0.5n), yn=0.5an – bsin(0.5n). Отримати , деk- найбільше натуральне число, яке задовольняє двом умовам: k<=20 та |yk|>10-3.