Gyakorlatok kézzel
Lásd: https://www.pbinfo.ro/?pagina=itemi-evaluare-lista&disciplina=0&clasa=10&tag=10&subtag=-1&eticheta=0
Néhány megoldás:
ideale
111111
0123456789012345
a: clasa a-XII-a A
CLASA A-XII-A A
******
varianta 2
roton
acat
i=0: aamara
i=1: ammara
i=2: amaara
s egy 6 hosszú string
bemenet: EAENMX
kimenet: EXAMEN
s[0] s[5] s[1] s[4] s[2] s[3]
s: examen
ExNMeA
info
jogp
tarta
11BAAARET
HF
Programozás feladatok
1.
https://www.pbinfo.ro/probleme/11/vocale
A szöveg minden magánhangzóját cseréljük ki a neki megfelelő nagybetűre.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
int main()
{
char s[21];
cin.getline(s, 21);
for (int i = 0; s[i] != '\0'; i++) {
if (strchr("aeiou", s[i]) != NULL) {
s[i] = toupper(s[i]);
}
}
cout << s << endl;
return 0;
}
|
2.
https://www.pbinfo.ro/probleme/972/pozitii
Hány olyan magánhangzó van egy szövegben, ami két mássalhangzó között található?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| #include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
int main()
{
char s[256];
cin.getline(s, 256);
int n = strlen(s);
int db = 0;
// másodiktól az utolsó előttiig
for (int i = 1; i <= n-2; i++) {
if (strchr("aeiou", s[i]) != NULL
&& isalpha(s[i-1])
&& strchr("aeiou", s[i-1]) == NULL
&& isalpha(s[i+1])
&& strchr("aeiou", s[i+1]) == NULL)
{
db++;
}
}
cout << db << endl;
return 0;
}
|
3.
https://www.pbinfo.ro/probleme/4184/bacnume
Kell írni egy függvényt, ami egy névből megtartja a vezetéknevet és hozzáragasztja a “2022”-t.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| #include <iostream>
#include <cstring>
using namespace std;
void FNume(char s[], char id[])
{
strcpy(id, strchr(s, ' ')+1);
strcat(id, "2022");
}
/*
void FNume(char s[], char id[])
{
char *p = strtok(s, " ");
p = strtok(NULL, " ");
strcpy(id, p);
strcat(id, "2022");
}
*/
/*
void FNume(char s[], char id[])
{
int i = 0;
while (s[i] != ' ')
i++;
i++;
int j = 0;
while (s[i] != '\0') {
id[j] = s[i];
j++;
i++;
}
id[j] = '2';
j++;
id[j] = '0';
j++;
id[j] = '2';
j++;
id[j] = '2';
j++;
id[j] = '\0';
}
*/
int main()
{
char s[100] = "David Popovici";
char id[100] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
FNume(s, id);
cout << id << endl;
return 0;
}
|
4.
https://www.pbinfo.ro/probleme/973/cuvinte1
Egy szövegből ki kell írni azokat a szavakat, amik csak magánhangzókból állnak.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| #include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[256];
cin.getline(s, 256);
char *p = strtok(s, " ");
while (p != NULL) {
bool ok = true;
for (int i = 0; p[i] != '\0'; i++)
if (strchr("aeiouAEIOU", p[i]) == NULL)
ok = false;
if (ok) // csak mgh
cout << p << endl;
p = strtok(NULL, " ");
}
return 0;
}
|
5.
https://www.pbinfo.ro/probleme/2803/elimp
Egy szövegnek rendre eltávolítjuk a p hosszú részeit. Írjuk ki az összes maradékot!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #include <iostream>
#include <cstring>
using namespace std;
int main()
{
int p;
char s[256];
cin >> p;
cin >> s;
int n = strlen(s);
for (int start = 0; start <= n-p; start++) {
for (int i = 0; i < n; i++) {
if (i < start || i >= start+p)
cout << s[i];
}
cout << endl;
}
}
|
6.
https://www.pbinfo.ro/probleme/12/initiale
A szöveg minden szavának első és utolsó betűjét alakítsuk nagybetűvé.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| #include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
int main()
{
char s[256];
cin.getline(s, 256);
int n = strlen(s);
for (int i = 0; i < n; i++) {
// első betű
if (isalpha(s[i]) && (i == 0 || s[i-1] == ' '))
s[i] = toupper(s[i]);
// utolsó betű
if (isalpha(s[i]) && (i == n-1 || s[i+1] == ' '))
s[i] = toupper(s[i]);
}
cout << s << endl;
return 0;
}
|
7.
https://www.pbinfo.ro/probleme/975/cuvinte2
Keressük meg a szöveg palindrom szavai közül az abc sorrendben elsőt!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| #include <iostream>
#include <cstring>
using namespace std;
int main ()
{
char s[256];
cin.getline(s, 256);
char szo[11] = "";
char *p = strtok(s, " ,.");
while (p != NULL) {
int n = strlen(p);
bool palindrom = true;
for (int i = 0; i < n/2; i++)
if (p[i] != p[n-1-i])
palindrom = false;
if (palindrom
&& (szo[0] == '\0' || strcmp(p, szo) < 0))
{
strcpy(szo, p);
}
p = strtok(NULL, " ,.");
}
if (szo[0] == '\0')
cout << "IMPOSIBIL" << endl;
else
cout << szo << endl;
return 0;
}
|
Más megoldás:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| // Ágnes és Fruzsina (végül, de nem utolsó sorban,
// meg még az ötletgazda is ő volt meg a bug is az övé)
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
int main()
{
char s[256];
char legelso[256];
cin.getline (s, 256);
char *p=strtok(s, " ,.");
bool elso=false;
bool volt=false;
while(p!=NULL){
int n=strlen(p);
bool pal=true;
for(int i=0; i<=n/2; i++){
if( p[i]!=p[n-1-i] ) pal=false;
}
if(pal){
volt=true;
if(!elso){
strcpy(legelso, p);
}
else if( strcmp(legelso, p)>0 ){
strcpy(legelso, p);
}
elso=true;
}
p=strtok(NULL, " ,.");
}
if(!volt) cout<<"IMPOSIBIL"<<endl;
else cout<<legelso<<endl;
return 0;
}
|
8.
https://www.pbinfo.ro/probleme/101/sortarecuvinte
Írjuk ki egy mondat szavait abc-rendben!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| #include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main ()
{
ifstream fin("sortcuv.in");
ofstream fout("sortcuv.out");
char s[251];
fin.getline(s,251);
char szavak[250][21];
int n = 0;
char *p = strtok(s, " ");
while (p != NULL) {
strcpy(szavak[n], p);
n++;
p = strtok(NULL, " ");
}
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++)
if (strcmp(szavak[i], szavak[j]) > 0) { // rossz a sorrend
// csere
char seged[21];
strcpy(seged, szavak[i]);
strcpy(szavak[i], szavak[j]);
strcpy(szavak[j], seged);
}
for (int i = 0; i < n; i++)
fout << szavak[i] << endl;
return 0;
}
|
Trükkösebb megoldás pointerekkel:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| #include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main ()
{
//ifstream fin("sortcuv.in");
//ofstream fout("sortcuv.out");
char s[251];
cin.getline(s,251);
char *szavak[250];
int n = 0;
char *p = strtok(s, " ");
while (p != NULL) {
szavak[n] = p;
n++;
p = strtok(NULL, " ");
}
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++)
if (strcmp(szavak[i], szavak[j]) > 0) { // rossz a sorrend
// csere
char *seged = szavak[i];
szavak[i] = szavak[j];
szavak[j] = seged;
}
for (int i = 0; i < n; i++)
cout << szavak[i] << endl;
return 0;
}
|
9.
https://www.pbinfo.ro/probleme/188/inlocuirecuvant
Cseréljük ki egy szó minden előfordulását egy másikra a megadott szövegben!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
| #include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main()
{
ifstream fin("inlocuirecuvant.in");
ofstream fout("inlocuirecuvant.out");
char mit[11], mire[11];
fin >> mit >> mire;
fin.get(); // '\n'
char mondat[101];
fin.getline(mondat, 101);
char eredmeny[1000];
int ne = 0;
int start = 0;
while (mondat[start] != '\0') {
if (start == 0 || mondat[start-1] == ' ') {
int i = 0;
while (mondat[start+i] != '\0'
&& mit[i] != '\0'
&& mondat[start+i] == mit[i])
{
i++;
}
if (mit[i] == '\0'
&& (mondat[start+i] == ' '
|| mondat[start+i] == '\0')) // talált
{
for (int j = 0; mire[j] != '\0'; j++) {
eredmeny[ne] = mire[j];
ne++;
}
start = start + i;
}
else { // nem talált
eredmeny[ne] = mondat[start];
ne++;
start++;
}
}
else { // nem lehet kezdőpozíció
eredmeny[ne] = mondat[start];
ne++;
start++;
}
}
eredmeny[ne] = '\0';
fout << eredmeny << endl;
return 0;
}
|
Az alábbi strtok-os megoldás nem jó, mert nem tartunk meg
az eredetivel azonos számú space-t a szavak között:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| #include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main()
{
ifstream fin("inlocuirecuvant.in");
ofstream fout("inlocuirecuvant.out");
char mit[11], mire[11];
fin >> mit >> mire;
fin.get(); // '\n'
char mondat[101];
fin.getline(mondat, 101);
char eredmeny[1000] = "";
char *p = strtok(mondat, " ");
while (p != NULL) {
if (strcmp(p, mit) == 0) {
strcat(eredmeny, mire);
}
else {
strcat(eredmeny, p);
}
strcat(eredmeny, " ");
p = strtok(NULL, " ");
}
eredmeny[strlen(eredmeny)-1] = '\0';
fout << eredmeny << endl;
return 0;
}
|
10. HF (+pont)
https://www.pbinfo.ro/probleme/2304/cuvinte7
Adott n, majd n darab szó, végül egy k szám. Építsünk a szavakból egy szöveget, melyben a k betűs szavak elöl vannak
a többi pedig ezek után!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| #include <iostream>
#include <cstring>
using namespace std;
int main()
{
int n, k;
char szavak[21][21], papanasi[500]="";
cin >> n;
for (int i = 0; i < n; i++) cin >> szavak[i];
cin >> k;
for (int i = 0; i < n; i++) {
if (strlen(szavak[i]) == k){
strcat (papanasi, szavak[i]);
strcat (papanasi, " ");
}
}
for (int i = 0; i < n; i++) {
if (strlen(szavak[i]) != k){
strcat (papanasi, szavak[i]);
strcat (papanasi, " ");
}
}
papanasi[strlen(papanasi)-1]='\0';
cout << papanasi;
cout << endl;
return 0;
}
|
11.
https://www.pbinfo.ro/probleme/2666/trim
Egy függvényt kell írni, amely a paraméterként kapott string elején és végén levő szóközöket törli
(megváltoztatva ugyanazt a stringet).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
| #include <iostream>
#include <cstring>
using namespace std;
void Trim1(char *s)
{
int hol_elso = 0;
while (s[hol_elso] == ' ')
hol_elso++;
int hol_utolso = strlen(s)-1;
while (hol_utolso >= 0 && s[hol_utolso] == ' ')
hol_utolso--;
if (s[hol_elso] == '\0')
s[0] = '\0';
else {
// s[hol_elso ... hol_utolso]
int c = 0;
for (int i = hol_elso; i <= hol_utolso; i++) {
s[c] = s[i];
c++;
}
s[c] = '\0';
}
}
void Trim2(char *s)
{
char seged[101];
while (s[0] == ' ') {
strcpy(seged, s+1);
strcpy(s, seged);
}
int n = strlen(s);
while (s[n-1] == ' ') {
s[n-1] = '\0';
n--;
}
}
void Trim3(char *s)
{
char seged[101];
while (s[0] == ' ') {
for (int i = 0; s[i] != '\0'; i++)
s[i] = s[i+1];
}
int n = 0;
while (s[n] != '\0')
n++;
while (s[n-1] == ' ') {
s[n-1] = '\0';
n--;
}
}
int main()
{
char s[100] = " ana are mere ";
Trim3(s);
//cout << s << endl;
//cout << strlen(s) << endl;
for (int i = 0; s[i] != '\0'; i++)
if (s[i] == ' ')
cout << "#";
else
cout << s[i];
cout << endl;
return 0;
}
|
12.
https://www.pbinfo.ro/probleme/3243/path
Egy fájlrendszerbeli elérési útvonalából ki kell gyűjteni a folderneveket a példának megfelelően
és visszatéríteni ezek számát.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| #include <iostream>
#include <cstring>
using namespace std;
int Path(const char cale[], char d[101][101])
{
char masolat[101];
strcpy(masolat, cale);
int db = 0;
char *p = strtok(masolat, "\\");
while (p != NULL) {
strcpy(d[db], p);
db++;
p = strtok(NULL, "\\");
}
return db;
}
int main()
{
char cale[101];
char d[101][101];
cin.getline(cale, 101);
int n = Path(cale, d);
cout << n << endl;
for (int i = 0; i < n; i++) {
cout << d[i] << endl;
}
return 0;
}
|