[Șiruri de caractere și structuri ]

Șiruri de caractere

Se declară cu ajutorul fișierului header string.h .
Nu e acceptat însă de toate compilatoarele .
Au fost găsite neuniformitati legate de portarea codului între Turbo C++ , Code Blocks și compilatorul online cpp.sh . 
Compilatorul online e dependent de browser , de actualizarea permanentă a acestuia .
 #include<string.h>
....
string c;

O variantă acceptată de toate compilatoarele este
char c[10] ;
Char este tipul caracter si aici variabila character c are maxim 10 caractere , e un vector de caractere , deci un șir.

Operațiile cu siruri sunt ștergerea , copierea , concatenare

Citirea și scrierea se fac cu gets si puts
+  e    un operator de doncatenare

Dacă c e Sirul  "123" și d e Sirul "45" atunci c= c+d este "12345"


Tipul character
-sta la baza tipului sir de caractere pt ca orice sir este de fapt un vector de caractere
Program ilustrativ –coduri ASCII
#include<iostream.h>
#include<conio.h>
int i,char c;
void main()
{
for(i=0;i<=255;i++) {cout<<char(i)<<endl;getch();}
}
Char-functie ce ne ofera caracterul al carui cod ASCII il are ca argument.
ASCII-acronim american standard information interchange
Obs: la compilare apare o eroare . Incercati să o corectați.
Tipul sir de caractere-string
Un sir e practic un vector de caractere cu maxim 255 elemente .
La atribuire se folosesc caractere " si ". La caractere folosim la atribuire ' si ' .
În atribuiri se scrie s=”ggggf”; se declară
string s;
sau char s[];
sau char s[200];
sau char *s;
IMPORTANT
-sirul se termina cu caracterul null "\n"
-elementele sirului au indici intre 0 si strlen-1
-strlen e functia ce da lungimea unui sir  
-caracterul stocat pe 8 biti , sirul pe nr caractere+1 Bytes

Aplicatia urmatoare  va inversa un sir .
Functia utilizata este strlen- da lungimea unui sir .
#include<iostream.h>
#include<conio.h>
int i,char x,*c;
int main()
{
cout<<”sirul este ”; cin>>d;
for(i=0;i<=(strlen(d)-1)/2;i++)  {x=d[i];d[i]=d[strlen(d)-i-1];d[strlen(d)-i-1]=x;}
cout<<”sirul inversat este “<<d<<endl;
getch();return 0;
}


Altă aplicație propusă pt instructiuni noi cu șiruri  este :
#include <iostream>
#include<cstring>
#include<cstdio>

using namespace std;
int i;char x,*c,a[10],d[10];

int main()
{
    cout << "Hello world!" << endl;
    cout<<"sirul d cu litere mari este "; cin>>d; strcpy(a,d);//strcpy copiaza d in a
strlwr (a);  cout<<"sirul a cu litere mici este   "<<a<<endl;
for(i=0;i<=(strlen(d)-1)/2;i++)  {x=d[i];d[i]=d[strlen(d)-i-1];
      d[strlen(d)-i-1]=x;}
cout<<"sirul d inversat este    "<<d<<endl;
cout<<"lung sir d ="<<strlen(d)<<endl;
if(strcmp(a,d))     strcat(d,a);else strcat(a,d);
//strcmp compară siruri și e 0 sau 1

//strcat adaugă la un șir un alt șir
cout<<"ca efect al rezultatului comparatiei     "<<a<<endl<<d;
getchar();

    return 0;
}


Problemă . se dă un text intr-un fișier și se cere să afișăm în alt fișier textul fără blank-uri(caractere Space)
Ind. Se vor muta caracterele in sir spre stanga la fiece blanc gasit incepand cu blancurile de la stanga la dreapta .

#include<fstream>
#include<cstring>
using namespace std;
int j,n ,i;
char *s,*d;
int main()
{
ofstream g("b.out");
ifstream f("a.in");
f>>s;n=strlen(s);
for(i=0;i<n;i++) {
 if(s[i]==char(32) )
       {for(j=i+1;j<n;j++) s[j-1]=s[j] ;n--; } }
g<<s;
return 0;
}

TEST (scris și practic)
1.Se da un sir s . Afisati lungimea sa . (criteriul de ordonare lexicografica ).
2.Se dau sirurile s si d . Se cere sa afisati care este mai mare cu litere mici .
3. Se da un sir s scris cu litere mari , transformati-l in sir scris cu litere mici , tastat programul

Rezolvarea temei.
Indicatie :

 pt 2
#include<string.h>

#include<string.h>

#include<iostream.h>

int main (void)

{char s[20], d[20];

cout<<”s=” , cin>>s;

cout<<”d=”, cin>>d;

if(s>d) cout<<” s>d”;

else cout<<”s<=d”;

return 0;

}


pt 3
#include<string.h>

#include<iostream.h>

char   *s;

int main()

{cout<<”s=”;cin>>s;

cout<<”lung. S= “<<strlen(s);

return 0;

}
UTILIZAREA INSTRUCTIUNILOR GETS si PUTS IN CODEBLOCKS
char s[10];
cin.gets(s);//citire
cout.puts(s);//scriere
. este folosit  pt a specifica metode ale unor clase
obs: clasele sunt formate din metode si proprietati
2. strstr(sir1,sir2) - verifica daca sir2 este inclus in sir 1
3.strrchr(sir,caracter) - verifica daca un caracter apare in sir
Orice sir se termina cu caracter null "/0" .

PROBLEMA  Se da sirul citit de la tastatura s si se cere de cate ori apare in el caracterul 'c'.

STRUCTURI(INREGISTRARI)

Structura​ numită și înregistrare da posibilitatea grupării laolaltă a datelor de tipuri diferite .
Operatorul de selecție a câmpului este punctul .
Exemplu  clasa.nume , clasa.numar etc

Avem in ecran o aplicatie :
TEMA 
 Mentionati pe caiet dupa testarea programelor de mai sus ce rol au functiile strlen , 
char . Mentionati ce campuri are structura persoana . 
Gigel este variabila sau constanta ?

Aplicatie : Se cere suma totala a pretului pt n inregistrari intr-o baza de date cu campurile pret si nume .
In CODEBLOCKS cu compilator MINGW: #include<iostream>
using namespace std;
struct mag { float pret ; char den[20];} e[10];
int n,i;
float s;
int main()\
{
cout<<"n=";cin>>n; s=0; 
for(i=1;i<=n;i++) { cout<<"pret=";cin>>e[i].pret;
                             cout<<"den=";cin>>e[i].den;
                             s=s+e[i].pret;
                              }  
cout<<"suma="<<s;
return 0;
}   

e- vector de inregistrari

RECAPITULARE STRUCTURI si SIRURI

 Getch
Strlen
Fstream
Ifstream
Strlwlr
Struct
Getche
Asteapta apasarea tastei enter(un character)
Lung unui sir
Permite scriere in fisier
Permite citire in fisier
Transnforma literele din majuscule in litere mici
Declara inregistrari
Citire caracter cu ecou

 APLICATIE cu instructiunile de mai sus

#inculde<iostream>

#include <string.h>

#include <conio>

#include <fstream>

using namespace std;

char s[20];

int n;

int main()

{cout<<”s=”;cin>>s;

cout<<”lungimea sir=”<<strlen(s);

strlwrl(s);

getche();

f=ifstream(“a.dat”);

g=fstream(“a.out”);

f>>s;

g<<s;

getch();

struct e { int pret; char den [20];} h;

h.pret=4;h.den=”caiet”;

return 0;

}

Tema acasa
Se cere să realizați un program care pentru structura an cu campurile luna , anul si ziua de tip intreg să ne dea ca răspuns dacă anul nostru e bisect sau dacă luna este de 31 de zile .
Ziua , luna si anul se citesc de la tastatură.
Ind . se împarte problema în subprobleme