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

M_CI_1

.pdf
Скачиваний:
10
Добавлен:
12.05.2015
Размер:
761.95 Кб
Скачать

МIНIСТЕРСТВО ОСВIТИ УКРАЇНИ

НАЦIОНАЛЬНИЙ ТЕХНIЧНИЙ УНIВЕРСИТЕТ УКРАЇНИ

"КИЇВСЬКИЙ ПОЛIТЕХНIЧНИЙ IНСТИТУТ"

МЕТОДИЧНI ВКАЗIВКИ до вивчення курсу

"ІНФОРМАТИКА"

розділу

" Основи програмування мовою Сi "

для студентiв спецiальностi

"Металорiзальнi верстати та системи"

всiх форм навчання

Частина І

"Типи даних. Операції та оператори. Функції"

Затверджено

на засiданнi кафедри

"Конструювання верстатiв та машин"

Протокол №_2__ вiд _8 жовтня__1997 р.

Київ НТУУ "КПI" 1997

Методичнi вказiвки до вивчення курсу "Інформатика" по роздiлу "Основи програмування на Сі" для студентiв спецiальностi "Металорiзальнi верстати та системи" всiх форм навчання / Укл. В.М. Гейчук, О.В.Даниленко. - К.: НТУУ "КПI", 1997.- с.97.

Укладачі: Гейчук Володимир Миколайович , канд. техн. наук, Даниленко Олександр Васильович, канд. техн. наук;

Вiдповiдальний редактор В.Б.Струтинський, докт. техн. наук.

Рецензенти: В.А.Пасічник, канд. техн. наук; О.М. Кравець, провідний інженер НЛОТ ММФ.

У поданих методичних вказiвках запропоновано цикл лабораторних робiт для вивчення основ програмування мовою Сі по курсу "Інформатика".

Кожна лабораторна робота мiстить теоретичнi вiдомостi, якi необхiднi для засвоєння матерiалу курсу та приклади у вигляді програм та фрагментів. Запропонованi завдання виконуються бригадою студентiв у складi 1-2 осiб. Номер завдання повинен вiдповiдати номеру бригади. Захист лабораторної роботи здiйснюється кожним членом бригади особисто. Звiт з лабораторних робiт повинен складатися з титульного листа (один на всi роботи); завдання до лабораторної роботи; алгоритму вирiшення задачi (починаючи з лабораторної роботи № 4); висновкiв по роботi; файла з вихiдним текстом завдання та програми на особистiй дискеті. При здачi лабораторних робiт кожен студент повинен знати вiдповiдi на контрольнi запитання.

До кожної лабораторної роботи наведенi приклади програм. Програми повиннi оформлюватись охайно i з вiдповiдними коментарями до основних блокiв програми. Вiдповiдальнiсть за збереження програм на особистiй дискетi несе бригада студентiв.

Результати лабораторних робіт оформляються протоколом у відповідності до вимог, приведених у додатку А.

2

Лабораторна робота № 1.

(2 години)

Лексичні структури мови Сі.

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

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

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

1.1. Коментарі.

Коментарі потрібні для документування тексту програми і складаються із символів "/*" на початку коментара, та символів "*/" в кінці коментара (дивіться приклад 1.1). Коментарі можуть мати будь-яку кількість символів. В ANCI вкладені коментарі не допускаються.

1.2. Ідентифікатори.

Ідентифікатори служать для іменування типів, змінних та функцій.

Ідентифікатори складаються із букв та цифр і можуть мати символи “підкреслення”. Розрізняються тільки перші 32 символи. Ідентифікатори не можуть починатися з цифр і не можуть співпадати з зарезервованими словами. Звичайно символи підкреслення використовуються для полегшення читання ідентифікаторів, наприклад: Vectorsum і Vector_Sum. В ідентифікаторах Сі великі і малі букви розрізняються. Наприклад, Vector_sum і Vector_Sum це різні імена. Звичайно використовуються тільки малі букви. Великі букви використовуються для позначення констант та міток. Наприклад, імена стандартних функцій в мові Сі пишуться тільки малими буквами. І свої функції потрібно писати відповідно до цих домовленостей (але це не правила).

1.3. Зарезервовані слова.

Нижче приведені слова не можна використовувати в якості ідентифікаторів - це так звані ключові або зарезервовані слова. Вони позначають оператори мови Сі, класи пам`яті, тощо. При використанні зарезервованих слів, їх потрібно записувати точно так, як вони записані:

Ключові слова ANCI Сi

asm

default

for

short

union

auto

do

goto

signed

unsigned

break

double

if

sizeof

void

case

else

int

static

volatile

char

enum

long

struct

while

const

extern

register

switch

 

continue

float

return

typedef

 

 

 

 

 

 

В Boland C++ цей список розширений. Там приведено слова з символами підкреслення одним або двома на початку і в кінці слова (дивіться [1]).

Замітка:

Слова з двома символами підкреслення зарезервовані для системних потреб. Тому їх краще не використовувати для уникнення конфліктів.

3

1.4.Константи.

Єчотири типи констант: цілі, дійсні (з плаваючою комою), символьні і рядкові.

1.4.1.Константи цілого типу.

Константи цілого типу можуть задаватися в десятковій, вісімковій або шіснадцятковій системах числення.

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

Вісімкові константи завжди починаються з цифри нуль, слідом за якою нема ні одної цифри, або стоять кілька цифр від нуля до семи.

Шіснадцяткові константи завжди починаються з цифри нуль і символу х або Х. Слідом за якими може стояти одна або більше шіснадцяткових цифр.

Шіснадцяткові цифри це десяткові цифри від 0 до 9 і латинські букви A B C D E F або a b c d e f (які замінюють собою цифри 10, 11, 12, 13, 14 і 15 відповідно).

Приклад 1.1.

1:#include <stdio.h>

2:main ()

3:{

4:int a=3478,

5:b=06626,

6:c=0xD96;

7:printf (”a=%d b=%d c=%d\n”, a, b, c);

8:}

Програма виведе на екран: a=3478 b=3478 c=3478

Примітка!

В прикладі 1.1. і далі номери рядків ставляться для зручності пояснень текстів програм. В текстах програм, які підлягають компіляції їх не повинно бути.

1.4.2. Дійсні константи.

Константи з плаваючою комою (дійсні) складаються із цифр, десяткової крапки і знаків десяткового порядку е або Е. Приклади:

1.

2е2

.1234

.1

2Е3

1.234

1.0

2е-1

2.1е-12

1.4.3. Символьні константи.

Символьні константи розміщуються в апострофах, наприклад: 'A'. Всі символьні константи в Сі мають значення типу int (цілий), яке співпадає з кодом символу в коді ASCII. Не всі компілятори використовують систему кодування ASCII для завдання відповідності між символом та цілими числами. Тому для підвищення мобільності користуються, там, де це можливо, для завдання символьних констант символьними літералами. Наприклад, if (ch >= a&& ch <=z) можна записати як if (ch >= 97 && ch <= 122). Керуючі символи не можуть бути задані як звичайні символи. Вони задаються як ESC послідовності (дивіться таблицю 1.1).

Таблиця 1.1. Управляючі символи

Символ

Значення

 

 

1

2

\n

Новий рядок

\t

Горизонтальна табуляція

\v

Вертикальна табуляція

 

 

4

 

 

Продовження таблиці 1.1.

Символ

 

Значення

 

 

 

1

 

2

 

 

\b

 

Повернення на символ

\r

 

Повернення на початок рядка (повернення каретки)

\f

 

Прогін паперу до кінця сторінки

\\

 

Зворотній слеш

\’

 

Апостроф

\”

 

Лапки

\a

 

Звуковий сигнал

\?

 

Знак питання

\ddd

 

Код символу в ASCII від однієї до трьох вісімкових цифр

\xhhh

 

Код символу в ASCII від однієї до трьох шіснадцяткових цифр

 

 

 

Для роботи з текстами передбачена константа EOF , яка дорівнює -1. Приклад програми:

Приклад 1.2.

1:#include <stdio.h>

2:#include <ctype.h>

4:main()

5:{

6:char ch = getchar();

7:int number_lines = 1;

8:int number_vowels = 1;

9:ch = tolower(ch);

10:if(ch==’a’ || ch==’e’ || ch == ’i’ || ch ==’o’ || ch ==’u’)

11:number_vowels++;

12:while (ch!=EOF)

13:{

14:

ch=getchar();

15:

if (ch==’\n’)

16:

number_lines ++;

17:

ch=tolower(ch);

18:

if (ch==’a’ || ch==’e’ || ch == ’i’ || ch ==’o’ || ch ==’u’)

19:

number_vowels++;

20:}

21:printf (“\nКоличество строк в тексте = %d”, number_lines);

22:printf (“\nКоличество гласных в тексте = %d”, number_vowels);

23:}

1.4.4. Рядкові константи.

Рядкові константи складаються із нуля або більше символів, які замкнено в лапки, наприклад, "Привіт". В рядкових константах управляючі коди задаються за допомогою ESC послідовностей. Дозволяється використовувати рядкові константи, розміщені в кількох рядках. Обернений слеш “\” використовується для поєднання в одну константу кількох рядків.

Більш детально до рядкових констант ми звернемося, коли будемо розглядати масиви (дивіться лабораторну роботу № 4). Приклад використання рядкових констант:

Приклад 1.3.

5

1:#include <stdio.h>

2:main()

3:{

4:char *str_1; *str_2, *str_3;

5:str_1 = ” Цей текст не буде перенесено на \

6:наступний рядок.\n\n”;

7:str_2 = ”А цей рядок буде розбито \n”

8:“більш короткі рядочки\n\n”;

9:str_3 = ”\07Дзвінок!”;

10:printf (str_1);

11:printf (str_2);

12:printf (str_3);

13:}

Рядкові константи мають довжину на один байт більшу, ніж кількість символів у ній. Останнє місце займає `\0`.

Якщо вам потрібно використати в рядкових константах “\”, то потрібно поставити підряд два “\\”. Наприклад, при вказуванні повного імені файлу “c:\\borlandc\\test\\funy.c”

Виключенням із цього правила є повні імена файлів в директивах #include:

#include ”c:\anydir\anyfile.h”

1.5. Змінні. Типи даних.

На рис. 1.1. приведено класифікацію типів даних, які існують в мові Сі. В таблиці 1.2. приведено основні типи даних.

 

 

 

Типи даних в Сі

 

 

 

 

 

 

 

 

 

 

 

 

Скалярні типи

 

Тип void

 

Функції

 

Агрегатні типи

 

 

 

 

 

 

 

 

 

Покажчик Арифметичний Перераховуючий Масив Структура Об`єднання

 

Дійсний

 

Цілий

 

 

 

 

 

 

Рис. 1.1 Класифікація типів даних в Сі

 

 

 

 

 

 

 

 

 

Таблиця 1.2. Типи даних в Сі та їх пріоритети

Тип

 

Розмір в байтах

Діапазон значень

1

2

3

 

 

-128…127

char

1

unsigned char

1

0…255

int

2

-32768…32767

unsigned

2

0…65535

short

1

-32768…32767

unsigned short

2

0…65535

long

4

-2147483648…2147483647

unsigned long

4

0…4294967295

float

4

3.4E-38…3.4E38

double

8

1.7E-308…1.7E308

long double

8 (в Borland C++4.5 – 10)

1.7E-308…1.7E308

pointer

2

(near, _cs, _ds, _es, _ss)

pointer

2

(far, huge)

Р і с т п р і о р и т е т у

6

1.5.1. Використання об`єктів різних типів.

Змінні перед їх використанням повинні бути описані. При їх описі (або) потрібно враховувати видимість (тобто доступність для використання) описаного об`єкту з інших блоків програми і зовнішніх програмних модулів (дивіться розділи 6.4.1 та 6.4.2). Оголошення змінної має такий загальний вигляд:

оператор_опису_типу ім’я_змінної;

оператор_опису_типу – на цьому місці може бути будь-який оператор із першої колонки таблиці 1.2.

ім’я_змінної – ім’я, яким ви хочете назвати змінну.

Оголошення змінної у вашій програмі призначене для того, щоб компілятор виділив необхідну кількість пам’яті для вашої змінної.

Початкове значення змінній може присвоюватись тут же, або пізніше. Це початкове значення може бути простою константою, значенням, яке вже присвоєно іншій змінній або значенням, яке є результатом обчислення виразу (про вирази дивіться розділ 3).

Процес присвоєння змінній першого (початкового) значення називається ініціалізацією:

ім’я_змінної = значення;

Одночасні (в одному операторі) оголошення та ініціалізація змінної називається

визначенням:

оператор_опису_типу ім’я_змінної = значення;

Використовуючи специфікатор typedef, можна визначити свої типи даних за таким загальним правилом:

typedef оператор_опису_типу нове_ім’я_типу;

Приклади дивіться далі.

1.5.2.Змінні цілого типу.

Вмові Сі є кілька різновидів цілочислових даних. До них відносяться типи із таблиці 1.2

зchar до unsigned long. Цілі char та unsigned char зберігаються в пам’яті в двійковому форматі так, як показано на рис. 1.2.

Розряд 7

6

5

4

3

2

1

0

 

Цілі, які займають два

- байт

байти (один з яких має

 

0

0

0

0

0

1

1

1

більші розряди – старший, а

 

 

 

 

 

 

2

 

2

2

 

1

2

 

0

 

другий, який має менші

 

 

 

 

 

 

 

 

 

 

розряди, - молодший)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=7 – ціле

зберігаються в пам’яті в

 

 

 

 

 

 

 

4 + 2 + 1

зворотному

порядку –

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

число

спочатку молодший байт , а

Рис. 1.2 Формат цілих чисел в оперативній пам’яті

потім – старший.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Цілі,

які займають

чотири байти (два слова, або подвійне слово) зберігаються таким чином: молодше слово, а потім старше слово.

Приклади оголошення, визначення та ініціалізації змінних цілого типу приведено далі: int age = 15, /* Визначення */

height = 70; /* Визначення */

unsigned weight = 2 * height; /* Визначення */ long index; /* Оголошення */

index = 102456; /* Ініціалізація */

Приклад визначення нового типу:

typedef unsigned int CARDINAL; /* Визначення нового типу CARDINAL */

CARDINAL my_number;/* Оголошення змінної my_number типу CARDINAL */

7

 

1.5.2.1. Допустимі операції над цілими змінними.

 

Таблиця 1.3. Операції над цілими

Знак операції

Значення

 

 

1

2

 

 

 

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

 

 

+

Унарний плюс, додавання

Унарний мінус, віднімання

*

Множення

/

Ділення

%

Залишок від ділення

х=

Змінити і замінити, де х може бути +,,*,/ або %

++

Інкремент (збільшення на 1)

−−

Декремент (зменшення на 1)

 

 

 

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

 

 

&&

І

 

 

||

АБО

!

НЕ

==

Дорівнює

!=

Не дорівнює

>

Більше

>=

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

<

Менше

<=

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

 

 

 

Бітові операції

 

 

&

І (and)

|

АБО (or)

^

Заперечення еквівалентності

~

Заперечення

>>

Зміщення вправо

<<

Зміщення вліво

x=

Змінити або замінити, де x може бути &, |, ^, >>, або <<.

 

 

1.6. Символьні змінні.

Змінні типу char є найменшими по розміру об`єктами, які можна описати, і займають 1 байт. Приклад опису символьних змінних і присвоєння їм початкових значень наведено нижче:

char ch = ’$’, ans = ’n’,

response = ’2’, ascii_value = 65, answer;

У виразах змінні типу char можуть змішуватись зі змінними типу int. Цілком коректно буде додати, наприклад, 3 і `а`.

Приклад 1.4:

1: #include <stdio.h>

2:

3:main ()

4:{

5:char ch = ’a’;

6:char ans;

7:printf(”Значення ch +3 = %c”, ch + 3);

8:ans = ch % 3;

8

9:printf(”\n\nЗначення ans = %d\n”, ans);

10:}

До типу char можна застосовувати всі операції, які застосовуються до змінних типу int.

Приклад 1.5:

1: #include <stdio.h>

2:

3:main ()

4:{

5:char c;

6:printf(”Enter character:”);

7:c = getchar();

8:printf(”Character = %c\n”,c);

9:printf(”ASCII (dec) = %d\n”,c);

10:printf(”ASCII (hex) = %#x\n”,c);

11:return 0;

12:}

1.7. Рядкові змінні.

Щоб створити рядкову змінну, потрібно додати до опису типу char максимальну довжину рядка, розміщену в квадратних дужках:

char ім`я_рядка[довжина_рядка_в_символах]

Наприклад:

char string_1[80];

Довжина рядка складає 80 символів, в тому числі заключний нуль. Щоб прочитати рядок символів з клавіатури, потрібно використати стандартну функцію scanf() (більш докладно дивіться в розділі 2):

scanf(”%80s”,string_1);

Вивести результати на екран можна за допомогою команди printf() (більш докладно дивіться в розділі 2):

printf(”Ви ввели %s”, string_1);

Функція scanf() завершує введення при зустрічі пропуску, символу табуляції або натисканні клавіші <Enter>.

Для того, щоб прочитати рядок, який вміщує довільну кількість пропусків можна використати функцію gets():

printf(”Введіть рядок :”); gets(string_1);

Ця функція не контролює переповнення рядка. Якщо оголосити рядок довжиною 128 символів, то ви не зможете ввести більше 128 символів, оскільки розмір внутрішнього буферу MS DOS не перевищує 128 символів.

Примітка!

Цей метод може не спрацювати в інших операційних системах, де є можливість змінювати розмір буфера введення.

1.7.1. Перетворення рядків в число.

Символьні рядки зручні для запам`ятовування значень, які введено з клавіатури. Якщо це числові значення, то їх потрібно перетворювати в цілі значення або в значення з плаваючою точкою. Для цього потрібно використовувати функції atof(), atoi(), та atol():

atof() використовується для перетворення рядка ASCII в значення з плаваючою точкою типу double;

atoi() використовується для перетворення рядка ASCII в ціле значення типу int;

9

atol()використовується для перетворення рядка ASCII в ціле значення типу long int.

Приклад 1.6:

1:#include <stdio.h>

2:#include <stdlib.h>

4:main()

5:{

6:int value;

7:char ctring_1[128];

9:printf(”Введіть значення: ”);

10:gets(string_1);

11:value = atoi (string_1);

12:printf(”Значення в десятковій системі = %d\n”, value);

13:printf(”Значення в шістнадцятковій системі = %#x\n”, value);

14:printf(”Значення в вісімковій системі = %o\n”, value);

15:return 0;

16:}

1.8.Змінні дійсного типу.

ВСі існує три типи даних з плаваючою точкою: float, double та long double. В табл. 1.4 приведено розміри пам`яті та діапазони значень для цих типів:

 

 

 

Таблиця 1.4. Розмір змінних дійсного типу

Тип даних

Розмір в

Розмір в бітах

 

Мінімальне

 

Максимальне

 

байтах

 

 

значення

 

значення

float

4

32

 

3.4Е-38

 

3.4Е+38

double

8

64

 

1.7Е-308

 

1.7Е+308

long double

10

80

 

3.4Е-4932

 

1.1Е+4932

Змінні дійсного типу зберігаються в оперативній пам’яті у вигляді, показаному на рис. 1.3.

00

1001

11

11001101

Знак

 

Знак

 

порядку

Порядок

мантиси

Мантиса

Рис. 1.3 Формат дійсних чисел в оперативній пам’яті

Примітка!

Для того щоб точно узнати деталі представлення чисел з плаваючою точкою, потрібно звернутися до файлу FLOAT.Н.

Наприклад, в Borland C++ є такий фрагмент:

#define DBL_MIN

2.2250738585072014E-308

#define FLT_MIN

1.17549435E-38F

...

+1024

#define DBL_MAX_EXP

#define DBL_MAX_10_EXP

+308

Для того, щоб описати змінну pi типу float потрібно записати: float pi;

Можна використати тип double: double pi;

Ініціювати змінну можна використавши присвоєння цій змінній літеральної константи: double pi = 3.1457;

Або можна використати оператор присвоєння: pi = 3.1457;

Константи з плаваючою точкою, мають тип double, якщо за ними не стоять букви f або

10

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]