Програмиране в C и C++
Кодирането или съставянето на програмата е реализация на алгоритмите чрез език за програмиране.
Езиците за програмиране от високо ниво, какъвто е и програмният език C, се характеризират със задължителни синтактични и “граматични” правила при съставяне на програмите.
Програмите трябва да бъдат коректни, четливи и разбираеми.
За добрия стил на проектиране на програмите са валидни три основни принципа:
Програмите трябва да бъдат добре структурирани и едновременно “опростени” и изчистени от излишни “хитрини”.
Всяка програма или подпрограма (модул) трябва да бъде документирана с подходящи и съдържателни коментари, както в описателната (за данните), така и в изпълнимата и части (предназначение, алгоритъм, данни, обработки и т.н.). Необходимо е използването на “значещи” имена за данните.
3. Програмата трябва да бъде оформена в стил, подобряващ нейната “четливост” – чрез подходящи интервали между елементите в програмните редове и между отделните програмни части, както и чрез ”отместване” на началото на вложените програмни структури.
Програмен език C
Основи на C
Характеристики, приложения, “надстройки” , версии.
С комбинира финност, гъвкавост, елегантност и ефективност на програмите – осигурява значителни потребителски удобства и многовариантност на програмните решения.
С е структурен език, неналагащ ограничения и неизползващ принуда. Като език за програмиране C е създаден от програмисти за програмисти
C успешно комбинира структурата на език от високо ниво с мощността и ефективността на асемблерен език. като осигурява и достъп до отделните байтове и битовете на данните.
Еднакво удобен и ефективен е за създаването и поддържането на системно програмно осигуряване, както и за създаването и използването на приложни програми с общо предназначение в съответни области. Знанието на C лежи в основата на създаването и поддържането на високо ефективни, надеждни и качествени софтуерни продукти.
Той е предверието към другите два професионални световни езика : C++ и Java. C++ е разширена версия на C, която е проектирана да поддържа обектно – ориентирани програмиране (ООП). C++ съдържа и поддържа целия език C заедно с набор от обектно – ориентирани допълнения (като надмножество на C). Тъй като C++ е построен и развит на базата на C , естествено е да се премине към изучаването на и програмиране на C++ след като се знаят и владеят основите на C.
Денис Ричи – за компютри PDP – 11, под управлението на операционнта система UNIX. Резултат е от процес на разработка на базата на програмен език BCPL, следван от език, наречен B, и това довежда до създаването на C през седемдесетте години.
Описание на езика – “The C Programming Language” от Брайън Кърниган и Денис Ричи – 1978.
1983 г. – сформирана е комисия, която създава ANSI (American National Standarts Institute) стандарт за C, които е ратифициран през 1989г. и леко променен през 1996 г. В наши дни на практика всички C компилатори спазват ANSI C стандарта.
Професионализмът на всеки програмист е гарантиран от компетентността по C.
Основни характеристки.
C поддържа: структурното и модулно програмиране на базата на функциите (библиотечни и потребителски), като единствена и “универсална” форма на подпрограми;
аритметичните (числовите) типове данни като основни (“стандартни”), от които могат да бъдат дефинирани какви да е по предназначение и сложност;
потребителски типове данни;
гъвкавост и многовариантност на управляваващите програмни конструкции и оператори,
удобни възможности за така нареченото “скриване на данните” (data hiddings), чрез съответно задаване на обхвата на действие и “видимост” на данните и обработващите ги функции
Елементи на езика: азбука, лексика, граматика:
Азбука – множество от допустими символи ® лексични правила Þ думи на езика, наречени лексеми ® граматични (синтактични) правила Þ изречения, наричани оператори (statements), които в езика С винаги завършват с точка и запетая. Последователността от оператори Þ програма и подпрограми (функции);
Азбука: букви (малки и големи от латинската азбука – важна осбеност: в C малките и главните букви са различни по предназначение и употреба), цифри, специални символи: ~ ! @ $ % ^ & * ( ) – + | { } [ ] : ; “ ‘ < , > . ? / \ = _
Лексеми: ключови думи, числени и символни константи, идентификатори, символни низове (стрингове), оператори и “препинателни” знаци.
Ключови (резервирани) думи – думи с точно определено изписване, предназначение и употреба.
auto break case char
const continue default do
double else enum extern
float for goto if
int long register return
short signed sizeof static
struct switch typedef union
unsigned void volatile while.
Важно: За ключовите думи се използват само малки букви.
Числени и символни константи – числа, които могат да бъдат: цели, дробни, положителни и отрицателни.
Цели – десетични, осмични (започват с 0), шестанадесетични (започват с 0x).
Дробни – формат F (формат с фиксирана точка) и формат E (експоненциална или степенна форма
Символни константи – разновидност на числените константи са. Представят се като символ, заграден в апострофи, примерно ‘а’, ‘W’, ‘6’. На всяка символна константа съответства числена стойност в ASCII код, съхраняван в един байт от паметта. Използва се и множество от специални символни константи, които се представят с по два символа, първият от които е \, примернo константите ‘\n’ – за нов ред, ‘\t’ – за табулация и други.
Идентификатори – имена на променливи, функции, константи, типове и други или в общия случай – обектите в програмата. Те могат да съдржат последователност от букви, цифри, символ долна черта _, като първият символ не трябва да бъде цифра. Максмалният брой символи е 32. Препоръчително е използването на значещи, смислови имена (идентификатори), примерно student, temper, date, fn, broj и т.н.. За имена не могат да се използват ключови думи!!!.
Символни низове (стрингове) – състоят се от множество символи, оградени с кавички (“..”) и т.н. Елементите на символните низове се сърахяват в последователни байтове от паметта. Последният байт на всеки символен низ съдържа 0 (символна константа ‘\0’), която се добавя автоматично от компилатора като индикатор за край на низа. Следователно низ от n символа заема n+1 байта в паметта.
Оператори – в C имат мнемонични означения за извършване на действия (операции), представени с един или два символа или чрез ключови думи, Според предназначението си могат да се разделят на три основни групи: аритметични и логически оператори, управляващи оператори и оператори за управление на динамичната памет (new и delete в C++).
Структура на програмите.
Известно е че, всяка изходна програма на език от високо ниво съдържа описание на данни и последователност от действия за тяхната обработка в съответствие с избран алгоритъм.
В езика C като основни програмни единици се използват функциите.
#include <stdio.h>
int main(void)
{
printf(“This is a short C program.”);return 0;
}#include <stdio.h>
int main(void)
{
printf(“This is “);
printf(“another C “);
printf(“program.”);return 0;
}
Всяка програма на C задължително съдържа описание (дефиниция) на функция main() (главна) и при необходимост – описание на други потребителски функции със съответно име, параметри и тип.
Дефинициите на функциите се състоят от две части: заглавна част (т.н. прототип на функцията) и тяло. В заглавната част се указват име на функцията, списък на нейните параметри и типа на върнатата стойност. Телата на функциите съдържат множество оператори (т.н. блок от оператори, заградени във фигурни скоби – { за начало и } за означаване на край на блока, които се изпълняват при извикване на функциите.
Извикването на една функция се осъществява чрез указване на името на функцията и списък на фактическите параметри, които трябва да съответстват по брой, ред на следване и тип на формалните параметри, описани в дефиницията на функцията. Информационният обмен между функциите се осъществява чрез техните параметри, върнатата стойност и/или чрез външни (глобални) променливи.
Библиотеки с “вградени” стандартни функции със съответно предназначение:
- за вход и изход на данни;
- за математически обработки;
- за работа със символи и символни низове;
- за работа с час и дата;
- за преобразуване на данни от един тип в друг;
- за генериране на случайни числа;
- за работа с операционната система,
- за графична обработка и др.
Достъп до библиотечните функции – в началото на съответната програма чрез директиви се указват имената на файловете (т.н. заглавни файлове – header files), в които те се съхраняват.
Коментари са текстове, които не се обработват от компилатора, а служат само като пояснения или забележки за програмистите и потребителите на съответната програма. В C/C++ могат да се използват два начина за представяне на коментари:
Чрез текст, разположен между /* и */. Коментарите могат да обхващат няколко реда;
Чрез текст след две наклонени черти // , разположен само на един ред.
Следва примерна програма като първоначална представа за структура, съдържание и организация на проста (“демонстаривна”) C програма с коментари.
Примерна програма с коментари 2.1.:
/* Програма за извеждане на числата от 1 до 10 на екрана – това е заглавен коментар */
#include <stdio.h> /*Това е директива за включване на заглавния файл stdio.h в програмния файл. Стандартните функции от този файл могат да се използват в програмата */
#include <conio.h>
int main() // Функция main() – заглавна част
{ // Начало на блока от оператори на функцията main()
int num; // Дефиниране на променлива от цял тип с име num – за броене
for(num=1; num<=10; num=num+1) // Цикъл за оставяне на 25 свободни реда на екрана чрез
printf(“\n”); // използване на стандартната функция printf() от файла stdio.h
for(num=1; num<11; num=num+1) // Цикъл за броене от 1 до 10
printf(” %d “, num); // Извеждане на числата от 1 до 10 на ред от екрана
printf(” \n Край! Натиснете клавиш…”);
getch();
return 0;
} // Край на блока от оператори на функцията main()
Следва примерен вариант на подобна програма с по-подробни описания и коментари на структурата на програмата и нейните елементи.
Примерна програма 2.2.
/* Първа примерна програма с коментари, директиви и главна функция – main() */
/* Функцията main() съдържа описание на данни,вход и изход с избор на вариант */
#include <stdio.h>
#include <conio.h> /* Директиви за включване на файлове със стандартни функции */
void main() /* Заглавие на функцията. Функцията е без параметри и е неопределена по тип */
{ /* Начало на т.н. тяло на функцията – блок от оператори */
int god, chislo ; /* Дефиниране на променливи god и chislo от цял тип – int */
float pari; /* Дефиниране на променлива pari с цяла и дробна част – тип float */
clrscr(); /*Стандартна фунцкция от библиотеката conio.h за изчистване на екрана */
printf(“ Въведете вашата възраст – навършени години: “); /* Подканващ текст на екрана */
scanf(“%d”,&god); /* Стандартна функция за въвеждане от клавиатура-библиотека stdio.h */
printf(“ Въведете число – 1, 2 или 3 за да спечелите пари: “);
scanf(“%d”,&chislo);
printf(“ Вие въведохте числото %d”,chislo);
switch (chislo){ /* Оператор за избор на вариант – начало */
case 1:pari=10000.0; break; /* Вариант 1 с оператори за присвояване и за прекъсване */
case 2:pari=100000.0; break;
case 3:pari=10.0; break;
default:printf(“\n Неправилен избор!!! “); /*Вариант по подразбиране */
goto et1; /* Оператор за преход към оператор с етикет et1 */
} /* Край на оператора switch за избор на вариант */
printf(“\n Вие сте на %d години и спечелихте %8.2f лева!!!”, god,pari);
et1: printf(“\n Натиснете клавиш… “); /* Подсказващ текст на екрана чрез ст. функция */
getch(); /* Стандартна фунцкция от библиотеката conio.h. Очаква натискане на клавиш за връщане от екрана с резултатите (среда DOS) към програмата на език C */
return; /* За връщане на резултата от функията. В случая не се връща резултат */
} /* Край на функцията main() */
След заглавните коментари следват редове с директиви, които винаги започват със символа #. Директивите управляват действието на компилатора и не завършват със символа точка и запетая!
Всяка директива се разполага на отделен ред.
#include (включване) уведомява компилатора да разположи на това място в програмата на C файла, чието име е оградено в ъглови скоби (примерно stdio.h)
Разширение на името е .h, защото тези файлове са заглавни (header).
#define чрез нея се дефинират така наречените макроси.
#define име на макрос [(списък от параметри)] [тяло]
Тази директива се използва и за дефиниране на константи (именувани), примерно:
#define pi 3.14159
Във всяка програма на C са задалйителни следващите два реда:
- main()
- {
main() се нарича главна функция. Функцията е наименована част от програмата и името й винаги завършва с двойка кръгли скоби (). Една програма може да има само една функция или много функции, но всяка програма съдържа функция main().
Следват операции за въвеждане, оператори за управление и операции извеждане. Последен в блока от оператори в тялото на функцията е операторът return. Предназначен е за връщане на стойност и предаване на управлението към извикващата функция. Може и да липсва, ако не се връща стойност, но е препоръчителен като добър стил на програмиране.
Основни типове данни. Константи и променливи
Основните типове данни, използвани в езика C са аритметичните типове: char (за символи), int (за цели числа), float, double (за дробни числа), типа void и функционалният тип. Тези типове са предварително дефинирани в езика и се поддържат от неговото ядро. Валидни са и типовете enum (изброим) и указател (pointer), сочещ адрес на съответни данни в паметта.
От потребителя (програмиста) могат да бъдат конструирани и други типове данни като масиви, структури, обединения (характеризиращи се с повече от една стойност), което ще бъде представено и разяснено в съответните следващи теми.
Типът void има смисъл на “неопределен тип”, а функционалният тип се използва за представяне на данни, които се интерпретират като функции, или по точно като начални адреси на функции. Тези типове ще бъдат разгледани по-подробно по-късно в лекциите
Константи
Както вече ви е известно, константите в езика C са три вида – числени константи, символни константи и символни низове. Техните стойности не могат да се променят по време на изпълнение на програмата.
В редица случаи е по-удобно някои константи за бъдат дефинирани с имена (примерно при многократно използване). Използва се ключовата дума const, във вида примерно:
const int MAX = 25; /* Цяла константа MAX със стойност 25, примерно студенти в група */
const float PI = 3.14159; /* Константа с приблизителна стойност */
const F = 10; /* Цяла константа F със стойност 10. Типът не е указан, но се подразира int */
Имената на константите умишлено са с главни букви, което е препоръчително като стил за да различават от имената на променливите (с малки букви) в програмите на C.
Декларирането на имена на константи може да се симулира и чрез използване на директивата #define, както беше показано по-горе. Трябва да се има предвид, че директивите #define и ключовата дума const се компилират по различен начин, т.е създадения от компилатора код в двата случая е различен.
Променливи.
Променливите са данни, чиято стойност може да се променя по време на изпълнение на програмата. Имат три характеристики: тип, име и стойност.
Преди да бъдат използвани, променливите трябва да бъдат дефинирани. Съществуват две места, където се декларират променливи: в някоя функция или извън всички функции от програмата. Променливите, декларирани извън всички функции се наричат глобални променливи и са достъпни (видими) от всяка функция в програмата. Съществуват (в съответна област от паметта) през цялото време на изпълнение на програмата.
Променливите, декларирани в тялото на дадена функция се наричат локални променливи. Достъпни са само във функцията, в която са декларирани. Създават се при извикване на функцията и се унищожават (освобождават паметта) при излизането от нея. Стандартна практика е дефинирането на всички локални променливи е да става в началото на съответната функция, веднага след отварящата фигурна скоба. Както ще се убедите по-късно, препоръчително е предимственото използване на локални променливи спрямо глобални.
Общият вид на дефиниция на променлива е:
тип име на променлива [ = начална стойност ];
Задължителни елементи на дефиницията са типа и името на променливата. Дефинирането на променлива може да бъде съпроводено с инициализация, т.е. задаване на начална стойност. Примери:
char otg = ‘Y’; //Дефиниция на символна променлива otg с начална стойност ‘Y’
int i, n, k = 20; //Дефиниция на три променливи от цял тип, като k е с начална стойност 20
float f; //Дефиниране променлива f от тип float (дробна)
double d, dd; //Дефиниране на две променливи с имена, съответно d и dd от тип double
Глобалните променливи могат да се инициализират само чрез константи. Инициализират се само веднъж – при започване изпълнението на програмата. Локалните променливи се инициализират при всяко извикване на функцията.
Глобалните променливи, които не са инициализирани, автоматично приемат стойност 0 (не е валидно за всички компилатори!). За неинициализираните локални променливи трябва да се приема, че съдържат неопределена стойност!
Променливите могат да участват в изрази, а стойностите им могат да се променят чрез оператор за присвояване.
Общият вид на декларацита на данни от изброим тип е по-различен и изглежда така:
enum [име на тип] {име1 [=стойност], име2 [=стойност], …., имеN [= стойност] };
Дефинирането на изброим тип на практика представлява конструиране на нов тип данни. Думата enum (изброим) е ключова, а името на изброимия тип и имената на елементите му се задават от програмиста. Пример за дефиниране на изброим тип dni (дни от седмицата):
enum dni {pon, vt, sr, chet, petyk, sybota, nedelq};
На всеки от елементите на изброимия тип съответстват числа от тип int, подредени последователно, започвайки от 0. В примера на елементите от pon до nedelq на типа dni ще съответстват числата: последователно от 0 до 6 (изброяване).
На някои от елементите могат да бъдат задавани начални стойности чрез използване на знака за присвояване. Следващите след тях елементи без начална стойност ще имат съответна стойност, продължаваща изброяването от тази начална стойност.
Пример за дефиниране на променлива color (за цвят):
enum color {black, blue = 2, green, red, yellow = 6, white};
На black ще съответства 0, на green 3, на red 4, а на white 7.
Едно примерно дефиниране на променливи с използване на дефинираните изброими типове, би изглеждало така:
color tv1, btv; ;// Променливите tv1, btv са от изброимия тип color
dni dnes, utre;// Променливите dnes, utre са от изброимия тип dni
Възможно е дефинирането на променливи от изброим тип чрез задаване на имената им непосредствено след затварящата фигурна скоба на дефиницията на анонимен изброим тип:
enum {pon, vt, sr, chet, petyk, sybota, nedelq} vchera, rojden;
Изрази и оператори.
В C изразите играят доста по-значителна роля, отколкото в повечето други програмни езици. Това отчасти се дължи на факта, че C дефинира доста повече оператори (знаци за операции в изрази – над 40).
Израз е комбинация от оператори и операнди. По предназначение операторите в C се разделят на : ариметични, логически, поразредни (за побитови операции с цели числа) и “специални” (примерно sizeof – размер на операнда в байтове, & – адрес на операнд, ? :– условна операция, оператор запетая , – за последователно изпълнение и други). Операнд може да бъде константа, променлива, извикване на функция, подизраз (примерно част от израз, заграден в скоби за израз () ).
В тази тема е отделено основно внимание на аритметичните изрази.
В C са дефинирани следните пет аритметични оператора: + (събиране); – (изваждане); * (умножение); / (деление); % (остатък от целоцислено делене). Операторите +, -, * и / могат да се използват с всеки един от аритметичните типове данни, но операторът % (остатък от целочислено делене) може да се използва само за целочислени типове данни. Този оператор извлича остатъка от деленето на две цели числа. Операторът “-“ има две значения. Първо, това е операторът за изваждане (за два операнда или т.н. бинарни операции) и второ, той може да се използва като единичен минус за промяна на знака на едно число. Единичен оператор е такъв, който се използва само с един операнд (използва се и термина унарен оператор, съответно унарна или еднооперандна операция).
От съществено значение за коректността на артметичните изрази и за стойността на резултата от тяхното изпълнение са типа на операндите и реда на изпълнение на операциите (без скоби) или т.н. приоритет.
При операнди от различен тип, типа на резултата от един аритметичен израз се определя от операнда с най-висок ранг на типа, както следва: double (най-висок ранг), float, int, char. Този метод позволява получаването на възможно най-точните резултати. Автоматичното преобразуване на типове е само временно. Преобразуваната стойност има първоначалния си тип след завършване на изчисленията в израза. Както ще бъде показано в следващите теми, преобразуването на типове широко се използва в C.
При операцията деление когато и двата операнда са целочислени се получава целочислен резултат, тъй като дробната част (ако има такава) се “отхвърля”.
Макар и относително несложни, аритметичните изрази са сравнително често източник на грешки и неочаквани “изненади”. За да подобрите тяхната четливост и разбираемост не е излишно да се използват интервали!
Стандартни функции.
Както вече беше отбелязано, езикът C предлага множество стандартни (библиотечни) функции. Използването на стандартни функции пести значително програмистко време и труд, повишава продуктивността и в общия случай намалява количеството на грешките.
От посочените по-горе групи от стандарни функции, дефинирани в C, в тази тема е отделено основно внимание на математическите функции (като операнди в аритметични изрази).
Езикът C дефинира няколко групи математически функции, приемащи и връщащи стойност от тип double, както следва:
- Тригонометрични функции;
- Хиперболични функции;
- Експоненциални и логаритмични функции;
- Други.
- Всички математически функции изискват включването на хедърния файл math.h в програмата.
- Всички ъгли, като фактически параметри (аргументи) се задават в радиани.
Тригонометрични функции:
- cos(x) – връща косинуса на ъгъл x, изразен в радиани;
- sin(x) – връща синуса на ъгъл x, изразен в радиани;
- tan(x) – връща тангенса на ъгъл x, изразен в радиани.
- Ако аргументът е в градуси, преобразувайте градусите в радиани, като ги умножите по pi/180.0 (pi » 3.14159).
- acos(x) – връща аркус косинуса на аргумента x, който трябва да е в интервала от –1 до 1;
- asin(x) – връща аркус синуса на аргумента x, който трябва да е в интервала от –1 до 1;
- atan(x) – връща аркус тангенса на аргумента x;
Хиперболични функции:
- cosh(x); sinh(x); tanh(x);
Експоненциални и логаритмични функции:
- exp(x) – връща стйността на e » 2.718282 повдигната на степен x;
- log(x) – връща натуралния алгоритъм на аргумента x > 0;
- log10(x) – връща десетичния алгоритъм на аргумента x > 0;
- Други:
- abs(x) – връща абсолютната стойност на аргумента x – от целочислен тип;
- fabs(x) – връща абсолютната стойност на аргумента x – от реален тип;
- sqrt(x) – връща квадратен корен от x ³ 0;
- pow(x, y) – връща стойността на x, повдигната на степен y.
Заб. Аргументите на тези функции могат да бъдат и аритметични изрази (от съответен тип и с допустими стойности).
Голяма част от математическите функции, включително и отбелязаните по-горе, са декларирани и в хедърния файл complex.h. Осигуряват значително развити възможности за работа с комплексни числа.
Сходни статии:
- Функционално програмиране Функционални езици Основи математически функции и ג-смятането метод за дефиниране на функции без име – lambda функции (Alonzo Church, 1941) Особености не използват променливи и оператори за присвояване ⇒ итеративните...
- Стандартни функции в програмирането Не е необходимо да се пишат програмите с всичките им подроб-ности. С++ предлага множество стандартни функции. Тяхното из-ползване повишава продуктивността и пести програмистко време. Не е необходимо да се пише...
- Програмиране от по-висок ред в C++ Функция, някои формални параметри на която са функции, се нарича функция от по-висок ред. В езика C++ е възможно формален параметър на функция да е указател към функция, а също...
- Програмиране и използване на компютри. Програмиране на С++ Условие на задачата: Дадени са четири таблици,в които са записани цели шест цифрени положителни числа. Таблиците имат M реда и N колони(3 ≤ M≤10 и 3≤ N≤5).Напишете програма, с която...
- Програмиране на Basic ФОРМАТ НА ПРОГРАМНИЯ РЕД Програмните редове в Basic имат следния формат: nnnnn Бейсик_оператор[ : Бейсик_оператор. . . ] [ ‘ коментар] и завършват със символа за край на ред (Enter)....