C Struktura

Struktura ta’rifi. Struktura bu turli turdagi ma’lumotlar birlashtirilgan turdir. Struktura har xil turdagi elementlar komponentalardan iborat bo’ladi. Bir xil turdagi elementlardan tashkil topuvchi massivlardan farqli o’laroq, strukturalarning tashkil etuvchilari har xil bo’lishi mumkin va ular har xil nomlanishi kerak. Masalan: ombordagi tovarlarning ro’yxatini tuzish uchun yaratilgan struktura komponentalari bilan quyidagichadir:

  • Tovar nomi (char[20])
  • Ulgurji narxlar (long)
  • Sotish narxlari prosent hisobida (float)
  • Tovar partiyasining hajmi (int)
  • Tovar kirib kelgan vaqti (char [9])

“Ombordagi tovarlar” strukturasidagi elementlarni sanab o’tish davomida dasturchi tomonidan shu elementlarning turi qo’shilgan. Shunga asoslanib komponentalar har qanday turga ega bo’lishi mumkin. Strukturalar quyidagicha ta’riflanishi mumkin:

struct struturali_tur_nomi {
   //Elementlar_ta’riflari
  } 

Masalan:

struct Date 
{
       int yil;
       char oy, kun;
}

Yuqorida ko’rib o’tilgan misolni quyidagicha yozish mumkin.

struct goods 
{
      char name[20]; /*nomlanhi*/
      long price; /*ulgurji narxlar */ 
      float percent; /*narxlar % */
      int vol; /* tovar partiyasi */
      char date [9]; /* tovar kirib kelgan vaqti*/
}

Dasturda tuzilma turidagi o’zgaruvchi quyidagi shaklda kiritiladi:

struct Tuzilma_nomi identifikatorlarning_ro’yhati; 

Masalan:

struct Date s1, s2; 

Misol uchun:

struct complex 
{
  double real;
  double imag;
} 

Bu misolda kompleks sonni tasvirlovchi strukturali tur complex kiritilgan bo’lib, kompleks son haqiqiy qismini tasvirlovchi haqiqiy va mavhum qismini tasvirlovchi imag komponentalaridan iboratdir. Konkret strukturalar bu holda quyidagicha tasvirlanadi:

struct complex sigma,alfa;

Quyidagi misolda kasr sonni tasvirlovchi numerator–sur’at va denominator maxraj komponentalaridan iborat struktura ta’rifi keltirilgan.

struct fraction 
{
     int numerator;
     int denominator;
} 

Bu holda konkret strukturalar quyidagicha tasvirlanishi mumkin:

struct fraction beta;

Strukturalar ta’riflanganda konkret strukturalar ro’yhatini kiritish mumkin:

struct struturali_tur_nomi 
{
     // Elementlar_ta’riflari
} 
   // Konkret_strukturalar_ro’yxati.

Misol:

struct student
{ 
    char name[15];
    char surname[20]
    int year;
}
student_1, student_2, student_3;

Bu holda student strukturali tur bilan birga uchta konkret struktura kiritiladi. Bu strukturalar student ismi (name[15]), familiyasi (surname[20]), tug’ilgan yili (year) dan iborat. Strukturali tur ta’riflanganda tur nomi ko’rsatilmay, konkret strukturalar ro’yxati ko’rsatilishi mumkin:

struct 
{
    // Elementlar_ta’riflari
} 
// Konkret_strukturalar_ro’yxati.

Quyidagi ta’rif yordamida uchta konkret struktura kiritiladi, lekin strukturali tur kiritilmaydi.

struct
{
    char processor [10];
    int frequency;
    int memory;
    int disk;   
} 
IBM_486, IBM_386, Compaq;

Strukturalarga murojaat. Konkret strukturalar ta’riflanganda massivlar kabi inisializasiya qilinishi mumkin. Masalan:

struct complex sigma = {1.3; 12.6};
struct goods coats = {"pidjak", 40000, 7.5, 220, "12.01.97");

Bir xil turdagi strukturalarga qiymat berish amalini qo’llash mumkin:

struct complex alfa; 
alfa = sigma;

Lekin strukturalar uchun solishtirish amallari aniqlanmagan. Strukturalar elementlariga quyidagicha murojaat qilish mumkin:

Struktura nomi.element_nomi.

'Nuqta amali' struktura elementiga murojaat qilish amali deyiladi. Bu amal qavs amallari bilan birga eng yuqori ustivorlikka ega.

Misol:

struct complex alfa = {1.2, -4.5}, betta = {5.6, -7.8), sigma;
sigma.real = alfa.real + betta.real;
sigma.imag = alfa.imag + betta.imag;

Konkret strukturalar elementlari dasturda alohida kiritilishi va chiqarilishi zarur. Quyidagi misolda xizmatchi strukturasi kiritiladi:

#include <stdio.h>
struct employee
{
    char name [64];
    long employee_id;
    float salary;
    char phone[10];
    int office_number;
} 
worker;
void show_emploee (employee worker)
{
    printf("\nIsmi: %s", worker.name);
    printf("\nTelefon: %s",worker.phone);
    printf("\nNomer: %ld",worker.employee_id);
    printf("\nOylik: %f",worker.salary);
    printf("\nOfis: %d",worker.office_number);
}
int main()
{
    worker.employee_id = 12345;
    worker.salary = 25000.00;
    worker.office_number = 102;
    printf("\n ismi:"); 
    scanf("%s",&worker.name);
    printf("\n telefon:"); 
    scanf("%s",&worker.phone);
    show_emploee(worker);
    return 0;
}

Strukturaviy tur kiritish. Strukturaviy turni kiritishda yana bir imkoniyatni yordamchi so’z typedef yaratadi. Strukturaviy tur kiritilgan va qayta nomlangan xol uchun ta’rif quyidagi ko’rinishga ega bo’ladi:

typedef struct{elementlar tarifi} struktura turi 

Masalan:

typedef struct 
{
    double real;
    double imag;
}
complex;

Keltirilgan qoida strukturaviy tur va unga belgilash kiritadi. Bu belgilash orqali struktura turidagi o’zgaruvchilarni xuddi shunday oddiy nomlangan strukturaviy tur kabi kiritish mumkin.

Misol:

complex sigma, alfa;

Strukturaviy turga dasturchi typedef yordamida nom beradi shu bilan birga u ikkinchi nomga ham struct yordamchi so’z orqali ega bo’la oladi. Misol tariqasida rasional kasrning strukturaviy turini aniqlashni ko’rib chiqamiz.

typedef struct rational_fraction
{ 
    int numerator;  /* Surat */
    int denominator;  /* Maxraj*/
} 
fraction;

bu yerda fraction – strukturaviy turning belgilanishi typedef - yordamida kiritilmokda. Strukturaviy turlarni standart ko’rinishda kiritish uchun rational_fraction ishlatiladi.

Strukturalar va massivlar

Massivlar strukturalar elementlari sifatida. Massivlarni strukturalar elementi sifatida ishlatilishi hech qanday qiyinchilik tug’dirmaydi. Biz yuqorida simvolli massivlardan foydalanishni ko’rdik. Quyidagi misolda fazoda berilgan nuqtaviy jismni tasvirlovchi komponentalari jism massasi va koordinatalaridan iborat struktura kiritilgan bo’lib, nuqtaning koordinatalar markazigacha bo’lgan masofasi hisoblangan.

#include <stdio.h>
#include <math.h>
struct 
{
    double mass;
    float coord[3];
}
point = {12.3, {1.0,2.0,-3.0}};
int main()
{
    int i;
    float s = 0.0;
    for (i = 0; i<3; i++)
    s+ = point.coord[i]*point.coord[i];
    printf("\n masofa = %f",sqrt(s));
    return 0;
}

Bu misolda point strukturasi nomsiz strukturali tur orqali aniqlangan bo’lib, qiymatlari inisializasiya yordamida aniqlanadi.

Strukturalar massivlari.

Strukturalar massivlari oddiy massivlar kabi tasvirlanadi. Yuqorida kiritilgan strukturali turlar asosida quyidagi strukturalar massivlarini kiritish mumkin:

struct goods list[100];
complex set [80];

Bu ta’riflarda list va set strukturalar nomlari emas, elementlari strukturalardan iborat massivlar nomlaridir. Konkret strukturalar nomlari bo’lib set[0], set[1] va hokazolar xizmat qiladi. Konkret strukturalar elementlariga quyidagicha murojaat qilinadi: set[0].real – set massivi birinchi elementining real nomli komponentasiga murojaat. Quyidagi misolda nuqtaviy jismlarni tasvirlovchi strukturalar massivi kiritiladi va bu nuqtalar sistemasi uchun og’irlik markazi koordinatalari (xc, yc, zc) hisoblanadi. Bu koordinatalar quyidagi formulalar asosida hisoblanadi:

m = ∑mi; xc = (∑ximi)/m; yc= (∑yimi)/m; zc = (∑zimi)/m;

#include  <stdio.h>
struct particle
{
    double mass; 
    double coord [3];
}
int main()
{
    struct particle mass_point[] = { 20.0, {2.0, 4.0, 6.0}, 40.0, {6.0, -2.0, 6.0}, 10.0, {1.0, 3.0, 2.0}};
    int N;
    struct particle center = { 0.0, {0.0, 0.0, 0.0}};
    int I;
    N = sizeof(mass_point)/sizeof(mass_point[0]);
    for (I = 0; I < N; I++)
    {
        center.mass+ = mass_point[I].mass;
        center.coord[0]+ = mass_point[I].coord[0]* mass_point[I].mass;
        center.coord[1]+ = mass_point[I].coord[1]* mass_point[I].mass; 
        center.coord[2]+ = mass_point[I].coord[2]* mass_point[I].mass; 
    }
    printf("\n Massa markazi koordinatalari:");
    for (I = 0; I < 3; I++)
    {
        center.coord[I] / = center.mass;
        printf("\n Koordinata %d %f", (I+1), center.coord[I]);
    }
    return 0;
}