Friday, January 22, 2016

პოსტის მანქანა


პოსტის მანქანა არის ჰიპოტეტური მანქანა. ის შესდგება უსასრულო ლენტისაგან, რომელიც გაყოფილია სექციებად. ყოველ მომენტში სექცია შეიძლება იყოს ცარიელი __ან შევსებული _1_. ლენტის შევსებული და ცარიელი სექციების ერთობლიობას უწოდებენ ლენტის მდგომარეობას. მანქანას გააჩნია თავაკი, რომელიც აღინიშნება M ასოთი, ის ყოველთვის იმყოფება ზუსტად რომელიმე სექციის ქვეშ.
მანქანას შეუძლია შეასრულოს შემდეგი მოქმედებები:
1.      თავაკი გადაადგილდეს ერთი სექციით მარჯვნივ ან მარცხნივ;
2.      ჩაწეროს ცარიელ სექციაში ერთიანი, ან წაშალოს შევსებული სექციიდან ერთიანი;
3.      "გაარკვიოს" სექციაში, რომლის ქვეშაც თავაკი დგას, შევსებულია თუ არა (წერია თუ არა 1);
4.      დაამთავროს მუშაობა - გაჩერდეს;

პოსტის მანქანის ბრძანებები:
1.    თავაკის მარცხნივ გადაადგილება: ბრძანების სახელია L(Left)
მაგ,: 02: L-03
ეს ნიშნავს თავაკის ერთი სექციით მარცხნივ გადაადგილებას, შემდეგი შესასრულებელი ბრძანება კი იქნება ბრძანება ნომრით 03.

2.    თავაკის მარჯვნივ გადაადგილება: ბრძანების სახელია R(Right)
მაგ,: 04: L-06
ეს ნიშნავს თავაკის ერთი სექციით მარჯვნივ გადაადგილებას, შემდეგი შესასრულებელი ბრძანება კი იქნება ბრძანება ნომრით 06.

3.    სექციის შევსება, ბრძანების სახელია 1
მაგ.: 05: 1-06
ამ ბრძანების შესრულებისას თუ სექცია ცარიელია, ჩაიწერება 1, შემდეგი შესასრულებელი ბრძანებაა 06. თუ სექცია შევსებულია მოხდება ავარიული გაჩერება. ბრძანების შესრულების შემდეგ თავაკი მდებარეობას არ იცვლის.

4.    სექციის გასუფთავება, ბრძანების სახელია 0
მაგ.: 05: 0-06
ამ ბრძანების შესრულებისას თუ სექცია შევსებულია ჩაიწერება 0, შემდეგი შესასრულებელი ბრძანებაა 06. თუ სექცია ცარიელია, მოხდება ავარიული გაჩერება. ბრძანების შესრულების შემდეგ თავაკი მდებარეობას არ იცვლის.

5.    გაჩერება, ბრძანების სახელია Q(Quit).
09: Q
ამ ბრძანების შესრულების შემდეგ პროგრამა ამთავრებს მუშაობას, თავაკი ინარჩუნებს საბოლოო მდებარეობას, ამ შემთხვევაში ამბობენ რომ ადგილი აქვს შედეგიან გაჩერებას.

6.      განშტოების ბრძანება, ბრძანების სახელია I (if)
მაგ.:  03: I-04-05
ეს ნიშნავს თუ სექცია , რომლის ქვეშაც დგას თავაკი, ცარიელია- მართვა გადაეცემა 04 ბრძანებას(ანუ შემდეგი შესასრულებელი ბრძანებაა 04 ნომრიანი ბრძანება), ხოლო თუ სექცია შევსებულია-მართვა გადაეცემა 05 ბრძანებას

˜ პროგრამაში ბრძანებები ინომრება მიმდევრობით 01 - დან დაწყებული( 01, 02, 03, ...). პროგრამა იწყება 01 ნომრიანი ბრძანებით. არ შეიძლება გადასვლა ისეთ ნომრიან ბრძანებაზე რომელიც პროგრამაში არ გვაქვს.

მაგალითი:
პოსტის მანქანის საწყისი მდებარეობაა:


1



1
1



               M
შევადგინოთ პროგრამა, რომელიც მარჯვნივ პირველ ერთიანამდე ცარიელ სექციებს შეავსებს(ჩაწერს 1-იანებს).

01: R-02
02: 1-03
03: R-04
04: 1-05
05: R-06
06: 1-07
07: Q

ან ზოგადად (როცა ცარიელი სექციების რაოდენობა უცნობია)
01: R-02
02: I-03-04
03: 1-01
     04: Q

1
1
1
1
1
1



                                                  M



 პრეზენტაციის ლინკი: https://www.dropbox.com/s/tnt78yet25zcn5x/99772%20%281%29.pptx?dl=0

თანრიგებით დალაგება C



#include "stdio.h"

#define MAX 100

#define SHOWPASS



void print(int *a, int n) {

 int i;

 for (i = 0; i < n; i++)

  printf("%d\t", a[i]);

}



void radix_sort(int *a, int n) {

 int i, b[MAX], m = 0, exp = 1;

 for (i = 0; i < n; i++) {

  if (a[i] > m)

   m = a[i];

 }



 while (m / exp > 0) {

  int box[10] = { 0 };

  for (i = 0; i < n; i++)

   box[a[i] / exp % 10]++;

  for (i = 1; i < 10; i++)

   box[i] += box[i - 1];

  for (i = n - 1; i >= 0; i--)

   b[--box[a[i] / exp % 10]] = a[i];

  for (i = 0; i < n; i++)

   a[i] = b[i];

  exp *= 10;



#ifdef SHOWPASS

  printf("\n\nPASS   : ");

  print(a, n);

#endif

 }

}

int main() {

 int arr[MAX];

 int i, num;



 printf("\n sheiyvanet elementebis raodenoba (raodenoba unda iyos < %d) : ", MAX);

 scanf("%d", &num);



 printf("\n sheiyvanet %d elementi : \n", num);

 for (i = 0; i < num; i++)

  scanf("%d", &arr[i]);



 printf("\n tqven mier sheyvanili elementebi  : ");

 print(&arr[0], num);



 radix_sort(&arr[0], num);



 printf("\n\n Dalagebuli zrdadobit  : ");

 print(&arr[0], num);



 return 0;

}



პრეზენტაციის ლინკი:  https://www.dropbox.com/s/v2mr7adqerav1cg/109029.pptx?dl=0

მონაცემთა სტრუქტურები



სტრუქტურული ტიპის მონაცემები გამოიყენება, როდესაც გვინდა ერთი სახელის ქვეშ განსხვავებული მონაცემების გაერთიანება. სტრუქტურის სინტაქსი ასეთია:
struct structure_name

{

    data_type member1;

    data_type member2;

    .

    .

    data_type memeber;

};
მაგალითად ჩვენ შეგვიძლია შევქმნათ პიროვნების სტრუქტურა, შემდეგი ველებით: სახელი, ხელფასი
struct person
{
    char name[50];
    float salary;
};
ამ სტრუქტურის შესაბამისი ცვლადები შეიძლება აღვწეროთ main()-ში:
struct person p1, p2, p[20];
ან გამოვაცხადოთ ეს ცვლადები თვითონ სტრუქტურის აღწერისას:
struct person
{
    char name[50];
    float salary;
} p1, p2, p[20];
ამოცანა: მოცემულია წერტილი კოორდინატებით x და y, შეადგინეთ წერტილის სტრუქტურა და იპოვეთ მანძილი კოორდინატთა სათავიდან ამ A(x,y) წერტილამდე


ამოხსნა:

#include <conio.h>
#include <stdio.h>
#include <math.h>
 struct point_t {
    int x;
    int y;
};
 int main() {
    struct point_t A;
    float distance;
     A.x = 10;
    A.y = 20;
     distance = sqrt((float) (A.x*A.x + A.y*A.y));
     printf("distance = %.3f", distance);
    getch();
}