C Abstrakt turlarni tasvirlash

Amaliy masalalarni yechishda, shu soha uchun mos bo’lgan ma’lumotlar turlarini aniqlab olish qulaydir. Dasturda bu turlar strukturali turlar sifatida tasvirlanadi. So’ngra shu tur bilan bog’liq hamma funksiyalarni ta’riflab, biblioteka hosil qilinadi. Misol tariqasida kasrlar bilan bog’liq abstrakt tur kiritamiz. Kasrlar ustida quyidagi funksiyalarni kiritamiz.

  • input() kasr sonni kiritish;
  • out() kasr sonni ekranga chiqarish;
  • add() kasrlarni qo’shish;
  • sub() kasrlarni ayirish;
  • mult() kasrlarni ko’paytirish;
  • divide() kasrlarni bo’lish;

Quyidagi programma kiritilgan funksiyalar yordamida kasrlar bilan ishlashga misol bo’ladi

#include<stdio.h>
#include<stdlib.h>
typedef struct rational_fraction
{
    int numerator;
    int denominator;
} 
    fraction;
fraction input()
{
    int N;
    fraction dr;
    printf("\n Surat:");
    scanf("%d", &dr.numerator);
    printf("Mahraj:");
    scanf("%d", &N);
    if (N == 0)
    {
    printf("\n Xato! No'l mahraj");
    exit(0);
    }
    dr.denominator = N;
    return dr;
}
void out(fraction dr)
{
    printf(" Kasr ");
    printf( "%d/%d \n", dr.numerator, dr.denominator);
}
fraction add (fraction dr1, fraction dr2)
{
    fraction dr;
    dr.numerator = dr1.numerator * dr2.denominator+ dr1.denominator * 
    dr2.numerator;
    dr.denominator = dr1.denominator * dr2.denominator;
    return dr;
}
fraction sub (fraction dr1, fraction dr2, fraction * pdr)
{
    fraction dr;
    dr.numerator = dr1.numerator * dr2.numerator- dr2.numerator *
    dr1.denominator;
    dr.denominator = dr1.denominator* dr2.denominator;
    return dr;
}
fraction mult (fraction dr1, fraction dr2)
{
    fraction dr;
    dr.numerator = dr1.numerator * dr2.numerator;
    dr.denominator = dr1.denominator * dr2.denominator;
    return dr;
}
fraction divide ( fraction d1, fraction d2)
{
    fraction dr;
    dr.numerator = d1. numerator * d2. denominator;
    dr.denominator = d1. denominator * d2. numerator;
    return dr;
}
int main()
{
    fraction a,b,c,d;
    fraction p;
    printf("\n Kasr kiriting:");
    a = input();
    b = input();
    c = add(a,b);
    out(c);
    c = mult(a,b);
    out(c);
    c = divide(a,b);
    out(c);
    return 0;
}

Natija:

Kasr kiriting:
 Surat:23
 Mahraj:34
 Surat:24
 Mahraj:45
 Kasr 1851/1530 
 Kasr 552/1530 
 Kasr 1035/816 

Strukturani boshqa strukturadan tashkil topishi

Struktura o’zgaruvchisi maydon sifatida. Murakkab strukturalarni hosil qilishda oldin uni tashkil etuvchi oddiyroq strukturalarni e’lon qilib, keyin esa ularni birlashtirish orqali strukturani hosil qilish maqsadga muvofiqdir. Masalan, g’ildirak strukturasi, motor strukturasi, uzatish korobkasi strukturasi va boshqa strukturalarni hosil qilib, keyin esa ularni birlashtirish orqali avtomobil strukturasini qurish qo’yilgan masalani yechishni ancha osonlashtiradi. Quyidagi misolda oddiy nuqta strukturasi yaratilgan. So’ngra moddiy nuqta yaratilib, uning ichida nuqta sinfiga tegishli o’zgaruvchiga ta’rif berilgan:

#include<stdio.h>
typedef struct
{
    int x;
    int y;
}
Point;
typedef struct
{
    Point p;
    float w;
}
FPoint;
int main()
{
    FPoint X = {10, 20, 1.5};
    printf("coord x = %d\n",X.p.x);
    printf("coord y = %d\n",X.p.y);
    printf("weight w = %f",X.w);
    return 0;
}

Natija:

coord x = 10
coord y = 20
weight w = 1.500000

Masalan, to’g’ri to’rtburchak chiziqlardan tashkil topgan. Chiziq esa ikki nuqta orqali aniqlanadi. Har bir nuqta x va u koordinatalar yordamida aniqlanadi. Quyidagi dasturda to’rtburchak strukturasi ko’rsatilgan. To’g’ri to’rtburchak diagonal bo’yicha ikki nuqta va ikki tomon yordamida aniqlanadi. Shuning uchun oldin har bir nuqtaning x, u koordinatalarini saqlash uchun nuqta strukturasi e’lon qilingan. Nuqta va to’g’ri to’rtburchakning e’lon qilinishi:

#include<stdio.h>
typedef struct
{
    int x;
    int y;
}
Point;
Point KPoint(int x1, int y1)
{
    Point p;
    p.x = x1; p.y = y1;
    return p;
}
typedef struct
{
    Point p1, p2;
    int a, b;
}
Rectangle;
Rectangle KRectangle(int x1, int y1, int x2, int y2)
{
    Rectangle r;
    r.p1 = KPoint(x1, y1);
    r.p2 = KPoint(x2, y2);
    r.a = x2 - x1;
    r.b = y2 - y1;
    return r;
}
int Per(Rectangle p)
{
    return 2 * (p.a + p.b);   
}
int Sq(Rectangle p)
{
    return p.a * p.b;
}
int main()
{
    Rectangle X;
    X = KRectangle(10, 20, 50, 80);
    printf("Perimetr = %d\n", Per(X));
    printf("Yuza = %d", Sq(X));
    return 0;
}
Perimetr = 200 Yuza = 2400