****************************************
*
*   C/C++ vaja X_3
*
*
*       utrjevanje /3
*
*/
 
1.naloga
 
Katera od naslednji deklaracij je deklaracija niza znakov (legalnega stringa v C/C++):
 
        a) char* niz;
        b) char* nit = "blabla";
        c) char *niz;
        d) char niz[]={'b','l','a','b','l','a','\0'};
        e) char niz[5];
        f) char *niz='ecika';
 
Rešitev:
 
Deklaracije b,d in f so pravilne.
 
2.naloga
 
 Dan je niz :
 
    char* jkl="ecikapecika";
 
    a) koliko zlogov pomnilnika zaseda deklaracij z inicializacijo? Razložite.
    b) ali lahko izvedete ukaz :   jkl++ ? Zakaj ?
    c) kako izpišemo niz 'jkl' na zaslon ?
    d) kako bi s programom prešteli število črk v nizu 'jkl' ?
 
Rešitev:
 
13 zlgov zasede. JA lahko se izvede ukaz jkl++,ker se lahko sprehajamo po nizu!. Lahko izpišemo niz z naslednjim ukazom cout<<jkl;.
 
 
3.naloga
 
   #include <iostream.h>
   int main(){
     char *s1="koliko", s2="tri";
     cout << s1 << ' ' << s2 << endl;
     s1=s2;
     cout << s1 << ' ' << s2 << endl;
     return 0;
   }
 
   a) ugotovite, če program deluje.
   b) obrazložite delovanje programa.
   c) razložite obnašanje programa, če pred stavek 'return' dodate še vrstico :
 
       s1="ecikapecikapostopelja,pa se tazvrne";
 
Rešitev:
Program ne deluje tako kot bi moral, zato ga malo popravimo.
 
 
#include <iostream.h>
#include <stdio.h>
#include<string.h>
   int main(){
     char s1[6]="koliko";
     char s2[3]="tri";
     cout << s1 << ' ' << s2 << endl;
     strcat(s1,s2);
     
     cout << s1 << ' ' << s2 << endl;
  s1="ecikapecikapostopelja,pa se tazvrne";
   return 0;
   }
 
4.naloga
 
   Katere možnosti C/C++ ponujata pri rezervaciji prostora za poljuben niz znakov ?
   (glej naloge 8-10)
 
Rešitev:
  malloc
 
5.naloga
 
   Napišite C in C++ program, ki bosta s tipkovnice prebrala poljubne tri nize znakov in jih
   izpisala na zaslon.
 
Rešitev:
 
#include<stdio.h>
#include<iostream.h>
#include<string.h>
int main(void){
  char s[11];
  cin>>s;
  char s1[20];
  cin>>s1;
  char s2[20];
  cin>>s2;
  cout<<s<<' '<<s1<<' '<<s2;
  return 0;
  }
 
6.naloga
 
   Ugotovite, kaj izvaja naslednji program :
 
   #include<stdio.h>
   
   int main(){
        char *s1="abrakadabra",*s2="hamurabi";
        char *a1=s1; *a2=s2;
        int v=0;
        while ((*a1++)&&(*a2++))
           if (*a1==*a2) v++;
        cout << v;
        return 0;
   }
 
Rešitev:
 
Preverja če sta dva niza in steje kokrat sta dokler se ne spremeni vrednost in nam izpiše 1.
 
7.naloga
 
  a) Razložite delovanje naslednjega programa :
 
 
  #include <stdio.h>
 
char *fff(char* bb){
   char *c=(char*)malloc(10);
   char *d=c;
   *c++=*bb++;
   *c='\0';
   return d;
}
 
 
int main(){
 
    char * c="bla";
    c++;
    printf("%s",fff(c));
        return 0;
}
 
 
  b) ali je možno funkcijo 'fff' optimizirati ? Kako ?
 
Rešitev:
 
#include <stdio.h>
#include<iostream.h>
#include<malloc.h>
#include<conio.h>
char *fff(char* bb){
   char *c=(char*)malloc(10);
   char *d=c;
   *c++=*bb++;
   *c='\0';
   return d;
}
int main(){
    clrscr();
    char * c="bla";
    c++;
    printf("%s",fff(c));
       return 0;
}
 
Program izpise 1. 
 
8.naloga
 
  Oglejte si naslednja dva programa in poskusite razložiti, zakaj prvi program deluje drugi pa ne.
  / pazite na to kako se prenese parameter v podprogram in kaj se z vrednostjo parametra v
    podprogramu dogaja /
 
a)  #include <stdio.h>
        void fff(char* bb){  
               *bb='2';
        }
        int main(){
               char *c=(char*)malloc(10);
               strcpy(c,"vigihej");
               c++;
               printf("%s",c);
               fff(c);
               printf("%s",c);
               return 0;
        }
 
b)  #include <stdio.h>
        void fff(char* bb){  
               *bb='2';
        }
       int main(){
               char *c="vigihej";
               c++;
               printf("%s",c);
               fff(c);
               printf("%s",c);
               return 0;
        }
 
Rešitev:
 
Pri obeh naprej mankajo knjiznice potem ko to odpravimo dela prvi zato ker delamo pravilno s stringi in funkcijo malloc v drugem primeru pa ne.  
 
9.naloga
 
  a) Kaj bi dogajalo s programom iz prejšnje naloge in parametrom podprograma , če sprememnljivko 'c'
     deklariramo kot :
 
      char c[]={'v','i','g','i','h','e','j','\0'};
 
Rešitev:
 
Nič isto bi bilo.
 
 b) Kaj se dogaja s prenešenim parametrom, če na začetek funkcije 'fff' dodamo stavek : bb++;
 
Rešitev:
 
Ja potem ga program ne upošteva kot ga prej.
 
 
10.naloga
 
a) Realizirajte matode za manipulacijo z nizi :
 
        char* leftStr(char* niz,int koliko);                         //basic: LEFT$
        char* rightStr(char* niz, int koliko);                               //basic: RIGHT$
        char* midStr(char* niz, int od_kje, int do_kje);             //basic: MID$
        char* copyStr(char* niz, int od_kje, int koliko);            //pascal: copy
        int posStr(char* podniz, char* niz);                        //pascal: pos
        char* delStr(char* niz, int od_kje, int koliko);             //pascal: delete
        char* insStr(char *niz, char* vrinjeni, int_kam);            //pascal: insert
 
b) po testiranju shrani (le) funkcije v datoteko z imenom 'strFunc.h'. Napišite program v C/C++ za
   demonstracijo izvajanja funkcij iz a) razdelka te naloge, kjer v zaglavje dodate vrstico :
 
   #include "strFunc.h"   
 
   poskrbite, da bo datoteka strFunc.h na iskalni poti datotek .h .
 
   Kaj opazite ?