МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
|||||||||||||||||||||||||||||||||||||||||
ОператорDo Case знач3 оператор3 Case знач2 оператор2 break; break; … default : оператор, який виконується за замовчуванням; } Треба вказати на те, що використання оператора break; є обов¢язковим, інакше будоть виконуватися всі оператори, які вказані. 1.6. Оператори циклів. Цикл „поки” while (логічний вираз виконання циклу) оператор; Цикл „до” { } while (логічний вираз виконання циклу); Цикл „для” for (вираз1; логічний вираз виконання циклу;вираз3) {оператор; } вираз1 відповідає початковим установкам вираз3 відповідає діям, що виконуються в циклі. Вираз1 та вираз3 можуть бути відсутні, але крапка з комою обов¢язкові. Вираз1 та вираз3 можуть складатися з декількох операторів, між ними ставлять кому. Як приклад розглянемо обчислення ітераційного виразу Ми раніше розглядали ітераційний цикл та його блк-схему. Напишемо декілька фрагментів програм на С. Цикл „поки” #include<stdio.h> #include<math.h> void main() { int i; float e,a,y,x; printf(“ввести значення х та е\n”); scanf(“%f%f”,&x,%e); i=1; y=0; a=1; while (abs(a)>e) {y=y+a; a*=x/i; i++; } printf(“\nрезультат%f”,y); }
Цикл „до” #include<stdio.h> #include<math.h> void main() { int i; float e,a,y,x; printf(“ввести значення х та е\n”); scanf(“%f%f”,&x,%e); i=1; y=0; a=1; do {y=y+a; a*=x/i; i++; } while (abs(a)>e); printf(“\nрезультат%f”,y); } Цикл „для” 1) варіант #include<stdio.h> #include<math.h> void main() { int i; float e,a,y,x; printf(“ввести значення х та е\n”); scanf(“%f%f”,&x,%e); i=2; y=1; a=x; for (;abs(a)>e;) {y=y+a; a*=x/i; i++; } printf(“\nрезультат%f”,y); } 2)варіант #include<stdio.h> #include<math.h> void main() { int i; float e,a,y,x; printf(“ввести значення х та е\n”); scanf(“%f%f”,&x,%e); for (i=2,y=1,a=x;abs(a)>e;) {y=y+a; a*=x/i; i++; } printf(“\nрезультат%f”,y); } 3)варіант #include<stdio.h> #include<math.h> void main() { int i; float e,a,y,x; printf(“ввести значення х та е\n”); scanf(“%f%f”,&x,%e); for (i=2,y=1,a=x;abs(a)>e;i++) {y=y+a; a*=x/i; } printf(“\nрезультат%f”,y); } 4)варіант #include<stdio.h> #include<math.h> void main() { int i; float e,a,y,x; printf(“ввести значення х та е\n”); scanf(“%f%f”,&x,%e); for (i=2,y=1,a=x;abs(a)>e;y=y+a,a*=x/I, i++) printf(“\nрезультат%f”,y); }
Лекція №3 Масиви у мові С. Динамічні величини у мові С. 1.1. Застосування масивів у мові С. Основна форма оголошення масиву розмірності N: тип <ім'я масиву> [розмір 1][розмір2] ...[ розмір3]. Розмір масиву можна задавати константою або константним виразом. Не можна задавати масив змінного розміру. Індекс завжди починається з нуля. int a[100];- масив містить 100 елементів від a[0] до a[99]. У С не перевіряється вихід індексу за межі масиву, як значення неіснуючого елемента буде видане деяке число, що займає відповідно стільки байт пам'яті, скільки займає базовий тип. Опис двовимірного масиву a[10][10]. Ініціалізація масивів: є спеціальні можливості: · у процесі оголошення масиву можна вказати у фігурних дужках список инициализаторов- float f[6]={1.1, 2.2, 3,5,6}; int a[3][2]= {1,2,3,4,5,6} (по рядках) або {{1,2},{3,4},{5,6}}; Кількість инициализаторов не зобов'язана збігатися з кількістю елементів масиву. Якщо инициализаторов менше, те елементи, що залишилися, не визначені. · можна використати оператори форматированного ведення й виведення. Алгоритмічно принципи роботи з масивами подібно до інших мов програмування, наприклад у мові Pascal. Розглянемо приклад роботи з одновимірним та двовимірним масивом. Задача 1. Заданий одновимірний масив цілих чисел. Знайти суму додатніх елементів. #include <stdio.h> void main () { int a[100], i, n,s; /* введення масиву*/ printf(“введіть n”); scanf(“%i”,&n); for (i=1;i<=n;i++) { scanf(“%i”,&a[i]);} /*знайдемо суму додатніх елементів*/ for (s=0,i=1;i<=n;i++) {s+=a[i];} /*виведення масиву та результату*/ printf(“\nвихідний масив\n”); for (i=1;i<=n;i++) { printf(“%i “,a[i]);} printf(“\ns=%i”,s); } Задача 2. Задана матриця дійсних чисел. Для кожного рядка знайти мінімальний елемент та їх суму. #include <stdio.h> void main () { float a[10][10], s, min; int i, j, m, n; /* введення масиву*/ printf(“введіть m, n”); scanf(“%i%i”, &m, &n); for (i=1;i<=m;i++) for (j=1;j<=n;j++) { scanf(“%f”,&a[i][j]);} /*виведення вихідного масиву по рядкам*/ printf(“\nвихідний масив”); for (i=1;i<=m;i++) { printf(“\n”); for (j=1;j<=n;j++) { printf(“%f “,a[i][j]);} } s=0; /*відкриваємо рядок*/ for (i=1;i<=m;i++) {/*знаходимо мінімальний елемент рядка*/ min=a[i][1]; for (j=1;j<=n;j++) {if (a[i][j]<min) {min=a[i][j]} } printf(“\ni=%i min=%f “, i, min); s+=min; } printf(“\ns=%f”,s”); }
1.2. Покажчики у мові С. У мові С використовуються покажчики. Для їх опису використовується роздільник „*”. int *a, *x; /*покажчики на цілі величини*/ float *f; /*покажчик на дійсну величину*/ Занесення величини за вказаними покажчиками: *a=5; *f=-3.56; Операція * має назву „разіменування” або „косвенной адресацией” Покажчик може посилатися на невизначену адресу NULL. Для її використання треба підключити файл заголовків <stdio.h> Операція & відповідає операції «взяти адресу». Операція * відповідає словам «значення, розташоване по зазначеній адресі». float x=10.1, y, *p,*g; p=&x; y=*p; g=p; Як і над іншими типами змінних, над покажчиками можна провадити арифметичні операції: додавання й віднімання. int *i; int x; printf(«%p%p»,i,++i) значення покажчика збільшилося не на 1, а на 2, тому що значення покажчика повинне вказувати не на наступну адресу пам'яті, а на адресу наступного цілого. А ціле займає 2 байти. До покажчиків можна додати деяке ціле або відняти. Можна відняти один покажчик з іншого. В такому випадку можна знайти різницю ( знаком) двох покажчиків одного типу та визначити „відстань” між розташеванням у пам¢яті двох величин. При цьому відстань обчислюється в одиницях, що кратні „довжині” окремого елементу даних одного типу. int *i, *k, j; i=&x[0]; k=&x[4]; j=k-i; В даному випадку j=4. Унарні операції * та & мають вищій пріорітет, ніж арифметичні операції. Але унарні операції *, ++, -- мають однаковий пріорітет Можна застосовувати операції порівняння покажчиків. Для покажчиків використовується формат %р. Їх значення можна виводити за допомогою оператора printf(). 1.3. Покажчики та масиви. У відповідності до синтаксиса мови С ім¢я масива без індексів є покажчиком-константою (адресою першого елементу з нульовим індексом). int p[10]; p1=p; p1=&p[0];- приведуть до одного й тому ж результату. Приклад інвертування символьного масиву. char x[80], s, *d, *h; for (d=z, h=&z[79]; d<h; d++, h--) {s=*d; *d=*h; *h=s; } Якщо додати до імені масиву цілу величину, отримуємо адресу відповідного елементу: p[5] *(p1+5). Аналогічно e[n][m][k] Þ*( e[n][m]+k)Þ*( *(e[n]+m)+k)Þ*(*(*(e+n)+m)+k). Перевага використання покажчиків полягає в тому, що арифметичні операції над покажчиками провадяться швидше над елементами, що йдуть підряд. Покажчики також можуть поєднуватися в інші структури, в тому числі і у масиви: int *hh[8]; 1.4. Функції для динамічних змінних. У файлах заголовків функцій alloc.h, stdlib.h оголошені для роботи з покажчиками такі функції:
Задача:ввести та надрукувати в оберненому порядку набір дійсних чисел, кількість яких задається з клавіатури: #include <stdio.h> #include <stdio.h> void main () { /*покажчик для блоку пам¢яті, що виділяється*/ float *t; int i,n; printf(“введіть кількість чисел”); scanf(“%i”,&n); t= (float *) malloc (n*sizeof(float)); printf(“введіть числа”); for (i=1;i<=n;i++) {scanf(“%f”,&t[i]);} /*виводимо на екран результат*/ for (i=n-1;i>=0;i--) {if (i%2==0) printf(“\n”); printf(“\tx[%d]]=%f”,I,t[i]); } /*вивільняємо пам¢ять*/ free(t); }
Лекція №4. Рядкові величини у мові С. У мові С нема окремого типу рядків. Символьний рядок – одновимірний масив типу char, який закінчується нульовим байтом (кожний біт якого доріднює нулю). Для нульового байта визначена символьна константа «\0». Це треба враховувати при описі відповідного масиву. Допускаються рядкові константи “AAAA”. В кінець рядкової константи компілятор автоматично виставляє нульовий байт. Для введення рядка існують дві можливості: · використати функцію scanf з спеціфікацією %s. Але в такма випадку виконується введення до першого пробілу. · Використати спеціальну бібліотечну функцію gets(). Введенння закінчується клавішою ENTER. Ці функції автоматично ставлять у кінець рядка нульовий байт. char s[80]; gets(s); Для виведення рядка використовують функції printf(), puts() puts(s); Набір функцій для рядкових змінних описаний у заголовочному файлі string.h, stdlib.h
Розглянемо приклад: У введеному рядку знайти і вивести на екран останнє слово. # include stdio.h # include string.h # include stlib.h void main() { char s[80],a[]; int I,k; char si,ss; gets(s); for (i=0,si=’ ‘,k=0;i<=79; i++) {ss=s; s=getchar(); if (s==’ ‘) continue; if (s==’ .‘) break; if (ss==’ ‘) k=0; a[k]=s; k++; } if (i==80|| k==0) printf(“нема\n”); else {a[k]=’\0’; puts(a); } } Використання функцій. В мові С в якості підалгоритму використовується функція. Всі функції мають единий формат визначення: Тип ім’я_функції(специфікації_параметрів) {тіло функції} Тип функції є типом значення, яке вертає функція в тіло програми, що її викликає. Якщо функція не вертає ніякого значення, тоді тип визначається як void. Специфікація параметрів може бути порожньою (якщо немає параметрів). Список параметрів функції закінчується комою з трьома крапками. Це означає, що є можливість звертатися до функції з більшою кількісттю фактичних параметрів, ніж вказано в спеціфікації параметрів. Така можливість повинна бути підкріплена спеціальними засобами в тілі функції. Тіло функції не може мати визначення іншої функції. В С функції не можуть бути вкладеними. В тілі функції є обов’язковий оператор return або return вираз Перший випадок відповідає завершенню функції, яка не вертає жодного значення (тип функції void). В другому випадку вираз повинен мати мати той тип, що вказаний в описі функції. Операторів return в тілі функції може бути декілька або не мати жодного. Якщо оператора return немає, то компілятор автоматично проставляє його перед заключними дужками. Приклад float min(float a, float b) { if (a<b) return a; else return b; }
В програмі С не встановлений жорсткий порядок розташування визначень функцій. Вони можуть передувати програмі, що її викликає, а може розташовуватися після неї. Але в осьанньому випадку необхідно обв’язково заявити компілятору про наявність такої функції у вигляді прототипу функції. Прототип функції складається з заголовку функції, після якого ставиться крапка з комою Тип ім’я_функції(специфікації_параметрів); При цьому в специфікаціях параметрів можна не вказувати імена параметрів, тільки тип. Так для приведеного прикладу можна вказати такі прототипи: float min(float a, float b); або float min(float, float); Виклик функції виконується як звичайний виклик в операторі з вказівкою параметрів, наприклад для функції min виклик в програмі printf(“%f”,min(x,y)); Між формальними та фактичними параметрами повинно бути відповідність за типами. Якщо є невідповідність за типами, компілятор автоматично добавляє команди перетворення типів, якщо це можливо. У випадку, коли функція не вертає ніякого значення, то функція викликається як окремий оператор. Наприклад: void p1(int a,int b) {int c; c=a+b; printf(“%f”,c); } void main() {int x,y; … p1(x,y); … } Ще один приклад - : #include <stdio.h> void r_time(void) { printf(“\n поточний час:%s”, time); } void main() { … r_time(); … } В результаті виконання програми на екран буде виведено поточний час: поточний час 15:27:45 При розглянутому описі параметрів працює механізм передачі параметрів як параметри-значення. В цьому випадку значення фактичних параметрів передаються функції як копії, та після зміни їх значення не змінюються в області дії основної програми. Якщо треба змінити значення фактичних параметрів для основної програми, використовують механізм доступа до адреси фактичного параметра. Тому для цього як формальні параметри передають покажчики на них. Наприклад, функція видає додатні значення фактичного параметру: #include <stdio.h> void pozitiv(int *m) { *m=m>0?*m:-*m; } void main() { int k=-3; pozitiv(&k); printf(“\nk=%d”,k); } Одним з прикладом таких функцій є функція scanf(). В якості параметрів функції можна використовувати масиви. Для цього треба передати адресу початку масиву. Наприклад, розглянемо функцію, яка обчислює скалярний добуток векторів: #include <stdio.h> void quart(int n, float *x) {int I; for (i=0;i<n;i++) *(x+i)*=*(x+i); } void main() { float z[]={1.0,2.0,3.0,4.0}; int j; for (j=0;j<4;j++) printf(“\n5.1f”,z[j]); } Читайте також:
|
||||||||||||||||||||||||||||||||||||||||||
|