Șiruri de caractere
Se declară cu ajutorul fișierului header string.h .Nu e acceptat însă de toate compilatoarele ,fiind înlocuit cu cstring sau folosind pentru șiruri declararea acestora ca vector de caractere astfel char c[100].
Un șir are maxim 255 de caractere .Întotdeauna începe de la indexul 0 și se termină efectiv după ultimul său caracter cu marcajul /0 .
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>
#include<conio.h>
using namespace std;
int i;char c;
int main()
{
for(i=0;i<=255;i++) cout<<char(i)<<endl;return 0;
}
Char-functie predefinită dintr-unul din fișierele header ale programului 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.
ASCII-acronim american standard information interchange
Obs: la compilare apare o eroare . Incercati să o corectați.
Tipul sir de
caractere-string
Un șir e practic un vector de caractere cu maxim 255 elemente .
La atribuire se folosesc caractere " ". La caractere folosim la atribuire ' si ' .
În atribuiri de valori către șiruri nu se scrie s=”ggggf” pentru că spre deosebire de variabilele numerice folosim funcția predefinotă strcpy
Un șir e practic un vector de caractere cu maxim 255 elemente .
La atribuire se folosesc caractere " ". La caractere folosim la atribuire ' si ' .
În atribuiri de valori către șiruri nu se scrie s=”ggggf” pentru că spre deosebire de variabilele numerice folosim funcția predefinotă strcpy
Declarația șirurilor
string s;
sau char s[];
sau char s[200];
sau char *s;
IMPORTANT
-sirul se termina cu caracterul null '\0'
-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
string s;
sau char s[];
sau char s[200];
sau char *s;
IMPORTANT
-sirul se termina cu caracterul null '\0'
-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 strlen returnează lungimea unui șir .
#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
int i;char x,c[100],d[100];
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<cctype>
#include<string.h>
#include<algorithm>
#include<cstdio>
using namespace std;
int i;char x,c[100],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
// cout<<"sirul a cu litere mici este "<<tolower(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;
}
Tolower e mai putin eficient decat adunarea lui 32 la fiecare caracter al sirului .
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
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'.
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 CODEBLOCKSchar 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 :
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 :
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 ?
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