Zamiana samogłosek na kod ASCII

0

Samogłoski w podanych wyrazie należy zamienić na przypisany jej numer w tablicy ASCII. Nie wiem jak odwołać się do konkretnej litery i jak zadeklarować te samogłoski.

#include <iostream>

using namespace std;

int main()
{
    string w, a, i;
    cout << "Podaj wyraz: ";
    cin >> w;
    if(int w[i]=a, e, y, i, o, u)
        {
            for(int i = 0; i < w.size(); i++)
                cout << int(w[i]) << " ";
        }
}

2

Łap szybko rozwiązanie, zanim hejterzy zrobią raban za gotowca:

#include <iostream>

using namespace std;

static const char vowels[] = "aeiouy";

int main()
{
	size_t len;
	size_t i;
	string w;

	cout << "Podaj wyraz: ";
	cin >> w;

	for (i = 0, len = w.size(); i < len; i++)
		if (strchr(vowels, w[i]) != nullptr)
			cout << int(w[i]) << ' ';
	cout << endl;
}

Tylko przeczytaj kod ze zrozumieniem, jak czegoś nie wiesz, to doczytaj w dokumentacji, bo nie zaliczysz.

0

@_13th_Dragon:

Akurat bez optymalizacji clang wygenerował mi większy segment danych dla ++i niż i++:

$ diff -up vowels.cc vowels2.cc
--- vowels.cc   Thu Feb 10 01:22:53 2022
+++ vowels2.cc  Thu Feb 10 03:27:48 2022
@@ -14,7 +14,7 @@ int main()
        cout << "Podaj wyraz: ";
        cin >> w;

-       for (i = 0, len = w.size(); i < len; i++)
+       for (i = 0, len = w.size(); i < len; ++i)
                if (strchr(vowels, w[i]) != nullptr)
                        cout << int(w[i]) << ' ';
        cout << endl;
$ c++ -o vowels vowels.cc
$ c++ -o vowels2 vowels2.cc
$ c++ --version
OpenBSD clang version 11.1.0
Target: amd64-unknown-openbsd7.0
Thread model: posix
InstalledDir: /usr/bin
$ size vowels vowels2
text    data    bss     dec     hex
17135   1336    85      18556   487c    vowels
17135   1352    85      18572   488c    vowels2
$
0
NB-NN-NP-NK napisał(a):

@_13th_Dragon:

Akurat bez optymalizacji clang wygenerował mi większy segment danych dla ++i niż i++:

Czasy kiedy trzeba było wałczyć za każdy bajt danych/kodu skończyły się jakieś 25 lat temu.

1
_13th_Dragon napisał(a):

Czasy kiedy trzeba było wałczyć za każdy bajt danych/kodu skończyły się jakieś 25 lat temu.

Podobnie jak czasy, kiedy trzeba było walczyć o każdy cykl maszynowy lub zegarowy, z wyjątkiem niektórych specyficznych projektów, jak np. przetwarzanie pakietów sieciowych na CPU.

Natomiast istotą mojego komentarza było to, że optymalizacji nie należy wykonywać zgadując, ale mierząc - są do tego odpowiednie narzędzia.

Zgadywanie i opieranie się na utartych schematach może prowadzić do rezultatów przeciwnych do tego, co chcemy uzyskać.

0

@NB-NN-NP-NK:
Mogę się zgodzić z ogólnym założeniem, ale mierzenie takich aspektów ma 0 sensu jak nie patrzysz na zoptymalizowane buildy. A jak podejdziesz do tego uczciwie, skompilujesz z -O2 przynajmniej (bo jak komuś zależy na prędkości to czemu nie używa O2?). To wyjdzie że nie ma absolutnie żadnej różnicy.

0
enedil napisał(a):

@NB-NN-NP-NK:
Mogę się zgodzić z ogólnym założeniem, ale mierzenie takich aspektów ma 0 sensu jak nie patrzysz na zoptymalizowane buildy. A jak podejdziesz do tego uczciwie, skompilujesz z -O2 przynajmniej (bo jak komuś zależy na prędkości to czemu nie używa O2?). To wyjdzie że nie ma absolutnie żadnej różnicy.

To @_13th_Dragon wkleił linka, gdzie wcześniej napisał o kompilacjach bez optymalizacji...

Niemniej jednak, mierzenie takich aspektów ma sens, np. jeśli mamy kilkadziesiąt cykli zegarowych na przetworzenie pakietu. Wtedy oczywiście najczęściej kompilujemy z optymalizacją.

0

Te twoje wyniki są z czapy:

/tmp $ diff -up a.cc b.cc
--- a.cc	2022-02-10 20:04:09.907535697 +0100
+++ b.cc	2022-02-10 20:04:21.379455761 +0100
@@ -14,7 +14,7 @@ int main()
 	cout << "Podaj wyraz: ";
 	cin >> w;
 
-	for (i = 0, len = w.size(); i < len; i++)
+	for (i = 0, len = w.size(); i < len; ++i)
 		if (strchr(vowels, w[i]) != nullptr)
 			cout << int(w[i]) << ' ';
 	cout << endl;
/tmp [1] $ cat a.cc | clang++ -x c++ - -o a
/tmp $ cat b.cc | clang++ -x c++ - -o b
/tmp $ cmp a b
/tmp $ echo $status
0

Czyli twoja różnica z wielkości sekcji data wynikała z tego, że twoje pliki się różnie nazywały, a to jest umieszczane w generowanym pliku.

Edit: albo już w sumie nie wiem:

/tmp $ mv a.cc vowels.cc
/tmp $ mv b.cc vowels2.cc

/tmp $ clang++ -o vowels vowels.cc
/tmp $ clang++ -o vowels2 vowels2.cc
/tmp $ clang++ --version
clang version 12.0.1 (Fedora 12.0.1-1.fc34)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
/tmp $ size vowels vowels2
   text	   data	    bss	    dec	    hex	filename
   3817	    708	    632	   5157	   1425	vowels
   3817	    708	    632	   5157	   1425	vowels2

Tak czy inaczej, mocno wątpię, że to przez różnicę i++ a ++i.

0
enedil napisał(a):

Te twoje wyniki są z czapy:

Nie, moje wyniki nie są z czapy, tylko są z OpenBSD ;-)

$ c++ -o vowels vowels.cc
$ c++ -o vowels2 vowels2.cc
$ c++ -o a a.cc
$ c++ -o b b.cc
$ size vowels vowels2 a b
text    data    bss     dec     hex
17135   1336    85      18556   487c    vowels
17135   1352    85      18572   488c    vowels2
17135   1352    85      18572   488c    a
17135   1344    85      18564   4884    b
$

:-D

0

a to co ja zrobiłem tzn cat a.cc | clang++ -x c++ - -o a, i tak samo dla b?

$ size a b
text    data    bss     dec     hex
17135   1352    85      18572   488c    a
17135   1352    85      18572   488c    b
$ cmp a b
$
1

u mnie cmp nie wykazało różnicy. A u Ciebie to nie wiadomo, bo nie sprawdzasz kodu wyjścia xd

cmp(1) defaultowo drukuje komunikat, jeśli pliki się różnią zawartością:

aegis# echo -n a > /tmp/a
aegis# echo -n b > /tmp/b
aegis# cmp /tmp/a /tmp/b
/tmp/a /tmp/b differ: char 1, line 1
aegis# cmp /tmp/a /tmp/a
aegis#
2

W ramach "humoru z kolokwiów studenckich" - kiedyś zapytałem czym różni się ++i od i++.
Zauważalny procent odpowiedzi był w stylu

Jak użyjemy i++ to zmienna jest zwiększana na końcu pętli, a jak ++i to na początku

;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1