Поиск

Полнотекстовый поиск:
Где искать:
везде
только в названии
только в тексте
Выводить:
описание
слова в тексте
только заголовок

Рекомендуем ознакомиться

'Документ'
В настоящее время очень распространены утилиты позволяющие проверять ПК на вирусы. Например утилита DISINFECT разработанная в Эстонии. Она позволяет о...полностью>>
'Документ'
Россия выбрала устойчивый курс на преодоление закрытости в экономике, на интеграцию с мировым экономическим пространством, на сотрудничество с развиты...полностью>>
'Классный час'
Стимулировать учащихся к размышлению об отличительных особенностях образованного человека, а также об условиях, необходимых для того, чтобы стать обр...полностью>>
'Закон'
Проект Закона Республики Беларусь «О внесении изменений и дополнений в Банковский кодекс Республики Беларусь». Доработанный с учетом предложений и зам...полностью>>

Проста програма, написана, з врахуванням вимог стандарту iso/ansi c, повинна мати наступний формат: #include

Главная > Документ
Сохрани ссылку в одной из сетей:

Програмування мовою С

  1. Структура програми написаної мовою програмування СІ.

Прокоментувати програму та вказати результат.

Програма на С складається із сукупності фуекцій, одна з яких повинна називатись main(). Описані функції складаються з із заголовку і тіла функції. Заголовок містить оператори (директиви) передпроцесора, наприклад, #include та і’мя функції. Ім’я пізнається по круглим дужкам, які можуть бути порожніми. Тіло функції береться у фігурні дужки і складається із ряду операторів, кожний з яких закінчується крапкою з комою (мал. 1).

Проста програма, написана, з врахуванням вимог стандарту ISO/ANSI C, повинна мати наступний формат:

#include <stdio.h>

int main(void)

{

оператори

return 0;

}

Мал. 1. Структура програми

  1. Поняття СІ-машини. Сутність передпроцесора. Макровизначення

та макрофункції. Прокоментувати програму та вказати результат.

Сі-Машина

Сі- машину можна зобразити так:

Передпроцесор

  Передпроцесор є першим кроком в побудові вихідного коду Сі-програми на стадії компіляції – це унікальна частина компіляторів мови Сі.

До певної міри перед передпроцесор має свою власну мову, яка є потужним засобом програмування. Памятай, що всі директиви (інструкції) передпроцесора починаються з символа #.

Використання передпроцесора надає програмісту такі переваги:

  • Полекшена розробка програмного забезпечення,

  • Код легко читається,

  • Код легко модифікувати

  • Сі-код лекше портувати на інші машини (архітектури).

Передпроцесор також дозволяє нам модифікувати мову. Наприклад, замінити блок { ... } на такий як у мові PASCAL, тобто begin... end . Це робиться так:

    #define begin {

#define end }

Під час компіляції всі всі входження begin та end будуть замінені відповідними позначеннями { або } і тому інші частини компілятора небудуть знати про цю підміну.

#define

define використовується для оголошення констант чи макровизначень. Наприклад:

    #define <macro> <replacement name>

 

 

#define FALSE 0

#define TRUE !FALSE

Також можна записувати невеликі функції використовуючи #define. Наприклад:

   #define max(A,B) ( (A) > (B) ? (A):(B))

Це означає, що де би непоставити рядок max(C,D) цей текст буде замінено таким рядком як оголошено зверху. Отхе, якщо в коді написати щось таке:

   x = max(q+r,s+t);

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

   x = ( (q+r) > (r+s) ? (q+r) : (s+t));

Ще один приклад #define:

#define Deg_to_Rad(X) (X*M_PI/180.0)

/* перетворення градусів в радіани */

 

#define LEFT_SHIFT_8 <<8

#undef

Ця команда відміняє макровизначення. Для перепризначення макровизначення його необхідно спочатку відмінити.

#include

Ця директива включає додаткові файли в код. У неї є 2 форми:

#include <file> або #include ``file''

<file> вказує компілятору де знаходяться системні файли, а також назву цих файлів. UNIX-системи зберігають файли у директоріїusrinclude.

``file'' виконує те саме, що і вищеописаний, але використовується для модулів написаних вручну (так прийнято для підвищення читабельності коду).

#if

#if оголошує цілочисельну константу. Воно обовязково завершується дируктивою #endif.

Можна також встановити команду else. Ще одним прикладом використання #if є:

#ifdef

-- if defined and

#ifndef

-- if not defined

Це зручно використовувати для перевірки результатів макровизначень.

Наприклад, для встановлення розміру integer для портування програми з TurboC (MSDOS) на Unix (чи іншу архітектуру) . Нагадаю, що TurboC використовує 16 біт/integer ,а UNIX 32 біти/integer.

Це виконується так:

  #ifdef TURBOC

  #define INT_SIZE 16

#else

#define INT_SIZE 32

#endif

Ще один приклад:

  #if SYSTEM == MSDOS

  #include <msdos.h>

#else

#include ``default.h''

#endif

#error

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

  #ifdef OS_MSDOS

  #include <msdos.h>

#elifdef OS_UNIX

#include ``default.h''

#else

#error Wrong OS!!

#endif

  1. Характеристика типів даних мови програмування СІ.

Перетворення типів даних. Прокоментувати програму та вказати результат.

Типи даних визначають діапазон допустимих значень та набір допустимих операцій.

В мові СІ є стандартний набір типів даних.

Цілочисельні: char, int, short, long, signed,unsigned, const, volatile.

Дійсні: float, double, long double.

Перелічення enum.

Для задання вказівників та масивів ключових слів немає.

Структури (struct) – це комбінований тип, це об'єкт в середині якого можна описати поля різних типів.

Об'єднання (union) – це об'єкт, який дозволяє в різні моменти часу зберігати дані різних типів.

Тип

Розмір 16 (32)

Діапазон

char

1

-128..127

unsigned char

1

0..256

short [int]

2

-215 .. 215-1

unsigned short

2

0 .. 216-1

int

2(4)

-215 .. 215-1

unsigned [int]

2(4)

0 .. 216-1

long [int]

4(4)

-231 .. 231-1

unsigned long

4(4)

0 .. 232-1

Згідно формату IEEE усі від'ємні дані зберігаються в пам'яті комп'ютера у доповняльному коді.

Для цілочисельних даних допустимі усі операції.

Тип

Розмір

Діапазон

P

M

float

4

3.4e-38 .. 3.4e+38

8

23

double

8

1.7e-308 .. 1.7e+308

11

52

long double

10

3.4e-4932 .. 3.4e+4932

15

64

Для задання порядку виконистовується спосіб вирівнювання на середину діапазону: float -127, double – 1023, long double – 16383.

У форматах float та double старша одиниця в мантисі не зберігається.

Перетворення типів даних

  1. розширення

char -> int -> long 8->16->32

Для знакових розширення відбувається шляхом розмноження знакового розряду в старших байтах. Для беззнакових старші розряди заповнюються "0".

  1. Зменшення

long -> int -> char 32->16->8

Перетворення відбувається шляхом відкидання старших байт.

3.

short -> int 16 -> 16

int -> unsigned 16 -> 16

long -> unsigned long 32 -> 32

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

4. Цілі -> Дійсні

Перетворення цілих в дійсні відбувається через тип long.

Перетворення коректне, якщо діапазон дозволяє.

5. Дійсні -> Дійсні

З менших в більші перетворення однозначні. Перетворення з більших в менші відбувається шляхом заокруглення.

6. Дійсні -> Цілі

Перетворення відбувається через тип long. Перетворення відбувається шляхом відкидання дробової частини.

  1. Поняття покажчика в мові програмування СІ. Покажчики та

масиви. Адресна арифметика. Прокоментувати програму та вказати результат.

Мова програмування С відзначається своєю гнучкістю серед інших мов. Це, зокрема, добре видно при роботі із вказівниками. Вказівник – це змінна, що містить адресу певного об’єкту (не плутати з ООП).

специфікатор тип * ідентифікатор[=конст,&змінна],[,…];

Приклад:

int *my_pointer;

int *my_pointer=5;

int *my_pointer=&x;

Вказівник займає 2,4 або 6 байт. У реальному режимі вказівник займає 2 або 4 байти. 2 байти для near (перехід в одному сегменті), 4 для far та huge(нормалізований вказівник) для міжсегментного переходу. В захищеному режимі вказівник займає 6 байт.

Над вказівниками можна виконувати ряд цілочисельних операцій та порівнянь. Дві основні операції – це отримання адреси (&) та звертання за адресою (*). Перед використанням вказівники слід ініціалізувати. Стандарт ANSI C дозволяє використовувати нетиповані вказівники:

void *my_pointer;

Вказівники та масиви тісно повязані між собою. Назва масиву є адресою першого елемента:

my_array==&my_array[0];

В мові С не контролюється вихід за межі масиву.

При використанні вказівників для роботи із масивами слід мати на увазі,що додавання 1 до вказівника, перемістить його на наступний елемент, незалежно скільки байт займає цей елемент. Різниця вказівників дає результат,що рівний кількості елементів (лише для вказівників однакового типу). Доступ до елементів масиву можна здійснювати як за допомогою вказівників

k=*(my_array+5);

так і за допомогою класичного запису:

k=my_array[5];

Записи k=my_array[5] та k=5[my_array] рівнозначні

k=*(my_array+5) k=*(5+my_array)

оскільки від перестановки доданків сума не міняється.

  1. Операції мови програмування СІ та їх пріоритет. Порядок

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

Порядок обчислення виразів.

= a=b=c=0; ←

+ -/ % *

/-для цілих – буде тільки ціла частина

%- виключно для цілочисельних даних – залишок від ділення

Інкрементні, декрементні ++,-- цілочисельні, одномісні і застосовуються до операторів в памяті

а++; --в;

Префіксна операція передбачає спершу зміну обєкту, а пізніше участь нового значення в обрахунку решти виразу

Постфіксна передбачає участь старого значення обєкту в обрахунку виразу, а пізніше його зміну

a=++b+2; (b=b+1; a=b+2;)

a=b++ 2; (a=b+2; b=b+1;)

6. Операції відношень – двомісні

7. Результатомоперацій відношення буде ціле число: істина -1, хиба -0

c=2>3; c==0; c=(2<3)+3;

11. 12. Логічні

!-НЕ &&-І ||-АБО

В лог операція любе ціле (в тому числі і відємне) сприймається як істина, 0 сприймається як хиба

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

i<5 && c++!=2

Бітові – порозрядні

~ інверсія & конюнкція ↑ додав за мод 2 | дизюнкція << >> зсуви вліво, вправо

Операнд справа зсувається на задану кількість біт, що задає операнд справа

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

При зсуві вліво розмножується знак

Int b=-16;

Int a; a=b<<2; (a=-64)

Адресні

& -отримати адресу

*-звернутись за адресою для запису або читання

Int a,*b; b=&a;

(тип)-приведення до типу

Int a; a=1.6+1.5; (3.1)

a=(int)1.6+(int)1.5; (2)

sizeof(вираз) – результатом є цілочисельне значення, яке рівне кількості байт памяті для розміщення вказаного обєкту в памяті

sizeof(a)==2; sizeof(int)==2;

Складні перетворення

14. a=a+b; a+=b; x=x+(y-2); x+=y-2;

Умовна операція

вир1?вир2:вир3

вир2 при істині вир1

вир3 при хибі вир1

,’ розділяє два підвирази у виразі

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

If (a=b,c>a) буде с>a

Операція () – у виразах задає найвищий пріоритет

[]- звертання до масивів

.

-> операції звертання до складних структур типів даних

Ptr_student->name;

Приведення та Перетворення типів даних

Перетворення над обєктами здійснбється явним чином та за замовчуванням

Явним – операція приведення до типу

(тип) вираз;

float,double,long double → long → int → char і навпаки

Перетворення неявним чином

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

Long double→long double

double→double

unsigned long→unsigned long

long→long

unsigned→unsigned

char,short→int

unsigned char,unsigned short→unsigned

  1. 8→16→32

  2. 80→64→32→16→8

1) char→int 8→16

unsigned char→unsigned int 8→16

int→long int 16→32

Для беззнакових зліва додаються 0, для знакових - розмноження знаку

2) short→int 16→16

int →unsigned int 16→16

long→unsigned long 32→32

char →unsigned char 8→8

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

3) int→char 16→8

Unsigned →unsigned char 16→8

long→int 32→16

unsigned long→unsigned int 32→16

Перетворення відбуваються відкиданням старших байтів

4) Перетворення цілі-дійсні

Перетворення коректне, якщо діапазон представлення дохволяє

5) дійсні→дійсні

flot→double→long double і назад

З більшого дійсного до меншого дійсного відбувається шляхом заокруглення

6) Дійсні до цілих →long ближчий результат.

  1. Функції та структура програми мовою програмування СІ. Оголошення функцій. Поняття прототипу. Порядок передачі та перетворення аргументів.

Програма складається з сукупності фунцій, одна з яких повина називатися main(). Опис функції складається з заголовка і тіла функції. Заголовок містить оператори(директиви) препроцесора, наприклад, #include і ім'я функції. Тіло функції розташоване у фігурних дужках і складається з ряду операторів, кожен з яких закінчується крапкою з комою. Приклад програми, що буде наведений нижче, містить ще і оператор оголошення, який оголошує ім'я і тип змінної, що буде використовуватися. Крім того в ньому був присутній оператор присвоєння, що присвоює значення змінній.

Коротко кажучи, проста програма, що написана з вроахуванням вимог стандарту ISO/ANSI C, повинна мати наступний формат:

Загловок:

#include<stdio.h> //- Інструкції препроцесора

int main(void) //- ім'я ф-ї з аргументами

Тіло:

{

int q; // - Оператор оголошення

q=1; //Оператор присвоєння

printf(“%d is neat. \n”,q); // Оператор виклику ф-ї

return 0;

}

Функція – це самостійний фрагмент тексту програми, що призначений для виконання конкретної задачі.

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

int gcd (int m, int n)

{

while (m != n)

if m>n m=m-n; else n=n-m;

//m == n

return m;

}

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

int gcd (int m, int n);

або навіть

int gcd (int, int);

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

Функція може не повертати значення. В цьому випадку її сигнатура починається словом void.

Перед появою стандартної мови ANSI C існувала проблема оголошення ф-й, бо тоді оголошувався тип значення, що повертає ф-я, а не її аргументи. Тому в стандарті ANSI C можна оголошувати і типи аргументів. Результатом є прототип ф-ї.

Приклад

int imax(int, int);

int imax(int a, int b);

Усі параметри, за винятком параметрів типу покажчик та масивів, передаються за значенням. Це означає, що при виклику функції їй передаються тільки значення змінних. Сама функція не в змозі змінити цих значень у викликаючій функції. Наступний приклад це демонструє:

#include<stdio.h>

void test(int a)

{

a=15;

printf(" in test : a==%d\n",a);

}

void main()

{

int a=10;

printf("before test : a==%d\n",a);

test(a);

printf("after test : a==%d\n",a);

}

Наступний приклад демонструє, що при активізації (виклику) функції копії створюються для параметрів, що передаються за значенням, а для параметрів, що передаються за допомогою покажчиків цього не відбувається. У функції два параметри - one, two - передаються за значенням, three - передається за допомогою покажчика. Так як третім параметром є покажчик на тип int, то він, як і всі параметри подібного типу, передаватиметься за вказівником:

#include <stdio.h>

void test(int one, int two, int * three)

{

printf( "\nАдреса one дорівнює %р", &one );

printf( "\nАдреса two дорівнює %р", &two );

printf( "\nАдреса three дорівнює %р", &three );

*three+=1;

}

main()

{

int a1,b1;

int c1=42;

printf( "\nАдреса a1 дорівнює %р", &a1 );

printf( "\nАдреса b1 дорівнює %р", &b1 );

printf( "\nАдреса c1 дорівнює %р", &c1 );

test(a1,b1,&c1);

printf("\nЗначення c1 = %d\n",c1);

}

На виході ми отримуємо наступне:

Адреса а1 дорівнює FEC6

Адреса b1 дорівнює FEC8

Адреса c1 дорівнює FECA

Адреса one дорівнює FEC6

Адреса two дорівнює FEC8

Адреса three дорівнює FECA

Значення c1 = 43

  1. Поняття покажчика на функцію в мові програмування СІ. Приклади використання.

Існують мови програмування, в яких немає відмінності між програмами і даними. Певною мірою ця можливість представлена в С++ указниками функцій. Так визначення

double (*f) (double);

читається як: нехай f указник на довільну дійсну функцію дійсного аргументу.

Інший запис без дужок

double *f (double);

Від оголошення функції, наприклад,

double sqr (double x);

визначення указника відрізняється тим, що оголошення доповнюється одним визначенням імені функції, наприклад,

double sqr (double x) { return x*x; }

в той час як указник може набувати довільних значень

double *f (double) = 0;

f = sqr ;

f = sin;

бути елементом масиву

double (*g[10]) (double);

Визначення типів дозволяють скорочувати запис

typedef double (*F) (double);

Тепер F повноцінне ім’я типу. Можливі будь-які із наведених нижче варіантів

F f = sqr;

F f = 0;

F f;

f = sqr;

Непрямий виклик функції за її указником записується одним з двох рівносильних способів: f(a) або (*f)(a).

Покажчики функцій не замінимі при визначенні функціоналів — функцій, параметрами яких служать інші функції

double Newton (double a, double b, double eps,

double (*f) (double))

//або

//double Newton (double a, double b, double eps, F f)

{

while ( (b-a)>eps)

do

{

if (f(a)*f(0.5*(a+b))<0)

//те ж саме: (*f)(a)*(*f)(0.5*(a+b)

b = 0.5*(a+b);

else

a = 0.5*(a+b);

}

return a;

}

Виклики функції запишуться, наприклад, так

x1 = Newton (-1.0, 2.0, 0.00001, sqr);

x2 = Newton (0, pi, 0.00001, cos);

  1. Багатомодульне програмування засобами мови СІ. Поняття файлу проекту. Використання директив умовної компіляції. Навести приклади.

Модулі

При багатомодульному програмуванні всі (або більшість) констант, змінних, функцій... зберігаються в модульних файлах. Проблеми виникають коли декілька файлів повинні використовуть змінні, що зберігаються в них. Найкраще є централізовано зберігати всі визначення в 1 файлі , і цей файл буде використовуватись всіма файлами. Такий файл називається модулем. Модульні файли не є виконавчими.

Існують стандартні бібліотечні файли, наприклад:

   #include <stdio.h>

Можна також створювати та підключати власні модулі:

   #include ``my_head.h''

Розглянемо такий приклад:

 

main.c:

/*

* main.c

*/

#include "header.h"

#include <stdio.h>

char *AnotherString = "Hello Everyone";

main()

{

printf("Running...\n");

/*

* Call WriteMyString() - defined in another file

*/

WriteMyString(MY_STRING);

printf("Finished.\n");

}

WriteMyString.c:

/*

* WriteMyString.c

*/

extern char *AnotherString;

void WriteMyString(ThisString)

char *ThisString;

{

printf("%s\n", ThisString);

printf("Global Variable = %s\n", AnotherString);

}

header.h:

/*

* header.h

*/

#define MY_STRING "Hello World"

void WriteMyString();

Кожен модуль компілюється окремо. Файл main викликає функцію WriteMyString() з файлу WriteMyString.c. Прототип цієї функції описаний в модулі Header.h



Скачать документ

Похожие документы:

  1. Програма конференції «Актуальні питання клінічної медицини» програма конференції «Мікроелементози в клінічній медицині» програма конференції «Actual problems of fundamental and clinical medicine (in english)»

    Документ
    9 Програма конференції «Мікроелементози в клінічній медицині» Програма конференції «Actual problems of fundamental and clinical medicine (in english)»…… 7 Матеріали конференції «Актуальні питання теоретичної медицини» .
  2. Хііі международная научно-практическая конференция «Идеи академика Вернадского и научно-практические проблемы устойчивого развития регионов»

    Документ
    Друкується за рішенням Вченої ради Кременчуцького національного університету імені Михайла Остроградського (протокол ВР № 9 від 04.07.2011 р.). Збірник публікує матеріали, що містять нові теоретичні та практичні результати в галузях
  3. Мовознавство (2)

    Документ
    У статті висвітлено деякі аспекти семантичної категоризації та функціонування демі­нутивних суфіксальних похідних іспанської мови. Звернено увагу на динамічні процеси ознак суб’єктивної оцінки як багатовекторної мовленнєвої домінанти,
  4. Філософсько-правові І теоретико-юридичні аспекти генезису публічно-правового порядку

    Документ
    Розбудова суспільства на засадах громадянських цінностей і формування властивостей правової і соціальної держави вимагає переосмислення багатьох державно-правових реалій, серед яких особливе місце займає служба.
  5. Наукове видання Тези доповідей ХVIII міжнародної науково-практичної конференції учотирьох частинах Ч. III харків 2010 ббк 73 І 57

    Документ
    Інформаційні технології: наука, техніка, технологія, освіта, здоров’я: Тези доповідей ХVIII міжнародної науково-практичної конференції, Ч.III (12-14 травня 2010 р.

Другие похожие документы..