/****************************************
*
*   C/C++ vaja X_2
*
*   utrjevanje /2      
*/
 
 
1.Naloga
 
  Dane so naslednje deklaracije :
 
        a)      int g1();
        b)      int g1(int);
        c)      int g1(char);
        d)      int g1(int,int);
        e)      int g1(char,int);
 
  p1) Katera od funkcij se bo izvedla, če uporabimo klic : int fff=g1('A');
  p2) Napišite klice za vsako izmed možnosti od a) do e), ki bi tudi v primeru sočasne deklaracije
      vseh omenjenih funkcij vedno klicala ustrezno !
  p3) Katera so dejstva, ki enolično ločijo C oz. C++ funkcijo izmed množice podobnih ?
 
 
Rešitev:
 
Izvedla bi se samo funkcija pod opcijo a in c.
Int gl();
Int gl(5);
Int gl(b);
Int gl(5,4);
Int gl(´b´,5);
 
 
2.Naloga
 
  a) Napišite podprogram, ki bo izračunal in vrnil vsoto dveh podanih parametrov. Podprogram je podan s
  prototipom :
 
        long vsota(int,int)    ;
 
Rešitev:
#include<stdio.h>
#include<iostream.h>
 long vsota(int a,int b)
   {
    return(a+b);
    }
 int main (void){
    vsota(4,5);
   return 0;
 }
  
 
b) Dopišite še podprograme, ki bodo omogočali izračun produkta, razlike, celoštevilčnega kvocienta
     dveh parametrov.
 
Rešitev:
 
#include<stdio.h>
#include<iostream.h>
 long vsota(int a,int b)
   {
    return(a+b);
    }
 long produkt(int a,int b)
 {
   return(a*b);
   }
long razlika (int a,int b){
  return(a-b);
  }
long kvocient(int a,int b){
      return(a/b);
  }
  int main (void){
    produkt(4,5);
    kvocient(4,5);
    razlika(4,5);
    vsota(4,5);
   return 0;
}
3.Naloga
 
  Napišite C-jevski podprogram, ki bo izmed petih podanih parametrov izločil in vrnil srednjega po vrednosti.
 
Rešitev:
#include<iostream.h>
#include<stdio.h>
int vrnisrednjega(int a,int b,int c,int d,int e)
{
 int  vsota=0;
 float pop;
 cin>>a;
 cin>>b;
 cin>>c;
 cin>>d;
 cin>>e;
 vsota=a+b+c+d+e;
  pop=vsota/5;
 return pop;
 }
main (void) {
int vrnisrednjega(int a,int b,int c,int d,int e);
return 0;
}
 
 
4.Naloga
 
  Dan je program:
 
  // poveca vrednosti parametrov za 'koliko'
  void povecajVrednostiParametrov(int p1, int p2, int p3, int p4, int p5, int koliko){
     p1+=koliko; p2+=koliko; p3+=koliko;p4+=koliko;p5+=koliko;
  }
 
  int main(){
    
    int a=1,b=2,c=3,d=4,e=5;
    povecajVrednostiParametrov(a,b,c,d,e,5);    
 
    cout << a << b << c << d <<e;
 
    return 0;
  }
 
 
   Ugotovite, zakaj program ne deluje kot bi želeli !
 
Rešitev:
 
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
void povecajVrednostiParametrov(int &p1,int &p2,int &p3,int &p4,int &p5,int &koliko)
{
     p1+=koliko;
     p2+=koliko;
     p3+=koliko;
     p4+=koliko;
     p5+=koliko;
 }
  int main(){
  clrscr();
   int a=1,b=2,c=3,d=4,e=5;
   povecajVrednostiParametrov(a,b,c,d,e,5);
    cout << a << b << c << d <<e;
    return 0;
  }
 
Ni delal ker ni bilo prenesen po referenci!
 
5.Naloga
 
  Popraviti smo zeleli program iz naloge 4, pa nam ni najbolj uspelo. Razložite, kje se pojavi napaka
  in kaj bi bilo potrebno popraviti, da bi program deloval pravilno.
 
   // poveca vrednosti parametrov za 'koliko'
  void povecajVrednostiParametrov(int *p1, int *p2, int *p3, int *p4, int *p5, int koliko){
     p1+=koliko; p2+=koliko; p3+=koliko;p4+=koliko;p5+=koliko;
  }
 
  int main(){
    povecajVrednostiParametrov(1,2,3,4,0,5);    
   return 0;
  }
 
Rešitev:
 
V prototipu ne sme biti kazalcev ampak more biti prenesen po referenci! 
 
 
Program naj bi zgledal takole!
 
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
void povecajVrednostiParametrov(int &p1,int &p2,int &p3,int &p4,int &p5,int &koliko)
{
     p1+=koliko;
     p2+=koliko;
     p3+=koliko;
     p4+=koliko;
     p5+=koliko;
 }
  int main(){
  clrscr();
   int a=1,b=2,c=3,d=4,e=5;
   povecajVrednostiParametrov(a,b,c,d,e,5);
    cout << a << b << c << d <<e;
    return 0;
  }
 
6.Naloga
 
  Kaj je narobe z naslednjo modifikacijo programa iz 4, naloge ?
 
 
  // poveca vrednosti parametrov za 'koliko'
  void povecajVrednostiParametrov(int *p1, int *p2, int *p3, int *p4, int *p5, int koliko){
     *p1+=koliko; *p2+=koliko; *p3+=koliko;*p4+=koliko;*p5+=koliko;
  }
  int main(){
    int a=1,b=2,c=3,d=4,e=5;
    povecajVrednostiParametrov(a,b,c,d,e,5);    
    cout << a << b << c << d <<e;
   return 0;
  }
Rešitev:
 
Spremenljivke so deklarirane kot kazalci pa ne bi smele biti, ker bi morle biti prenesene po referenci z znakom &. 
 
7.Naloga
 
  Kako bi bilo potrebno modificirati program, da bi namesto naslovov sprememnljivk (kazalčnih) uporabili
  reference.
 
Rešitev:
Enotavno namesto * damo &.
 
8.Naloga
 
  Napišite sled izvajanja naslednjega programa :
 
  int nekaj(int,int);
  int nekaj1(int a, int *b){
      a++;
      *b+=3*a;
      int c=nekaj(a,b);
     return c;
  }
  int nekaj(int b, int a){   
      a++;
      b+=3*a;
     return b;
  }
  void main(){
   int a=3,b=1,c=2;
   cout << a << b << c;
   a= nekaj1(b,c);
   c=nekaj(a,b);
   cout << a << b << c;
  }