Оператор struct - потребителски дефиниран тип данни структура

Най-често използваните типове променливи в приложните програми са били винаги от предварително определен от езика за програмиране тип. Масивите са типичен пример за обединяване на множество променливи, при декларирането им се посочва един и само един определен тип на променливата. Различията между масив и потребителски дефиниран тип данни struct са съществени. В един масив всички данни задължително са от един и същи тип, в struct данните могат да бъдат от различен тип. Възможно е да се декларира масив с тип данни struct, както и потребителски дефиниран тип данни struct с отделни полета масиви.

Скаларният тип данни са вградените в езика, такива като double, float, int, long и др. Скаларните типове данни се делят на дискретни (изброими - цели числа) и приближени (с плаваща точка - рационални числа). Тези видове се наричат също стандартен тип данни. В хода на изграждане на програмата могат да се дефинират допълнителни, потребителски дефиниран тип данни, които програмистът създава съобразно конкретните изисквания.
При реализиране на конкретен алгоритъм често се налага информацията за конкретен обект (асоциативно свързана информация) да ползва данни от различен тип.
Тук ще въведем понятието структура – struct е оператор, служебна дума в езика C++.
Описание на оператор struct: struct koord {double x,y;}; - служебната дума struct, името на променливата, във фигурни скоби се изброяват типа и имената на съставните променливи. В много езици за програмиране, променливите участващи в една структура се наричат нейни полета. Причината, е че лесно могат да се формират таблици от данни, в които колоните са отделните променливи в struct, а редовете (подобно на масив) са отделните променливи от тип struct.
Нека разгледаме следната задача:
Дадени са координати на точка и координатите на двете крайни точки от диаметъра на окръжност. Координатите са реални числа от предварително определен числов интервал.
Търси се взаимното положение на точката спрямо тази окръжност. В най-общия случай те са 3:
а) точката принадлежи на окръжността - разстоянието между точката и центъра на окръжността е по-малко от радиуса.
б) точката лежи на окръжността - разстоянието между точката и центъра на окръжността е равно на радиуса.
в) точката не принадлежи на окръжността - разстоянието между точката и центъра на окръжността е по-голямо от радиуса.
Алгоритъмът налага изчисляване на координатите на центъра както и радиуса на окръжността.
Центъра на окръжността е средната точка на отсечката, определена с двете крайни точки на диаметъра – изчислява се като полусума по съответните координатни оси.
Радиусът на окръжността се изчислява чрез теоремата на Питагор – дължините на двата катета са разликите в координатите на двете точки.
Можем да използваме масив с данни от тип структура обединяващи координатите на: точката, краищата на диаметъра и центъра на окръжността, но вече свързани в един елемент от масива.
В примерното решение се ползва сравняване между квадрата на разстоянието между центъра и точката с квадрата на радиуса на окръжността с цел избягване на бавната операция коренуване.
#include<iostream>
#include<cmath>
using namespace std;
 
const double epsil=0.000001;// granica za greshka
struct koord {double x,y;};//deklarirane na promenliwa ot tipa struct 
 
double whod(koord mas[])
{ double rad;
  cout<<"Wywedete koordinati na tochka po X [1..100]: ";cin>>mas[0].x;
  cout<<"Wywedete koordinati na tochka po Y [1..100]: ";cin>>mas[0 ].y;
  cout<<"Wywedete koordinati na diametyr po X [1..100]: ";cin>>mas[1].x;
  cout<<"Wywedete koordinati na diametyr po Y [1..100]: ";cin>>mas[1].y;
  cout<<"Wywedete koordinati na diametyr po X [1..100]: ";cin>>mas[2].x;
  cout<<"Wywedete koordinati na diametyr po Y [1..100]: ";cin>>mas[2].y;
  //sredata na otsechkata e centyr na okryvmnostta
  mas[3].x = ( mas[1].x + mas[2].x )/2;
  mas[3].y = ( mas[1].y + mas[2].y )/2;
   //kwadrata na diametyr po Pitagor
 rad= (mas[1].x - mas[2].x)*(mas[1].x - mas[2].x) + (mas[1].y - mas[2].y)*(mas[1].y - mas[2].y);
  return rad;
}//double whod - struct   
 
 void smetki(koord mas[], double rad)
 { 
double dist;
 //srawnqwaneto za rawenstwo mevdi dwe chisla ot tipa double wodi do problem
 //razstoqnie mevdu tochka i centyr na okryvnostta po Pitagor
dist=4*((mas[0].x-mas[3].x)*(mas[0].x-mas[3].x) + (mas[0].y-mas[3].y) * (mas[0].y-mas[3].y));
// cout<<dist<<":"<<rad<<endl;
//sreanqwame 2 promenliwi ot tipa double za rawenstwo
  if (fabs(rad-dist)<epsil)  cout<<"tochkata levi na okryvnostta.\n";
   else {
    if (rad>dist)   cout<<"tochkata levi wytre w okryvnostta.\n";
    else cout<<"tochkata levi izwyn okryvnostta.\n";//if (rad<dist)
   }
}//smetki tochka okryvnost 

int main()
{koord mas[4];//  0 - tochka 1, 1-wi kraj na diam, 2 -2-ri kraj na diam, 3 - centyr
 double rad;
 char ose;
cout<<"Dadeni sa 3 dwojki stojnosti-realni chisla ot interwala [-100..100].";
cout<<"Wsqka dwojka predstawlqwa  koordinati na tochka w rawninata po X,Y.\n";
cout<<"Pyrwata dwjka koordinati sa na tochka, a wtorite 2 dwjki opiswat\n";
cout<<"nachalna i krajna tochka na diametyr ot okryvnost.\n";
cout<<"Da se systawi programa, chrez koqto po wywedeni koordinati za\n";
cout<<"tochka, i dwe krajni tochki na diametyr se izwevda syobshenie\n";
cout<<"dali tochkata prinadlevi, levi na ili e izwyn okryvnostta.\n";
cout<<"Primer:5,5; 10,10; 0,0 Izhod: tochkata levi wytre w okryvnostta. \n";

 do {
 rad=whod(mas);//wywevdane koordinati
 smetki(mas, rad);//izchislqwane i sypostawqne radius - razstoqnie centyr-tochka
  cout<<"She wywevdate li drugi danni <y/n>: ";cin>>ose;
 }while (ose=='y');
 return 0;
}//kraj na programa struct 

Подобни задачи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени примери.

Начало на страницата

 
Размер на шрифта
Increase Font Size Option 3 Reset Font Size Option 3 Decrease Font Size Option 3
Bulgarian Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Търсене в сайта: