C proqramlaşdırmasında məlumat növləri

Bir proqramda kodlaşdırdığımızda, proqramda son istifadə üçün müəyyən dəyərlər saxlamalıyıq. Bu cür dəyərlərin yaddaş yerində saxlanılması lazımdır. Yaddaş yerinin öz ünvanına sahib olmasına baxmayaraq, adlarından daha çox adları ilə müəyyənləşdirmək asandır. Beləliklə, bu dəyərləri saxlamaq üçün dəyişənlərdən - adlanan bir yaddaş məkanından istifadə edirik. Bu dəyişənlər istifadəçidən dəyərlər əldə etmək üçün istifadə edilə bilər, müxtəlif hesablamalar zamanı və ya bəzi nəticələri və ya mesajları göstərmək üçün istifadə edilə bilər. Ancaq bütün məlumatları bütün dəyişənlərdə saxlaya bilmərik. Hər bir dəyişənin saxlaya biləcəyi bir məlumat növü təyin etsək, C istifadə edərək sistematik bir proqramlaşdırma üçün dəyərlər əlavə edər, yəni dəyişənlərin proqramdakı sistematik istifadəsini təmin edər və qarışıqlıqların və məlumatların səhv işləməsinin qarşısını alır.

Eynilə C dili də funksiyalar ətrafında fırlanır. Funksiyalar müəyyən tapşırığı yerinə yetirmək üçün nəzərdə tutulsa da, axtarış funksiyalarına qaytarılması lazım olan nəticə dəyərləri olacaqdır. Bunun üçün funksiya adı olaraq adlandırılan yaddaş yeri də lazımdır. Ancaq hər hansı bir dəyəri qaytara bilməz. Dəyişənlər kimi, qaytarılacağı məlumat növünü əvvəlcədən təyin etsək, proqramı daha məntiqli edir.

Bütün bunlar C-dəki məlumat tiplərindən istifadə etməklə edilir. Datatiplər dəyişənləri və funksiyaları müəyyənləşdirilən məlumatların çeşidi, saxlanılan məlumatların növü ilə müəyyənləşdirir və yaddaşın nə qədər baytın yerləşdiyini göstərir. Dəyişənlər, proqramın başlanğıcında, məlumat / proqramda istifadə etməzdən əvvəl müvafiq məlumat növləri ilə elan edilir. Bu məlumat növləri, int, float, double, char və s. Kimi C-də qorunan açar sözlərdir.

Dəyişən aşağıdakı kimi məlumat növündən istifadə edərək elan olunur:

datatype variable_name;
int intNum1; // variable with integer datatype, defines the variable
float flNum=3.14; // Variable with real number, defines and initializes the variable
char chOption; // chOption is of character type

Hər hansı bir funksiyanın daxilində yuxarıdakı kimi bir dəyişəni elan etdiyimiz zaman dəyişəni təyin edir. Onları elan edərkən dəyişənə ilkin dəyəri versək, dəyişəni həm təyin edir, həm də başlatır. Dəyişənləri fərqli addımlarda da elan edə, təyin edə və işə sala bilərik. Bu halda 'extern' açar sözü dəyişəni elan etmək üçün istifadə olunur və bu dəyişənləri proqramın istənilən yerində təyin etməyə imkan verir - yəni proqramdakı hər hansı bir funksiyada.
#include <stdio.h> 
extern float marks1, marks2; // declare float variables

void main() {
	float marks1, marks2; //define the same float variables, since it is actually being used here

	marks1 = 67.5; // Initialize the variable
	marks2 = 88;

	printf("Marks in Subject 1 is: %f\n", marks1); // display the variable value
	printf("Marks in Subject 2 is: %f\n", marks2);
}

Fərqli tip tipləri var.

İbtidai / Əsas / Əsas Məlumat növü

Dəyişənləri və funksiyaları təyin etmək üçün istifadə edilən çox tip məlumat tiplərini ehtiva edir. Bu məlumat növü əsasən rəqəmləri və simvolları elan etmək üçün istifadə olunur.

Xarakter məlumat tipləri

Bu məlumat növü, xarakter dəyişənlərini elan etmək üçün istifadə olunur. Yalnız xarakter dəyərlərini saxlaya bilər. Ancaq dəyişən hər bir simvol növü bir anda yalnız bir simvol tuta bilər. Çünki bu məlumat növü yalnız bir bayt yaddaş tutur. Yəni -128-dən 127-dək dəyərləri saxlaya bilər. İmzalanmış simvol dəyəri və ya imzasız simvol dəyəri ola bilər.

char chOption; // chOption is of character type
unsigned char chOption; // chOption is of character type, but unsigned

Tam Data növləri

Bu məlumat növü dəyişəni tam olaraq elan edir. Kompilyatora tam olaraq elan edilmiş dəyişənlərin yalnız rəqəmlərdən ibarət ola biləcəyini bildirir. Heç bir kəsr ədədi ola bilməz. Ya müsbət, ya da mənfi ola bilər. 2 bayt (köhnə sistemlərdə) və ya 4 bayt yaddaş tutur. Bu, int ölçüsü 231 bayt olduqda, -231-dən 4-ə qədər dəyər saxlaya biləcəyini göstərir. yəni; -2 dəyərləri31 , -231 + 1, -231  +2,… .. -3, -2, -1, 0, 1, 2, 3,… .2312, 2311, 231

Belə elan olunur: int intNum1; // tam ədədi ilə dəyişən

Tamsayı məlumat növü imzalanmış və ya imzasız ola bilər. İmzalanmış məlumat tiplərinə normal olaraq int deyilir. İmzasız məlumat növləri üçün int-dən əvvəl 'imzasız' açar söz əlavə olunur. İmzasız tam sistem də sistemdən asılı olaraq 2 bayt və ya 4 bayt ölçülüdür, lakin imzasız int ölçüsü 0 bayt olan 231 ilə 4 arasında dəyərlərə sahib olacaqdır.

int intNum1; // bu imzalanmış bir tam dəyişəndir - müsbət və ya mənfi ola bilər
imzasız int intNum2; // bu imzasız tam dəyişəndir - yalnız müsbət dəyərlər ola bilər

Tam ədəd məlumat növü 3 -dən hər hansı birinə aid ola bilər saxlama sinifləri - qısa int, int və uzun int. Bunlar hamısı saxlama sinifləri imzalanmış və ya imzasız ola bilər. Qısa int sinfi daha kiçik ədəd aralığını elan etmək üçün istifadə olunur və yalnız 2 baytlıq yer tutur. İnt növü saxlama sinfi 4 bayt boşluq istifadə edir və buna görə də daha böyük dəyər aralığına sahib ola bilər. Long int sinfi daha böyük dəyərlər aralığını saxlamaq üçün istifadə olunur.

 

Üzən nöqtəli məlumat növləri

Bu məlumat növləri həqiqi nömrələrin yanında eksponent nömrələrin də saxlanılması üçün istifadə olunur. 4 bayt yaddaş tutur. Buna görə 3.4 e-38-dən 3.4 e + 38-ə qədər dəyərlər saxlaya bilər. Üzən rəqəmlərin daha çox aralığını saxlamağımız lazımdırsa, 8 bayt yaddaş tutan ikiqat və ya 10 bayt yaddaşa sahib olan ikiqat istifadə edə bilərik. Float və ikiqat dəyişənlər ölçüləri və dəqiqliyi xaricində demək olar ki, eynidır. Float dəyişən 4 baytdan ibarətdir və cəmi 6 dəqiqlik / dəqiqlik rəqəmi, ikiqat isə 8 bayt və ondalık sıfırdan ibarət olan 14 rəqəmdən ibarətdir.

axıtma flAvg;
ikiqat dbl_fraksiyon_nömrəsi;
uzun ikiqat lgdbl_fracNum;

Məlumat tipini ləğv edin

Bu məlumat növü heç bir dəyər ehtiva etmir. Əsasən heç bir məlumat dəyəri qaytarmayan funksiyaların elan edilməsi və ya funksiyanın heç bir arqument qəbul etməməsi və ya bir göstərici dəyişəninin ünvanını tutması üçün istifadə olunur. Dəyişəndə ​​istifadəsi çox nadirdir.

Bir arqument olmadan işləyin və ya qaytarma növünün elan edilməsi lazımdır, sonra onları elan etmək üçün void məlumat tipindən istifadə edirik. Kompilyatorun hər hansı bir dəyərə sahib olduğunu göstərir.

    ləğv fnDisplayName ();
    ləğv fnGetAddress ();
    int fn_FindSum (ləğv);

Göstəricilərdən istifadə etdiyimiz zaman, bəyannamə verildikdə onun məlumat növündən əmin ola bilmərik. Ancaq bu göstəricilər üçün yaddaş yeri proqram başlamazdan əvvəl ayrılmalıdır. Bu vəziyyətdə bəyan edirik göstəricilər boş və yaddaş ayırmaq. Kodun sonuncusu tökmə növü göstərici üçün məlumat növü. (daha ətraflı məlumat üçün mövzu işarələrinə baxın).

 ləğv * ptr;
ptr = & intVar1;

 ləğv * ptr;
ptr = malloc (ölçüsü(int) * 10);

Qeyri-primitiv / türevli / strukturlaşdırılmış məlumat növü

Törədilmiş məlumat tipləri, ibtidai məlumat tiplərindən götürülmüş məlumat tipləridir. Bu məlumat növləri bir ad altında hüdudlanan oxşar və ya fərqli məlumat növü dəyərləri toplusunu ehtiva edən dəyişən elan edir. Beləliklə, bu tip məlumat tiplərinə tərif edilmiş məlumat növləri deyilir. Əsasən 4 növ alınma məlumat növü mövcuddur.

Diziler

Bunlar oxşar məlumat növü dəyərlərini ehtiva edən adlanan dəyişəndir. Yəni tək dəyişən addan istifadə edərək birdən çox dəyər saxlaya bilərik. Bu, dəyişən addakı indekslərin istifadəsi ilə mümkün olur. Bu dəyişənlər istənilən ibtidai tipdə ola bilər.

Misal üçün,

int intNumbers [10]; // intNumbers dəyişənində 10 fərqli tam dəyər saxlayır
imzasız int intVar [10]; // 10 fərqli imzasız tam ədədi saxlayır
axıtma flReal [5]; // flReal dəyişənində 5 fərqli real dəyəri saxlayır
chariot chNames [20]; // 20 fərqli simvol tutur

Bu massivlərdəki hər bir dəyər indekslərdən istifadə etməklə əldə edilir. Məsələn intNumbers massivindəki 5 elementə intNumbers kimi daxil olmaq mümkündür [4]. Burada indeks sıfırdan başlayır; buna görə 5-ci elementə indeks 4 deyilir.

Massivin ölçüsü, məlumat tipinin vurulmuş element sayına bərabərdir. Yuxarıdakı nümunədə,

İntNumbers ölçüsü = sizeof (int) * 10 = 4 * 10 = 40 bayt.
İntVar ölçüsü = sizeof (imzasız int) * 10 = 4 * 10 = 40 bayt.
FlReal ölçüsü = sizeof (float) * 5 = 4 * 5 = 20 bayt.
ChNames ölçüsü = sizeof (char) * 20 = 1 * 20 = 20 bayt.

Strukturları

Strukturlar içərisində oxşar və ya bənzəməyən dəyişənlər toplusunu saxlamaq üçün istifadə olunur. Əlaqəli məlumatları bir ad altında saxlamaq istədikdə faydalıdır.
Məsələn, müəyyən bir tələbənin tələbə detalları aşağıdakı kimi tələbə adı verilən strukturda saxlanıla bilər:

struct Student{
        int intStdId;
	char chrName[15];
	char chrAddress[25];
	int Age;
	float flAvgMarks;
	char chrGrade;
}

Burada qeyd edə bilərik ki, quruluş tələbəsi müxtəlif növ dəyişənlərə malikdir. Bütün bu dəyişənlər tələbə ilə əlaqədardır və Tələbə adlanan bir ümumi dəyişən adına birləşdirilmişdir. Massivlərdən fərqli olaraq, burada strukturun hər bir elementinə ayrı-ayrı adları ilə müraciət edə bilərik. Hətta ibtidai tip dəyişkənlərə və ya əldə edilmiş dəyişənlərə - massivlərə, strukturlara, birləşmələrə və hətta göstəricilərə sahib ola bilər.

Burada strukturun ölçüsü fərdi elementlərin ölçüsünün cəmidir. Yuxarıdakı tələbə quruluşunda,

Tələbə quruluşunun ölçüsü = ölçüsü (intStdId) + ölçüsü (chrName) + ölçüsü (chrAddress)
+ Yaş (Yaş) + ölçüsü (flAvgMarks) + ölçüsü (chrGrade)
= sizeof (int) + (15 * sizeof (char)) + (25 * sizeof (char))
+ Ölçüsü (int) + ölçüsü (float) + ölçüsü (char)
= 4 bayt + (15 * 1bayt) + (25 * 1bayt) + 4 bayt +4 bayt + 1bayt
= 33 bayt.

Ittifaq

Bu, C-də quruluşa bənzər başqa bir məlumat növüdür. Quruluşla eyni şəkildə elan edilir və əldə edilir. Ancaq birlik növü məlumat növünün elan edilməsi üçün istifadə olunur.

union Student{
	int intStdId;
	char chrName[15];
	char chrAddress[25];
	int Age;
	float flAvgMarks;
	char chrGrade;
}

Struktur və birlik arasındakı əsas fərq, ondadır yaddaş bölgüsü. Struktur olaraq ayrılan ümumi yaddaş, fərdi elementləri üçün ayrılmış yaddaşın cəmidir. Birliklərdə, ayrılan ən yüksək yaddaşa malik olan elementin yaddaş ölçüsüdür. Yuxarıdakı Tələbə Birliyində, ölçüsü maksimum ölçüyə malik olduğu üçün chrAddress ölçüsüdür.

Pointers

Göstəricilər başqa bir dəyişənin ünvanını saxlamaq üçün istifadə olunan xüsusi dəyişənlərdir. Göstəricilər istifadə edərək, proqram başqa bir dəyişəni tutmaq üçün dəyişənə ayrılmış yaddaş alır. Dizilərə daxil olanda, birdən çox dəyərləri funksiyalara ötürərkən və qaytararkən, simləri idarə etmək, yığınlar, əlaqəli siyahılar, ikili ağac, B + ağacı və s. Kimi müxtəlif məlumat strukturlarını idarə etməkdə bir üstünlük var. ibtidai dəyişən, lakin bir göstərici olduğunu göstərmək üçün dəyişən adından əvvəl bir '*' əlavə olunur. Daha sonra tərtibçi bunun bir göstərici olduğunu və hər hansı digər dəyişəndən fərqli bir şəkildə işlənməsi lazım olduğunu başa düşəcəkdir.

int *intPtr;
float flflPtr;
int *intArrPtr [10];
char *chrName;
char *chrMonthPtr [12];

Məlumat strukturları

Yığın, növbə, əlaqəli siyahı və s. Kimi məlumat strukturları bir və ya daha çox ibtidai məlumat növündən istifadə edən xüsusi tip dəyişənlərdir. Ümumiyyətlə bunlar struktur məlumat tiplərindən istifadə edərək yaradılır, lakin burada məlumatlar əlavə edildikdə və genişləndikdə azalır. Buna görə bunlar başqa bir növ məlumat növü kimi qəbul edilir.

İstifadəçi tərəfindən müəyyən edilmiş məlumat növü

Bəzən mövcud ibtidai və ya əldə edilmiş məlumat növündən istifadə edərək dəyişənlərin elan edilməsi mənalı ad vermir və dəyişən və ya qarışıqlıq məqsədinə xidmət etmir. Bəzən istifadəçi / inkişaf etdirici əsl məlumat növü ilə maraqlanmayacaq, əksinə bunun mənasını və ya məqsədini istəməlidir. Eyni dəyişənlər kateqoriyasını təkrar-təkrar yaratmaları onlar üçün faydalı olacaqdır.

Məsələn, şagirdlərin işarələrini saxlamaq üçün dəyişənlərə sahib olmaq istədiyimizi düşünək. İşarələr float sayı ola bilər. İlkin məlumat tipimizdən istifadə edərək aşağıdakı kimi dəyişənləri elan edəcəyik:

axıtma flMarks1, flMarks2;

Tərtibçiyə onların float tipli dəyişən olduqlarını göstərir. Adlandırma konvensiyasını izlədiyimizə görə dəyişən adı görərək işarələrin olduğunu və float tipli olduğunu başa düşə bilərik. Ancaq təsəvvür edin ki, onun növü bizi maraqlandırmır. Bundan əlavə, bütün funksiyalarda - proqram boyunca üzən işarələr üçün dəyişənlərə sahib olmaq istəyirik. Yəni proqramın birdən çox funksiyası varsa, dəyişənlərin fərqli funksiyalardakı fərqli məlumat tipləri ilə elan edilməsi ehtimalı var. Bu, dəyərlər təyin edərkən və ya funksiyalardan dəyərləri qaytararkən səhvlər yarada bilər. Beləliklə, fərqli marka dəyişənini yaratmaq üçün öz məlumat tipimizi - işarələri yaratsaq, bütün funksiyalar və dəyişən sinxronlaşacaqdır.

Bu o deməkdir ki, məlumat növü üzənini işarələr kimi adlandırın. Bu, C-də typedef istifadə edərək edilir.

typedef üzmək işarələri; // işarələr kimi üzənləri yenidən təyin edir

İndi işarələr istənilən dəyişəni float elan etmək üçün istifadə edilə bilər. Ancaq bu cür elanın məqsədini qorumaq üçün bütün işarələr dəyişənləri indi marka olaraq elan edilir.

işarələri alt1 işarələr, alt2 işarələr;

funksiya daxilində məlumat tipinin necə işlədiyini anlamaq üçün aşağıdakı nümunə proqrama baxın. İşarələr bütün funksiyalarda istifadə oluna bilməsi üçün əsas funksiyanın xaricində yeni bir məlumat növü olaraq təyin olunur. İndi işarələr proqram üçün qlobal bir məlumat növü rolunu oynayır. Proqramda hər hansı bir marka dəyişkənliyini elan etmək üçün daha çox float tipindən istifadə edilmir.

#include <stdio.h> 
typedef float marks; // redefines float as marks

void  fnTotal (marks m1, marks m2){
	marks total_marks;

	total_marks = m1 + m2;
	printf("Total Marks is: %f\n", total_marks);
}
void main() {

	marks sub1_marks, sub2_marks;
	sub1_marks = 67.5;
	sub2_marks = 88;

	printf("Marks in Subject 1 is: %f\n", sub1_marks);
	printf("Marks in Subject 2 is: %f\n", sub2_marks);

	fnTotal (sub1_marks, sub2_marks); // calling the function
}

Sadalanan məlumat növləri

C müəyyən edilmiş məlumat tiplərindən başqa, C istifadəçi / inkişaf etdiricinin öz məlumat tiplərini təyin etməsi üçün rahatlıq verir. Ənənəvi olaraq bir dəyişəni elan etmək üçün dəyişəni int, float, array və s elan etdikdə bu dəyişənlərdə yalnız bu tip məlumatları saxlaya bilərik. Quruluşu və ya birliyi elan etdiyimiz zaman, içərisində fərqli məlumat növlərinə icazə verilsə də, istifadəçilər üçün öz məlumatlarına / dəyərlərinə sahib olmağa imkan vermir.

Fərz edək ki, ildə ayları təyin etmək üçün bir məlumat tipimiz olmalıdır. 12 ölçülü bir simli sıra elan edə bilərik. Ancaq hansı dəyərlərə sahib ola biləcəyini izah etmir. Ya 12 ayı giriş olaraq daxil etməliyik, ya da hər bir indeks üçün dəyərləri sərt kodlamalıyıq.

char *chrMonths[12] = {"January", "February"," March",…"December" };

OR
char *chrMonths[12];
*chrMonths[0] = "January";
 *chrMonths[0] = " February";
 *chrMonths[0] = " March";
...	 …
*chrMonths[0] = " December ";

Burada a təyin etməliyik göstərici massivi xarakter tipli və ya xarakter tipli 2 ölçülü massivlər. Bunu dizi, göstərici və xarakter növü ilə bu qədər mürəkkəb etmək əvəzinə, hər hansı digər məlumat tipini eyni şəkildə təyin edə bilsək, hər kəsin başa düşməsi asan olacaq. Beləliklə, C, sadalanan məlumat növləri adlı başqa bir məlumat növü təqdim edir. İstifadəçi tərəfindən müəyyən edilmiş bir məlumat növü kimi də qəbul edilə bilər. Aşağıda göstərildiyi kimi elan edilir və təyin olunur:

saymaq enum_datatype {dəyər1, dəyər2, dəyər3, dəyərN};

Burada enum_ məlumat növü sadalanan bir məlumat növü adıdır və value1, value2,… valueN dəyərlərinə sahib ola bilər. İndi yalnız enum_datatype-da müəyyən edilmiş dəyərləri ala bilən digər dəyişənləri elan etmək üçün enum_datatype istifadə edə bilərik.

saymaq enum_datatype ed1, ed2, ed3;

Məsələn, aşağıda sadalanan məlumat növünü nəzərdən keçirin enumAylar.

saymaq enumAylar{Yanvar, fevral, mart, .., dekabr};
saymaq enumAylar monthCan, monthFeb, monthMar, monthDec;

ayCan = Yanvar;
monthFeb = Fevral;
monthDec = dekabr;

Burada enumAylar bir ildə ayları təyin etmək üçün istifadə olunur. A təyin etdikdə sayılır datatype, dəyərlərini də təyin edirik. Artıq monthJan, monthFeb, monthMar, monthDec və s. Kimi yeni məlumat növü enumMonths istifadə edərək dəyişənlər yarada bilərik. Bu yeni məlumat növləri, məlumat növü yaradarkən sadalanan dəyərlərdən hər hansı birinə sahib ola bilər. Qeyd edə bilərik ki, dəyişkənlərə kotirovkalardan istifadə edərək yanvar, fevral və s. Bu dəyişənlər üçün dəyərlər sadalanan siyahıdan birbaşa başqa bir dəyişən kimi təyin edilir. Ancaq əslində nədirsə, əvvəlcədən təyin olunmuş yanvar, fevral, mart və s. Sadalanan məlumat növü üçün indekslər hesab edir. Bu düşünür deməkdir enumAylar 12,… 0,1-dən 11 indeksdən ibarət bir sıra kimi. Bir dəyişəni elan etdiyimiz zaman aylar, sonra hər dəyişəni öz elementlərindən biri hesab edir - monthJan, monthFeb, monthMar elementləridir enumAylar. Beləliklə, elementin indeksini göstərən əvvəlcədən təyin edilmiş siyahıdan istənilən qiymətə sahib ola bilər.

#include <stdio.h> 

void main() {
	enum enumMonths{ January, February, March, December }; // Defining enumerated Datatype
	enum enum_datatype monthJan, monthFeb, monthMar, monthDec; // Declaring variable of type enumMonths

	// Assigning the values to the variables
	monthJan = January;
	monthFeb = February;
	monthDec = December;

	// Displaying the values
	printf("Value of monthJan is %d\n ", monthJan);
	printf("Value of monthFeb is %d\n ", monthFeb);
	printf("Value of monthDec is %d\n\n ", monthDec);
	printf("Value of February is %d\n ", February);
	printf("Value of December is %d \n", December);
}

Burada yanvar, fevral aylarını göstərmək əvəzinə indeks dəyərlərini əks etdirdiyini görə bilərik. Bu tip məlumat növü məlumatların sayını və dəyərlərini bildiyimiz zaman faydalıdır.

Translate »
1