10 2018 Lectia6: Difference between revisions
(→Tema) |
(No difference)
|
Revision as of 14:38, 23 November 2021
Lectie
Sirurile de caractere
Definitie: Un sir de caractere este o structură de date formată dintr-o succesiune de caractere care se termină cu caracterul NULL (’ \0’).
Implementare Sirurile de caractere se reprezinta sub forma unui tablou unidimensional (vector) ale cărui elemente sunt de tip caracter, fiecare caracter fiind reprezentat prin codul său ASCII. Sirul de caractere se deosebeste de vectorii cu alte tipuri de elemente prin marcatorul logic utilizat la sfârsitul sirului - NULL (care are codul ASCII 0).
Declarare
char x[5]; // am declarat sirul x care va putea contine maxim 5 caractere
cin >> x;
Initializare
char x[5] = "mama"; // am reervat explicit 5 octeti, pentru cele 4 caractere cat si pt caracterul null
char x[] = "mama"; // numarul de octeti rezervati este nr de caractere din constanta sir + 1
char x[20] = "mama";// am rezervat 20 de locatii din care am utilizat 5
Dimensiunea vectorului de caractere trebuie declarată cu un caracter mai mult decât cel mai mare sir de caractere pe care îl poate contine, pentru a exista loc si pentru terminatorul sirului (caracterul ‘\0’). O constantă sir de caractere este o succesiune de caractere delimitată de ghilimele. ex: char sir[256] = ”Buna ziua”;
Citirea în limbajul C++ - se poate utiliza operatorul >> :
cin >> s; ( doar dacă s este un cuvânt )
sau una din functiile get sau getline:
char c, sir[201];
fin >> c;
fin.getline(sir, 200); //sau fin.get(sir,200);fin.get();
Prototipurile functiilor get si getline:
getline(char *s, int n, char c=’\n’); get(char *s, int n, char c=’\n’); Diferenta dintre functiile get si getline este faptul că functia getline preia din stream-ul de intrare si delimitatorul, în timp ce functia get nu-l extrage. Scrierea în limbajul C++
fout << c << ’ ’ << s;
Obs. 1. Citirea sirurilor de caractere la care se utilizează operatorul >> se opreste la întâlnirea primului caracter alb. 2.Dacă delimitatorul este altul decât ‘\n’, acesta trebuie precizat pe pozitia corespunzătoarelui în functia getline. ‘m’ ‘a’ ‘m’ ‘a’ ‘\0’
Aplicatii
1. Se citeste de la tastatura un sir de caractere folosind functiile de citire studiate. Sa se afiseze acest sir. a) Citire cu cin.get si afisare cu cout b) Citire cu cin.getline si afisare cu cout 2. Se citesc de la tastatura 2 siruri de caractere. Sa se afiseze aceste siruri fiecare pe cate o linie. a) Citire cu cin.get si afisare cu cout b) Citire cu cin.getline si afisare cu cout
Prelucrari secventiale de siruri de caractere
#11 Vocale
Să se scrie un program care citeşte un şir de caractere format din litere mici ale alfabetului englez şi înlocuieşte fiecare vocală cu litera mare corespunzătoare.
C prelucrare caracter cu caracter | C++ prelucrare caracter cu caracter |
---|---|
#include <stdio.h>
int e_vocala ( char c ) {
if ( c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' )
return 1;
return 0;
}
int main() {
char c;
c = fgetc(stdin);
while( c != '\n' && c != EOF ) {
if(e_vocala(c))
fputc( c+'A'-'a', stdout);
else
fputc( c, stdout );
c = fgetc(stdin);
}
return 0;
} |
#include <iostream>
using namespace std;
int e_vocala ( char c ) {
if ( c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' )
return 1;
return 0;
}
int main() {
char c;
cin.get(c);
while(c!='\n' && !cin.eof()) {
if(e_vocala(c))
cout<<(char)(c+'A'-'a');
else
cout<<c;
cin.get(c);
}
return 0;
} |
C | C++ |
---|---|
// Citim un sir de caractere,
//il prelucram pe parcursul citirii si afisam caracterele rezultate
#include <iostream>
using namespace std;
int e_vocala ( char c ) {
if ( c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' )
return 1;
return 0;
}
int main() {
char s[100]; // char *s;
cin >> s; // daca nu e era doar un cuvant : cin.get( s, 200 );
int i = 0;
while( s[i] ) {
if( e_vocala(s[i]) )
cout<<(char)( s[i]+'A'-'a');
else
cout << s[i];
i++;
}
return 0;
} |
// Citim un sir de caractere,
//modificam elementele sirului si la final afisam sirul modificat
#include <iostream>
using namespace std;
int e_vocala ( char c ) {
if ( c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' )
return 1;
return 0;
}
int main() {
char s[100]; // char *s;
cin >> s; // daca nu e era doar un cuvant : cin.get( s, 200 );
int i = 0;
while( s[i] ) { // s[i] != '\0' , nu am ajuns la sfarsitul sirului
if( e_vocala(s[i]) )
s[i] = s[i]+'A'-'a';
i++;
}
cout << s;
return 0;
} |
#972 Pozitii
- Se da un sir de caractere. Sa se determine câte vocale din sir sunt cuprinse intre doua consoane.
#include <iostream>
using namespace std;
char evoc ( char c ) {
if ( c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' )
return 1;
return 0;
}
char econs ( char c ) {
if ( c >= 'a' && c <= 'z' )
if ( !evoc(c))
return 1;
return 0;
}
int main(){
char s[256];
int contor, i;
cin.get( s, 255 );
contor = 0; // cate vocale sunt intre 2 consoane
i = 1;
while( s[i+1] != '\0' ) {
if ( econs(s[i-1]) && econs(s[i+1]) && evoc(s[i]) )
contor ++;
i++;
}
cout << contor;
return 0;
}
C | C++ |
---|---|
#include <stdio.h>
char evoc ( char c ) {
if ( c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' )
return 1;
return 0;
}
char econs ( char c ) {
if ( c >= 'a' && c <= 'z' )
if ( !evoc(c))
return 1;
return 0;
}
int main(){
char c1, c2, c3;
int contor, i;
c3 = getc(stdin);
contor = 0;
while( c3 != '\n' && c3 != EOF ){
i++;
if( i > 2 )
if ( econs(c1) && econs(c3) && evoc(c2) )
contor ++;
c1 = c2;
c2 = c3;
c3 = getc(stdin);
}
printf( "%d", contor );
return 0;
} |
#include <iostream>
using namespace std;
char evoc ( char c ) {
if ( c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' )
return 1;
return 0;
}
char econs ( char c ) {
if ( c >= 'a' && c <= 'z' )
if ( !evoc(c))
return 1;
return 0;
}
int main(){
char c1, c2, c3;
int contor, i;
cin.get(c3);
contor = 0;
while( c3 != '\n' && c3 != EOF ){
i++;
if( i > 2 )
if ( econs(c1) && econs(c3) && evoc(c2) )
contor ++;
c1 = c2;
c2 = c3;
cin.get(c3);
}
cout << contor;
return 0;
} |
#12 Initiale
Să se scrie un program care citeşte de la tastatură o propoziţie formată din mai multe cuvinte separate prin spaţii şi transformă prima şi ultima literă a fiecărui cuvânt în literă mare.
C - Folosind 3 variabile | ! C - Folosind 2 variabile |
---|---|
#include <stdio.h>
int main(){
int n, i;
char c1, c2, c3;
c1 = ' ';
c2 = fgetc( stdin );
c3 = fgetc( stdin );
while ( c3 != '\n' && c3 != EOF ) {
if ( c2 >= 'a' && c2 <= 'z' && (c1 == ' ' || c3 == ' ' ) ) // c2 e prima litera din cuv
c2 = c2 - 32;
fputc( c2, stdout );
c1 = c2;
c2 = c3;
c3 = fgetc( stdin );
}
if ( c2 >= 'a' && c2 <= 'z')
fputc( c2 - 32, stdout );
return 0;
} |
#include <stdio.h>
int main(){
int n, i;
char c1, c2;
c1 = fgetc( stdin );
if ( c1 >= 'a' && c1 <= 'z' ) // daca primul caracter e litera
c1 = c1 - 32;
c2 = fgetc( stdin );
while ( c2 != '\n' && c2 != EOF ) {
if ( c2 >= 'a' && c2 <= 'z' && c1 == ' ' ) // c2 e prima litera din cuv
c2 = c2 - 32;
if ( c1 >= 'a' && c1 <= 'z' && c2 == ' ' ) // c1 e sf de cuvant
c1 = c1 - 32;
fputc( c1, stdout );
c1 = c2;
c2 = fgetc( stdin );
}
if ( c1 >= 'a' && c1 <= 'z' )
c1 = c1 - 32;
fputc( c1, stdout );
return 0;
} |
Putem de asemenea sa citim caracter cu caracter si sa formam cate un cuvand, modificam cuvantul si il afisam.
#include <iostream>
#include <string.h>
using namespace std;
char* uppcuv( char *s, int lung ){
if( s[0] >= 'a' && s[0] <= 'z' )
s[0] = s[0] - 'a' + 'A';
if( s[lung-1] >= 'a' && s[lung-1] <= 'z' )
s[lung-1] = s[lung-1] - 'a' + 'A';
return s;
}
int main(){
char c;
char cuv[200];
int incuv, lung;
cin.get( c );
incuv = 0; lung = 0;
while( c != '\n' && !cin.eof() ){
if( c != ' ' ) // daca am litera
if( incuv == 1){ // si sunt cuvant
cuv[lung++] = c; // adaug litera la cuvant
}
else{ // am litera si inainte a fost spatiu
incuv = 1; // declar ca sunt in cuvant
lung = 0; // rezetez contorul de litere din cuvant
cuv[lung++] = c; // pun prima litera in cuvant
}
else { // daca am spatiu
if( incuv == 1){ // si inainte era cuvant
cuv[lung] = 0;
cout << uppcuv(cuv,lung); // tiparesc cuvantul modificat
incuv = 0;
}
cout<<c;
}
cin.get( c ); // citesc un nou caracter
}
if (incuv ){
cuv[lung] = 0;
cout << uppcuv(cuv,lung);
}
return 0;
}
LungSortDesc
Se dă un șir de caractere în care cuvintele sunt formate din litere mici și mari ale alfabetului englez și sunt separate prin spații. Să se afișeze cuvintele pe ecran, fiecare cuvânt pe câte o linie, în ordinea descrescătoare a numărului de litere. Dacă două cuvinte au același număr de litere atunci ele se vor afișa în ordine lexicografică.
Tema
prosir
Să se înlocuiasca cu cifra 5 ultima literă a fiecărui cuvânt din textul conținut de fișierul prosir.in.
#1456Cuvant
Se consideră un cuvânt format din cel puțin două și cel mult 100 de caractere, numai litere mici ale alfabetului englez. Scrieţi un program care citeşte de la tastatură un cuvânt de tipul precizat și afișează pe ecran mesajul DA în cazul în care cuvântul conține doar consoane şi, eventual, vocala i, sau mesajul NU în caz contrar.
#890 NrVocale
Se dă o propoziție formată din litere mari și mici ale alfabetului englez, cifre, spații și semne de punctuație, în care literele mari și mici se consideră identice. Determinați vocala din șir cu număr maxim de apariții.
#13 Prefixe
Să se scrie un program care să afişeze prefixele şi sufixele unui cuvânt citit.
Avand in vedere ca vom avea nevoie sa memoram sirul de caractere, putem sa citim tot sirul utilizand o functie de citire sir.
=== #84 InterschimbareLitere ===
Să se scrie un program care citește un cuvânt și îl afișează după interschimbarea primei vocale cu ultima consoană.
=== #85 InserareAsterisc ===
Să se scrie un program care citește un text și inserează după fiecare vocală caracterul *.
<syntaxhighlight>