Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Оператор

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 оголошені для роботи з покажчиками такі функції:

Функції Прототип та опис
malloc void *malloc(unsigned s); Вертає покажчик на початок області (блока) динамічної пам¢яті довжиною в s байт. При невдалому завершенні вертає значення NULL.
calloc void *calloc(unsigned n, unsigned m); Вертає покажчик на початок області (блока) динамічної пам¢яті, яка приведена до нуля для розміщення n елементів по m байт кожний. При невдалому завершенні вертає значення NULL.
realloc void *realloc(void *bl, unsigned m); Змінює розмір блока динамічної пам¢яті до розміра m. bl – адреса початку пам¢яті, що змінюється. Якщо bl дорівнює NULL, то функція виконується як malloc.
free Void *free(void *bl); Вивільняє ділянку пам¢яті, яка раніше була виділена, адреса першого байту якої дорівнює значенню bl.

 

Задача:ввести та надрукувати в оберненому порядку набір дійсних чисел, кількість яких задається з клавіатури:

#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

Прототип функції Опис функції
int getch(void); Зчитує один символ з клавіатури без відображення на екрані
int getchar(void); Зчитує один символ з клавіатури
char *gets(car *s); Зчитує рядок
int putchar(int c); Виводить на екран один символ
int puts(const char *s); Виводить на екран рядок
char *strchr(const char *str, int c); Пошук у рядку перше входження символу c
char *strcpy(char *sp, const char *si); Виконує копіювання байтів першого рядка в другий
char *strdup(const char *str); Виділяє пам¢ять та переносить в неї копію рядка
usigned strlen(const char *str); Обчислює довжину рядка
char *strpbrk(const char *str1, const char *str2); Шукає в рядку str1 перше входження будь-якого з множини символів, які є в рядку str2
char *strrchr(const char *str, int c); Пошук останнього входження символа с в рядок

Розглянемо приклад: У введеному рядку знайти і вивести на екран останнє слово.

# 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]);

}


Читайте також:

  1. Арифметичні оператори
  2. Арифметичні цикли. Оператор циклу For – Next
  3. Базовий синтаксис деяких основних операторів
  4. Використання оператора throw
  5. Загальні вимоги до робочого місця оператора ЕОМ
  6. Запис SQL-операторів
  7. Заява про видачу ліцензії на бланку встановленої форми (згідно з додатком 1 до пункту 1.2.4 Ліцензійних умов провадження туроператорської та турагентської діяльності (додаток 1).
  8. Лінійний оператор та його матриця
  9. Логічні оператори
  10. Людиною-оператором
  11. Оператор DROP




Переглядів: 972

<== попередня сторінка | наступна сторінка ==>
Оператор if | Нажатия для пассажирского поезда.

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.029 сек.