Задачи со покажувачи


Пристап до елементите на низа ( 4 начини)

#include <iostream>//pristapuvanje na elementi na niza b na 4 razlicni nacini
using namespace std;
int main()
{
int b[]={10,20,30,40};
int *bPtr =b;
cout<<b[0]<<endl;    //10
cout<<*b<<endl;      //10
cout<<bPtr[0]<<endl; //10
cout<<*bPtr<<endl;   //10

cout<<"Pecatenje na nizata b so indeksiranje\n"<<endl; 
for (int i=0; i<4; i++)
cout<<"b["<<i<<"]= "<<b[i]<<'\n';

cout<<"Pecatenje na nizata b koristejki go imeto na nizata kako pokazuvac\n"; 
cout<<"Slucaj pokazuvac/pomestuvanje\n"<<endl;
for (int j=0; j<4;j++)
cout<<"*(b+ "<<j<<")= "<<*(b+j)<<'\n';

cout<<"Pecatenje na nizata b koristejki indeksiranje na pokazuvac\n"<<endl; 
for (int p=0;p<4;p++)
cout<<"bPtr["<<p<<"]= "<<bPtr[p]<<'\n';

cout<<"Pecatenje na nizata b koristejki pokazuvac\n";  
cout<<"Slucaj pokazuvac/pomestuvanje\n"<<endl; 
for(int q=0;q<4;q++)
cout<<"*(bPtr + "<<q<<")= "<<*(bPtr + q)<<'\n';
return 0;
}

OUTPUT 
10
10
10
10
Pecatenje na nizata b so indeksiranje

b[0]= 10
b[1]= 20
b[2]= 30
b[3]= 40
Pecatenje na nizata b koristejki go imeto na nizata kako pokazuvac
Slucaj pokazuvac/pomestuvanje

*(b+ 0)= 10
*(b+ 1)= 20
*(b+ 2)= 30
*(b+ 3)= 40
Pecatenje na nizata b koristejki indeksiranje na pokazuvac

bPtr[0]= 10
bPtr[1]= 20
bPtr[2]= 30
bPtr[3]= 40
Pecatenje na nizata b koristejki pokazuvac
Slucaj pokazuvac/pomestuvanje

*(bPtr + 0)= 10
*(bPtr + 1)= 20
*(bPtr + 2)= 30
*(bPtr + 3)= 40

Што ќе се прикаже по извршување на програмите 

// my first pointer
#include <iostream>
using namespace std;
int main ()
{
  int firstvalue, secondvalue;
  int * mypointer;

  mypointer = &firstvalue;
  *mypointer = 10;
  mypointer = &secondvalue;
  *mypointer = 20;
  cout << "firstvalue is " << firstvalue << endl;
  cout << "secondvalue is " << secondvalue << endl;
  return 0;
}

// C++ Program to demonstrate working of
// function using pointers
#include <iostream>
using namespace std;
void fun(int* ptr) { *ptr = 30; }
int main()
{
    int x = 20;
    fun(&x);
    cout << "x = " << x;
    return 0;
}

// more pointers
#include <iostream>
using namespace std;
int main ()
{
  int firstvalue = 5, secondvalue = 15;
  int * p1, * p2;

  p1 = &firstvalue;  // p1 = address of firstvalue
  p2 = &secondvalue; // p2 = address of secondvalue
  *p1 = 10;          // value pointed by p1 = 10
  *p2 = *p1;         // value pointed by p2 = value pointed by p1
  // p1 = p2;           // p1 = p2 (value of pointer is copied)
  *p1 = 20;          // value pointed by p1 = 20
  
  cout << "firstvalue is " << firstvalue << endl;   // 20
  cout << "secondvalue is " << secondvalue << endl; // 10
  return 0;
}

Што ќе се прикаже по извршување на следните програми 

#include <iostream>
using namespace std;
int main()
{ int i,j;
i=1;j=10;
int *p=&j;
*p *=*p;
i=i+j;
p=&i;
cout<<"Vrednosta na p ="<<*p<<" adresata e "<<p<< endl;
cout<<"i= "<<i;
return 0;
}
Output 
Vrednosta na p =101 adresata e 0x7fff5c00aa28
i= 101
#include<iostream>  
using namespace std;    
void swap(int *x, int *y)  
{  
 int swap;  
 swap=*x;  
 *x=*y;  
 *y=swap;  
}  
int main()   
{    
 int x=500, y=100;    
 swap(&x, &y);  // passing value to function  
 cout<<"Vrednosta na x e: "<<x<<endl;  
 cout<<"Vrednosta na y e: "<<y<<endl;  
 return 0;  
}    
Vrednosta na x e 100
Vrednosta na y e 500

Што ќе се испечати 
#include <iostream>
using namespace std;
const int MAX = 3;
int main()
{
int a[MAX] = { 10, 100, 200 };
int *pok;
// adresa na prviot element na koj pokazuva pokazuvacot
pok = a;
int i = 0;
cout << "Adresi na elementite vo niza "<<endl;
while (pok <= &a[MAX - 1])
{
cout << "a [" << i << "] = ";
cout << pok << endl;
pok++;
i++;
}
pok=a;
i=0;
cout << "Vrеdnost na elementite vo niza"<<endl;
while (pok <= &a[MAX - 1])
{
cout << "a [" << i << "] = ";
cout <<*pok << endl;
pok++;
i++;
}
return 0;
}

Внеси вредности на две променливи и собери ги. Прикажи ја вредноста на променливите, нивниот збир и вредноста на адресите на сите користени променливи.

#include <iostream>
using namespace std;
int main() 
{
int a, b, c, *pa, *pb, *pc;
pa = &a;
pb = &b;
pc = &c;
cout<<"\nVnesi dva broja "<<endl;
cout<< "a= "; cin>>a;
cout<< "b= "; cin>>b;
*pc = *pa + *pb;
cout<<"\na = "<< *pa<<" adresata e " << pa;
cout<<"\nb = " << *pb<<" adresata e " << pb;
cout<<"\nc = a+b =" << *pc<<" adresata e "<< pc;
return 0;
}

Vnesi dva broja
a= 2
b= 12
a = 2 adresata e 0x7ffeddbf16b4
b = 12 adresata e 0x7ffeddbf16b8
c = a+b =14 adresata e 0x7ffeddbf16bc

Да се најде max од  3 внесени броја 

#include <iostream>
using namespace std;
int main() {
int a, b, c, max, *pa, *pb, *pc, *pmax;
pa = &a;
pb = &b;
pc = &c;
pmax = &max;
cout<<"\nVnesi 3 broja: ";
cin>>a>> b>> c;
*pmax = *pa;
if (*pb > *pmax)
  *pmax = *pb;
if (*pc > *pmax)
*pmax = *pc;
cout<<"\nNajgolem broj e "<< *pmax;
return 0;
}

Да се најде најмалиот елементи во низа со н елементи 

# include <iostream>
using namespace std;
int main()
{
 int a[50];
 int n,i,min;
 cout<<"vnesi dolzina na nizata"<<endl;
 cin>>n;
 cout<<"vnesi gi elementite na nizata"<<endl;
 for (i=0; i<n; i++)
 cin>>*(a+i);
 min=*(a);
 for (i=1; i<n; i++)
 if (*(a+i)<min)
 {
 min=*(a+i);
 }
 cout<<"najmal e elementot "<<min<<endl;
 return 0;
}

Внеси 10 броеви. Пресметај колку од нив се парни деливи со 5 и непарни деливи со 3

#include <iostream>
using namespace std;
int main() {
int i, br, parnih=0, neparnih=0, *pbr, *pparn, *pnepar;
pbr = &br;
pparn = &parnih;
pnepar = &neparnih;

for (i = 0; i < 10; i++) 
{
cout<<"Vnesi go "<< i+1<<"  broj : ";
cin>>br;
if (*pbr % 2 == 0 && *pbr % 5 == 0)
   (*pparn)++;
if (*pbr % 2 == 1 && *pbr % 3 == 0)
    (*pnepar)++;
}
cout<<"\nParni delivi so 5 = "<< *pparn;
cout<<"\nNeparni delivi so 3 = "<< *pnepar;
return 0;
}

Внеси n знаци и преброј колку од нив се цифри .

#include <iostream>
using namespace std;
int main()
{
 int i, br=0, *pbr=0,n;
 char zn, *pzn;
 pbr = &br;
 pzn = &zn;
 cout<<" vnesi broj na znaci"<<endl;
 cin>>n;
 for (i = 1; i <=n; i++)
 {
  cout<<" vnesi znak "<<endl;
  cin>>*pzn;
  if (*pzn >= '0' && *pzn <= '9')
  (*pbr)++;
  }
cout<<"vneseni se "<<*pbr<<" cifri";
 return 0;
}


Внесувај броеви се додека не се внесе 0 (нула). Пресметај колку од внесените броеви се помеѓу 10 и 20. Прикажи го најмалиот број .

#include <iostream>
using namespace std;

int main() {
int i, br, min=0, brojac=0, *pbr, *pmin, *pbrojac;
pbr = &br;
pmin = &min;
pbrojac = &brojac;
i = 1;
cout<<"Vnesuvaj broevi, za kraj vnesuvanjeto vnesi nula:"<<endl;
cout<<"Vnesi broj: ";
cin>>br;
*pmin = *pbr;
while (*pbr != 0) 
      {
if (*pbr >=10 && *pbr <= 20)
(*pbrojac)++;
if (*pbr < *pmin)
*pmin = *pbr;
i++;
cout<<"Vnesi broj: ";
cin>>br;
}
cout<<"\nBroevi pomegu 10 i 20 ima = "<< *pbrojac;
cout<<"\nNajmal broj e "<<*pmin;
return 0;
}

Внеси низа а од n елементи. Пресметај го збирoт на парните и збирот на непарните елементи во низата 
Решение 1:
#include<iostream>
using namespace std;
int main()
{
int i,n,zbp=0,zbn=0,a[50];
cout<<"Vnesi broj na elementi na nizata n ";
cin>>n;
cout<<"Vnesi ja nizata ";
for(i=0;i<n;i++)
cin>>*(a+i);
for(i=0;i<n;i++)
{    if(*(a+i)%2==0)
zbp+=*(a+i);
}
for(i=0;i<n;i++)
{      if(*(a+i)%2!=0)
zbn+=*(a+i);
}
cout<<"Zbir na parni "<<zbp<<endl;
cout<<"Zbir na neparni "<<zbn<<endl;
return 0;
}
Решение 2:
#include <iostream>
using namespace std;
int main()
{
    int n, m[100], *p = m, pe = 0, ne = 0, *ppe = &pe, *pne = &ne;
    cout<<"Vnesi broj na elementi na nizata n= ";
    cin >> n;
    cout<<"Vnesi gi elementite "<<endl;
    //vnesuvanje na elementi
    for(int i = 0; i < n; i++) {
        cin >> *p;
        p++;
    }
    // odreduvanje zbir na parni / neparni elementi 
    p = &m[0];
    for(int i = 0; i < n; i++) {
        if(*p % 2)
            *pne+=*p;
        else
            *ppe+=*p;
        p++;   
    }
    cout <<"Zbirot na neparni e "<< *pne << endl;
    cout<<"Zbirot na parni e "<< *ppe<<endl;
    return 0;
}
Решение 3:
# include <iostream>
using namespace std;
int main()
{
 int a[100];
 int n,i,zp,zn;
 cout<<"vnesi dolzina na nizata"<<endl;
 cin>>n;
 cout<<"vnesi gi elementite na nizata"<<endl;
 for (i=0; i<n; i++)
 cin>>*(a+i);
 zp=0;
 zn=0;
 for (i=0; i<n; i++)
 if (*(a+i)%2 == 0) zp+=*(a+i);
 else zn+=*(a+i);
 cout<<"zbirot na parnite broevi vo nizata e "<<zp<<endl;
 cout<<"zbirot na neparnite broevi vo nizata e "<<zn<<endl;
 return 0;
}

Внеси низа а со n елементи. Формирај нова низа чии елементи ќе бидат елементи од низата а, кои имаат вредност помала од елементот на втора позиција во низата а. 

#include <iostream>
using namespace std;
int main ()
{
int a[100],n,c[100],x=0;
int *p[100],*q[100];
cout<<"Vnesi broj na elementi na nizata a n= ";
cin>>n;
cout<<"Vnesi gi elementite na nizata a: "<<endl;
for (int i=0;i<n;i++)
{
p[i]=&a[i];
cin>>*p[i];
}
for (int i=0;i<n;i++)
{
q[x]=&c[x];
if (*p[i]<*p[1])
{
*q[x]=*p[i];
x++;   }
}
cout<<"Novata niza e ";
for (int i=0;i<x;i++)
cout<<*q[i]<<" ";
}

Внеси знаковна променлива zn.  Ако е знакот  'j', 'd', 't', 'c', 'p' треба  да се отпечати вредноста - редослед на појавување на буквата во листата. со букви и број 
(На пример. за 'd' треба да се отпечати два 2, за 'c' да се отпечати четири 4).

Ако е внесен знак кој не е во листата треба само да се отпечати */

#include<iostream>  
using namespace std;    
int main() {
int i, br, *pbr;
char zn, *pzn;
pzn = &zn;
pbr = &br;
cout<<"Vnesi znak: ";
cin>>pzn;
switch ((int)*pzn) {
case 'j':
cout<<"\nedеn  ";
*pbr = 1;
cout<<br;
break;
case 'd':
cout<<"\nDva ";
*pbr = 2;
cout<<br;
break;
case 't':
cout<<"\nTri ";
*pbr = 3;
cout<< br;
break;
case 'c':
cout<<"\nČetiri ";
*pbr = 4;
cout<< br;
break;
case 'p':
cout<<"\nPet ";
*pbr = 5;
cout<< br;
break;
default:
cout<<"\nVnesen e znak "<<*pzn;
}
return 0;  }

Да се подредат елементите на дадена низа во растечки редослед 

Решение 1 
#include <iostream>
using namespace std;
int main () {
    int a[50];
    int n;
     cin>>n;
    for (int i = 0; i < n; i++) {
        cin>>*(a + i);       }
    int x;
    for (int i = 0; i < n; i++) {
        for (int j = i+1; j < n; j++) {
            if ( *(a + j) < *(a + i) ) 
        {         x = *(a + i);                   
                *(a + i) = *(a + j);        
                *(a + j) = x;        }  
        }    
    }
    for (int i = 0; i < n; i++) {
        cout<< *(a + i) << "\t";       }
    return 0;
}

Решение 2 
#include <iostream>
using namespace std;
int main()
{
    int a[50];
    int n;
    cout<<"Vnesi golemina na nizata: ";
    cin>>n;
    
    for(int i = 0; i < n; i++){
        cout<<"A["<<i<<"] = ";
        cin>>a[i];
    }
    for(int k = 0; k < n; k++){
        for(int i = 1; i < n; i++){
            if(a[i - 1] > *(a + i))  {
                swap(a[i - 1], *(a + i));   }
        }
    }
     for(int i = 0; i < n; i++){
        cout<<*(a + i)<<"   ";
     }
    return 0;
}

Определи дали даден број е прост 

#include <iostream>
using namespace std;

int main() {
int i, brojac=0, a, *pbr, *pa;
pbr = &brojac;
pa = &a;

cout<<"Vnesi broj: ";
cin>>*pa;
for (i = 2; i <= *pa/2; i++)
if(*pa % i == 0)
(*pbr)++;
if (*pa == 1)
cout<<"Brojot 1 ne e definiran";
else
if (*pbr == 0)
cout<<"\nBrojot e prost!";
else
cout<<"\nBrojot ne e  prost";
return 0;
}

/*Dadena e ednodimenzionalna niza so n elementi se kreiraat 2 novi nizi prvata so ednocifreni elementi, a drugata site ostanati  elementi. Pri formiranje na novite nizi popolni gi so 0 elementite od dadenata niza koi ne go zadovoluvaat uslovot */
#include <iostream>
using namespace std;
int main()
{
    int a[50];
    int n;
    cout<<"Vnesi golemina na nizata; ";
    cin>>n;
    
    for(int i = 0; i < n; i++){
        cout<<"A["<<i<<"] = ";
        cin>>*(a+i);
    }
    int b[50];
    int c[50];
    for(int i = 0; i < n; i++){
        if(*(a + i) < 10){
            b[i] = *(a + i);
            c[i] = 0;
        }
        else{
            c[i] = *(a + i);
            b[i] = 0;
        }
    }
    for(int i = 0; i < n; i++){
    cout<<b[i]<<"    ";
    }
    cout<<endl;
    for(int i = 0; i < n; i++){
    cout<<c[i]<<"    ";
    }
    return 0;
}

/*Dadena e ednodimenzionalna niza so n elementi se kreiraat 2 novi nizi Prvata da gi ima elementite od prvata desetka,  a drugata da gi ima site drugi elementi*/
#include <iostream>
using namespace std;

int main()
{
    int a[50];
    int n;
    int br=0,bro=0;
    cout<<"Vnesi golemina na nizata; ";
    cin>>n;
      for(int i = 0; i < n; i++){
        cout<<"A["<<i<<"] = ";
        cin>>*(a+i);
    }
    int b[50];
    int c[50];
        for(int i = 0; i < n; i++){
        if(*(a + i) < 10 &&  *(a + i)>0)  {
            b[br] = *(a + i);
            br++;
        }
        else{
            c[bro] = *(a + i);
            bro++;
        }
    }
    
    for(int i = 0; i <br; i++){
    cout<<b[i]<<"    ";
    }
       cout<<endl;
       for(int i = 0; i < bro; i++){
    cout<<c[i]<<"    ";
    }
    return 0;
}


No comments: