Главная Обратная связь

Дисциплины:






Структура повторення for



2. Напишіть і запустіть програму на виконання що написана нижче. Замініть значення counter <= 10 на ваш варіант.

Повторення, кероване лічильником з використанням структури for

/ *Повторення, кероване лічильником з використанням структури for */

#include <stdio.h>

main ( )

{

int counter = 1;

/* инициализация, условие повторения и приращение */

/* все они включены в заголовок структуры for */

for (counter = 1; counter <= 10; counter + + )

printf ("%d\n", counter);

return 0;

}

Структура повторення for автоматично контролює усі деталі повторення, керованого лічильником. Для ілюстрації усієї потужності циклу for давайте перепишемо програму на лістингу 4.1. Результат показаний на лістингу 4.2.

Програма працює таким чином. Коли структура for починає виконуватися, змінна counter, що управляє, ініціалізувалася значенням 1. Потім перевіряється умова продовження циклу counter <= 10. Оскільки початкове значення змінної counter дорівнює 1, умова задовольняється і оператор printf виводить значення змінної counter, а саме 1.

Потім у вираженні counter++ відбувається приріст змінної counter, що управляє, і знову починається виконання циклу з перевірки умови його продовження. Оскільки змінна, що управляє, тепер дорівнює 2, кінцеве значення не перевищене, і тому програма знову виконує оператор printf. Цей процес триває до тих пір, поки змінна counter, що управляє, не збільшується до її кінцевого значення 11 - це призводить до невдачі при перевірці умови продовження циклу, і повторення завершується. Виконання програми триває з першого оператора після структури for (у нашому випадку з оператора return у кінці програми) .

Зверніть увагу, що структура for "робить усю роботу" - в ній специфіковані усі елементи, необхідні для повторення, керованого лічильником з використанням змінної, що управляє. Якщо в тілі циклу for міститься більше за одного оператора, для визначення тіла циклу потрібно фігурні дужки.

Зверніть увагу, що використовується умова продовження циклу counter <= 10. Якби програміст помилково написав counter < 10, то цикл був би виконаний тільки 9 разів. Це є поширеною логічною помилкою, званою помилкою зміщення лічильника.

 

Приклади структур for

Наступні приклади демонструють способи зміни змінної, що управляє, в структурі for.

a) Варіація змінної, що управляє, від 1 до 100 з приростом 1.

for i = 1; i < = 100; i++)

b) Варіація змінної, що управляє, від 100 до 1 з приростом - 1 (декрементом 1).

for (i = 100; i >= 1; i - -)

c) Варіація змінної, що управляє, від 7 до 77 з кроком, рівним 7.



for (i = 7; i <= 77; i += 7)

d) Варіація змінної, що управляє, від 20 до 2 з кроком, рівним, - 2.

for (i = 20; i >= 2; i -= 2)

e) Варіація змінної, що управляє, по наступній послідовності значень : 2, 5, 8, 11, 14, 17, 20.

for (j = 2; j <= 20; j +=3)

f) Варіація змінної, що управляє, по наступній послідовності значень : 99, 88, 77, 66, 55, 44, 33, 22, 11, 0.

for (j = 99; j >= 0; j -=11)

У наступних двох прикладах дані прості додатки структури for. Програма на лістингу 4.5 використовує структуру for для підсумовування усіх парних цілих чисел від 2 до 100.

Зверніть увагу, що тіло структури for у написаній програмі, що нижче насправді можна було б з' єднати з правою частиною заголовка структури for, використовуючи для цього операцію -кому таким чином:

for (number = 2; number <= 100; sum += number, number += 2)

Ініціалізацію sum = 0 також можна було б об' єднати з блоком ініціалізації структури for.

3. Напишіть і запустіть програму на виконання що написана нижче. Додайте до 100 свій номер за списком і повторіть запуск програми.

/* Підсумовування за допомогою структури for */

# include <stdio.h>

main ( )

{

int sum = 0, number;

for (number = 2; number <= 100; number += 2)

sum += number;

printf("Sum is %d\n", sum);

return 0;

}

Sum is 2550

 

4. Напишіть і запустіть програму на виконання що написана нижче. Потім напишіть програму додавши до кількості років та суми на рахунок свій номер варіанту по списку .

У іншому прикладі із структурою for обчислюються складні відсотки. Розглянемо наступну постановку завдання :

Деякий клієнт відкрив в банку 5-процентний ощадний рахунок на $1000.00. Припускаючи, що прибуток залишається на депозиті рахунку, розрахуйте і виведіть суму суму грошей на рахунку на кінець кожного року за 10 років. Для визначення цих сум використовуйте наступну формулу: а = р(1 + r)n

де

р - спочатку вкладена торба (тобто торба, на якові нараховуються відсотки )

r - річна процентна ставка n - число років

n – число років

а - торба на депозиті на кінець n -го року.

Це завдання вимагає циклу, в якому виконується вказаний розрахунок балансу рахунку для кожного року 10 - річного періоду. Рішення задачі показане на лістингу 4.6.

/*Обчислення складних відсотків*/' #include <stdio.h> #include <math.h> main ( ) { int year; double amount, principal = 1000.0, rate = .05; printf("%4s%2ls\n", "Year", "Amount on deposit"); for (year = 1; year <= 10; year++){ amount = principal * pow(1.0 + rate, year); printf("%4d%21.2f\n", year, amount); } return 0; }
Year Amount on deposit
1050.00
1102.50
1157.62
1215.51
1276.28
1340.10
1407.10
1477.46
1551.33
1628.89

 

Обчислення доладного відсотка за допомогою for

Структура for виконує 10 разів тіло циклу, змінюючи змінну, що при цьому управляє, від 1 до 10 з приростом 1. Хоча в мову С не включена операція піднесення до степеня, мі можемо, проте, викликати для цієї мети стандартну бібліотечну функцію pow. Функція pow(x, у) обчислює значення х в мірі у. Вона приймає два параметри типу double і повертає значення типу double. Тип double є типом з плаваючою точкою, дуже схожим на float, але в змінній типу double може зберігатися набагато більше значення і з більшою точністю, чим в змінній типу float. Зверніть увагу, що всякий раз, коли використовується математична функція типу pow, має бути включень заголовний файл math.h. Насправді без включення файлу math.h ця програма працювала б неправильно. Функція pow вимагає двох параметрів типу double. Зверніть увагу, що змінна year є цілим числом. Заголовний файл math.h включає інформацію, яка примушує компілятор перед викликом функції pow перетворити значення змінної year в тимчасове представлення типу double. Ця інформація міститься в так званому прототипі функції pow. Там же мі дамо короткий опис функції pow і інших бібліотечних математичних функцій. Зверніть увагу, що мі оголосили змінні amount, principal і rate з тип double. Ми зробили це для простоти, оскільки маємо тут справу з дробовими долями долара.

5. Напишіть і запустіть програму на виконання що написана нижче. Потім напишіть програму свого власного балу з дисципліни Алгоритмізація та програмування.

/* Підрахунок буквених оцінок */ #include <stdio.h> main ( ) { int grade; int aCount = 0, bCount = 0, cCount = 0, dCount = 0, fCount = 0; printf("Enter the letter grades. \n"); printf("Enter the EOF character to end input. \n"); while (( grade = getchar() ) != EOF) { swith (grade) { /* swith, вкладена у while */ case ‘A’ cfse ‘a’: /* grade рівна А у верхньому*/ ++aCount; /* або а у нижньому регістрі*/ break; case ‘B’: case ‘b’: /* grade рівна В у верхньому*/ ++bCount; /* або b у нижньому регістрі*/ break; case ‘C’: case ‘c’: /* grade рівна C у верхньому*/ ++cCount; /* або c у нижньому регістрі*/ break; case ‘D’: case ‘d’: /* grade рівна D у верхньому*/ ++dCount; /* або b у нижньому регістрі*/ break; case ‘F’: case ‘f’: /* grade рівна F у верхньому*/ ++fCount; /* або f у нижньому регістрі*/ break; case ‘\n’: case ‘ ’: /* цей ввід ігнорується*/ break;   default: /*ловить усі інші символи*/ printf (“Incorrect letter grade entered.”); printf (“ Enter a new grade. \n”); break; } } printf (“\nTotals for eath letter grade are:\n”); printf (“A: %d\n”, aCount); printf (“B: %d\n”, bCount); printf (“C: %d\n”, cCount); printf (“D: %d\n”, dCount); printf (“E: %d\n”, eCount); printf (“F: %d\n”, fCount); return 0; } Enter the letter grades. Enter the EOF character to end input. A B C C A D F C E Incorrect letter grade entered. Enter a new grade. D A B   Totals for each letter grade are: A: 3 B: 2 C: 3 D: 2 F: 1 Приклад використання структури switch Структура з множинним вибором switch Іноді алгоритм містить послідовність ухвалення рішень, коли відбувається незалежна перевірка змінної або вираження на рівність кожному з константних цілочисельних значень, які вони можуть приймати, і залежно від цього робляться різні дії. У мові С для обробки такого роду ситуацій, пов'язаних з ухваленням рішень, передбачена структура з множинним вибором switch. Структура switch складається з ряду міток case і необов'язкового блоку default. У програмі структура switch використовується для підрахунку кількості різних буквених оцінок, отриманих студентами на екзамене. У програмі користувач вводить буквені оцінки для групи. Усередині заголовка структури while while ( ( grade = getchar() ) != EOF) спочатку виконується поміщене в круглі дужки привласнення ( grade = getchar() ). Функція getchar (із стандартної бібліотеки введення/виводу) прочитує один символ з клавіатури і зберігає цей символ в цілочисельній змінній grade. Символи зазвичай зберігаються в змінних типу char. Проте важливою особливістю мови C являється те, що символи можуть зберігатися в будь-якому цілочисельному типі даних, оскільки вони представляються в комп'ютері у вигляді 1-байтових цілих чисел. Таким чином, ми можемо обробляти символ або як ціле число, або як символ залежно від його сенсу. Наприклад, оператор printf("The character (%с) has the value %d.\n", 'a ', 'a'); використовує специфікатори перетворення % c і % d відповідно для виведення символу а і його цілочисельного значення. Результатом буде The character (a) has the value 97.

6. Напишіть і запустіть програму на виконання що написана нижче. Потім напишіть програму яка виведе на екран цифри від 1 до вашого номеру варіанту по списку.

/* Використання структури повторення do/while */ include <stdio.h> main ( ) { int counter = 1;   do { printf("%d ", counter); } while (++counter <= 10); return 0; } 1 2 3 4 5 6 7 8 9 10 4.9. Використання структури do/while У програмі на лістингу 4.9 структура do/while використовується для виведення чисел від 1 до 10. Зверніть увагу, що до змінної counter, що управляє, при перевірці умови продовження циклу застосовується операція преінкременту. Звернете також увагу на фігурні дужки, що укладають тіло структури do/while (що складається з одного оператора).  

На мал. 4.10 представлена блок-схема структури do/while. З неї стає зрозуміло, що умова продовження циклу перевіряється лише після того, як дія буде виконана принаймні один раз. Знову звернете увагу, що (окрім кружків і стрілок) блок-схема містить лише символ прямокутника і символ ромба. Знову уявіть собі, що програміст має доступ до великого ящика порожніх структур do/while — їх стільки, скільки може потрібно програмістові, аби шляхом їх суперпозиції і вкладення в інші структури, що управляють, сформувати структурну реалізацію потоку управління алгоритму. Потім прямокутники і ромби заповнюються відповідними алгоритму діями і рішеннями.


Мал. 4.10.Структура повторения do/while

7. Напишіть і запустіть програму на виконання що написана нижче. Потім напишіть програму замінивши змінну 5 на свій номер варіанту по списку.

Оператори break і continue

/* Використання оператора break в структурі for */ #include <stdio.h> main ( ) { int x; for ( x = 1; x <= 10; x++) { if (x == 5 ) break; /* прериває цикл тільки якщо х = = 5*/ printf("%d ", x); } printf("\nBroke out of loop at x == %d\n", x); return 0; } 12 3 4 Broke out of loop at x = = 5   4.11. Використання оператора break в структурі for Оператори break і continue призначені для зміни потоку управління. Виконання оператора break в структурах while, for, do/while або switch наводить до негайного виходу із структури. Виконання програми продовжується з першого оператора, наступного за нею. Звичайним вживанням оператора break є достроковий вихід з циклу або пропуск операторів, що залишилися, в структурі switch (як на лістингу Прикладу використання структури switch ). Лістинг 4.11 демонструє оператора break в структурі повторення for. Коли структура if виявляє, що значення х стало рівним 5, виконується оператор break. Це завершує оператора for, а програма продовжує виконуватися з оператора printf, наступного за структурою for. Цикл виконується повністю лише чотири рази.  

Виконання оператора continue в структурах while, for або do/while наводить до пропуску операторів, що залишилися, в телі цієї структури і виконання наступної ітерації циклу. У структурах while і do/while перевірка умови продовження циклу проводиться відразу ж після виконання оператора continue. У структурі for виконується вираження приросту, а потім перевіряється умова продовження циклу. Раніше ми встановили, що в більшості випадків структура for може бути представлена структурою while. Одним з виключень є випадок, коли вираження приросту в структурі while слідує за оператором continue. В цьому випадку приріст перед перевіркою умови продовження циклу не виконується, і структура while працює не так, як структура for. На лістингу 4.12 оператор continue служить в структурі for для пропуску оператора printf і початки наступної ітерації циклу.

8. Напишіть і запустіть програму на виконання що написана нижче. Потім напишіть програму що кінцевим числом виведе на екран ваш номер варіанту по списку.

/* Використання оператора continue в структурі for * /'

#include <stdio.h>

main ()

{

int x;

for ( x = 1; x <= 10; x++) {

if ( х == 5 )

continue; /* пропускає код, що залишився, в циклі лише якщо х == 5 */

printf("%d ", x);

}

printf("\nUsed continue to skip printing the value 5\n");

return 0;

}

Used continue to skip printing the value 5

4.12. Використання оператора continue в структурі for

 

Лабораторна робота №17. Тема: Програмні модулі в С. Функції математичної бібліотеки

Мета: Навчитися користуватися програмними модулями.

Аргументи функцій можуть бути константами, змінними або виразами. Якщо c1 = 13.0, d = 3.0 і f = 4.0, то оператор

printf("%.2f", sqrt(c1 + d * f));

обчислює і друкує значення квадратного кореня з 13.0+3.0*4.0=25.0, тобто 5.00.

Деякі функції математичної бібліотеки С приведені в табл.5. Змінні х і у мають тип double.

Таблиця 5

Функції загального призначення математичної бібліотеки

Функція Призначення Приклад
sqrt(x) квадратний корінь з х sqrt(900.0) дорівнює 30.0 sqrt(9.0) дорівнює 3.0
ехр(х) експоненціальна функція ех ехр(1.0) дорівнює 2.718282 ехр(2.0) дорівнює 7.389056
log(x) натуральний логарифм х (основа е) lоg(2.718282) дорівнює 1.0 lоg(7.389056) дорівнює 2.0
Iog10(x) логарифм х (основа 10) log10(1.0) дорівнює 0.0 log10(10.0) дорівнює 1.0 log10(100.0) дорівнює 2.0
fabs(x) абсолютне значення х якщо х > 0, то fabs(х) рівне х якщо х=0, то fabs(x) дорівнює 0.0 якщо х < 0, то fabs(х) рівно -х
ceil(x) округлює х до найближчого цілого, не меншого X ceil (9.2) дорівнює 10.0 сеil(- 9.8) рівне - 9.0
floor(x) округлює х до найближчого цілого, не перевершуючого X floor (9.2) дорівнює 9.0 floor (- 9.8) рівне - 10.0
pow(x, y) х підноситься до степеня у (Xу) pow (2,7) дорівнює 128.0 роw (9,5) дорівнює 3.0
fmod (x, у) залишок х/у як число з плаваючою точкою fmod (13.657, 2.333) дорівнює 1.992
sin(x) тригонометричний синус х (х в радіанах) sin (0.0) дорівнює 0.0
cos(x) тригонометричний косинус х (х в радіанах) соs (0.0) дорівнює 1.0
tan(x) тригонометричний тангенс х (х в радіанах) tan(0.0) дорівнює 0.0

1. Напишіть і запустіть програму на виконання що написана нижче. Потім напишіть програму замінивши змінну х на свій номер варіанту по списку.

/* Функція square, визначена програмістом */

#inciude <stdio.h>

int sguare (int); /* прототип функції */

main ( )

{

int x;

for (x = 1; x <= 10; x++)

printf("%d ", square(x));

 

printf("\n");

return 0;

}

Визначення функції */

int square(int у)

{

return у * у;

}

 

1 4 9 16 25 36 49 64 81 100

5.3. Використання функції, визначеної програмістом

Кожна з приведених раніше програм складалася з функції з ім'ям main, яка для виконання свого завдання викликала функції стандартної бібліотеки. Тепер ми розглянемо, як програмісти пишуть свої власні спеціалізовані функції.

Розглянемо програму, яка використовує функцію square для обчислення квадрата цілих чисел від 1 до 10 (лістингу 5.3).

Функція square активується, або викликається в main усередині оператора printf :

printf("%d ", square (х));

Функція square отримує копію значення х в параметрі у. Потім square обчислює значення твору у*у. Результат передається назад функції printf в main, де була викликана square, і printf виводить результат. Цей процес повторюється десять разів в циклі for.

Визначення функції square показує, що square припускає передачу в параметрі у цілого значення. Ключове слово int, передування імені функції, показує, що square повертає результат цілого типу. Оператор return в square передає результат обчислень функції, яка викликала square.

Рядок програми

int square(int);

є прототипом функції. Ключове слово int в дужках інформує компілятор про те, що square припускає набути від зухвалої функції цілого значення. Слово int зліва від імені функції square інформує компілятор про те, що square повертає зухвалій функції результат цілого типу. Компілятор використовує прототип функції для перевірки того, що виклики square мають коректний тип повертаних даних, коректне число аргументів, коректний тип аргументів і що аргументи слідують в правильному порядку.

2. Напишіть і запустіть програму на виконання що написана нижче. Потім напишіть програму замінивши вводимі значення на свій номер варіанту по списку і номери двух ваших сусідів по робочому місцю.

Існує три способи повернення управління в ту точку програми, в якій була викликана функція.





sdamzavas.net - 2017 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...