Práce se znaky – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Práce se znaky – C / C++ – Fórum – Programujte.comPráce se znaky – C / C++ – Fórum – Programujte.com

 

Bob
~ Anonymní uživatel
46 příspěvků
22. 3. 2008   #1
-
0
-

Potřeboval bych pomoct s jednim mini programkem, jen bych potreboval jestli nedko nevite jak bych udelal tohle:
Uzivatel napise znamku jakou by si predstavoval, A,B nebo C , ale výsledná známka by byla o hodnota horší, takže když zadá A, hodnota znamka by byla B ..... bez použití IF...Díky estli někdo víjak na to...

Nahlásit jako SPAM
IP: 84.42.187.–
Al0
Věrný člen
22. 3. 2008   #2
-
0
-

char zadano;


cin>>zadano;

switch(zadano){
case 'A': vysledek='B'; break;
case 'B': vysledek='C'; break;
case 'C': vysledek='A'; break;
}

cout << vysledek;

píšu to z hlavy, takže možná to není uplne přesný..

Nahlásit jako SPAM
IP: 77.48.132.–
PSP user|Web developer|C4D user||Maya Lamer|Photoshop User|Guitar player
Bob
~ Anonymní uživatel
46 příspěvků
22. 3. 2008   #3
-
0
-

To Al : jo to je taky pravda na swicth sem uplne zapomel....ale i bez nej by to asi neslo co ? treba pouzitim ukazatelu nebo enumerace.....

Nahlásit jako SPAM
IP: 84.42.187.–
_k_
Duch
22. 3. 2008   #4
-
0
-

Co takto
vysledok = zadane + 1; ?(ak vies, ze nic ine ako to co predpokladas nezada...)

Nahlásit jako SPAM
IP: 195.91.54.–
yaqwsx+9
Posthunter
22. 3. 2008   #5
-
0
-

A co



int moznosti[4] = {1,2,3,1};
int vysledek = moznosti[vstup];

?

Nahlásit jako SPAM
IP: 85.160.66.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Bob
~ Anonymní uživatel
46 příspěvků
22. 3. 2008   #6
-
0
-

To yaqwsx : jo to je dobrý nápad....s čísly by to šlo,ale já bych právě potřeboval aby to pracovalo s písmeny A,B,C...že když uživatel zadá A, tak aby se vypsalo B, když zadá B, tak aby se napsalo C....bez použití IF nebo SWITCH

Nahlásit jako SPAM
IP: 84.42.187.–
Bob
~ Anonymní uživatel
46 příspěvků
22. 3. 2008   #7
-
0
-

Tak už nic všem díky za nápady, už jsem to vyřešil...Stačilo jen přetypovat char na int ten zvýšit o jedna a zpátky přetypovat na char čímž jsem udělal z Ačka Béčko atd...

Nahlásit jako SPAM
IP: 84.42.187.–
yaqwsx+9
Posthunter
22. 3. 2008   #8
-
0
-

To Bob : Ono to ani nemusíš přetypovávat.....

Nahlásit jako SPAM
IP: 85.160.69.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Al0
Věrný člen
22. 3. 2008   #9
-
0
-

přesně tak nemusíš, vlastě když máš char, tak to je podle hodnoty v ASCII tabulce, tedy A je 65 a když přidáš hodnotu 1, tedy 66 což je B ;)

Nahlásit jako SPAM
IP: 77.48.132.–
PSP user|Web developer|C4D user||Maya Lamer|Photoshop User|Guitar player
Bob
~ Anonymní uživatel
46 příspěvků
22. 3. 2008   #10
-
0
-

To Al : aha to sem nevěděl...tak díky moc

Nahlásit jako SPAM
IP: 84.42.187.–
mephi0
Expert
22. 3. 2008   #11
-
0
-

ale znamky niesu nahodou A B C D F ? tušim tam nie je E. Ale to neviem naisto takže len tak by som spravil zoradene pole podla hodnôt, ktoré bude obsahovť množinu znakov a vypočítavaním indexu by som docielil požadované správanie :)

Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
AdamHlavatovic0
Stálý člen
23. 3. 2008   #12
-
0
-

>ale znamky niesu nahodou A B C D F ?
nie, náhodou nie (1 1.5 2 2.5 3 nespravil).

Nahlásit jako SPAM
IP: 217.73.16.–
yaqwsx+9
Posthunter
23. 3. 2008   #13
-
0
-

A smím se zeptat, proč se nesmí použít if a nebo switch?

Nahlásit jako SPAM
IP: 85.160.72.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
_k_
Duch
23. 3. 2008   #14
-
0
-

To yaqwsx : lebo if su (minimalne) 3 instukcie navyse ;)

Nahlásit jako SPAM
IP: 195.91.54.–
yaqwsx+9
Posthunter
23. 3. 2008   #15
-
0
-

To _k_ : TY jo, zase tu někdo vlastní historické PC a chce na něj programovat.... :smile3:

Nahlásit jako SPAM
IP: 85.160.72.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Bob
~ Anonymní uživatel
46 příspěvků
23. 3. 2008   #16
-
0
-

protože jsem chtel prijit na jinou alternativu reseni nez za pouziti IF, proste chtel jsem zjistit jak to jde jinak :-)....nic vic

Nahlásit jako SPAM
IP: 84.42.187.–
Bob
~ Anonymní uživatel
46 příspěvků
23. 3. 2008   #17
-
0
-

To mephi : jo mas pravdu melo by to byt bez E...

Nahlásit jako SPAM
IP: 84.42.187.–
AdamHlavatovic0
Stálý člen
23. 3. 2008   #18
-
0
-

Ako som tu už písal známky sú od A až F (FX) a znamenajú A=1 B=1.5 C=2 D=2.5 E=3 F (FX) =nespravil (je možné, že to nie je všade rovnaké), ale to je jedno.

>A smím se zeptat, proč se nesmí použít if a nebo switch?

V takomto prípade nie je použitie if, else, switch na mieste. Jednak je to plytvanie zdrojmi (čo ale vôbec nemusí byť kritické) ale čo už je horšie, takýto kód o vás ostatným ľudom (programátorom) prezradí, že ste v oblasti programovania a algoritmizácie úplný amatér (čo ale nemusí byť vždy hanba).

Namiesto niekoľkých riadkov if, else, switch použijete len jednu matematickú operáciu, ktorá platí tak pre znaky široké 1 byte, tak aj pre znaky široké 2 byte.

char rating = 'B';

char new_rating = rating + 1;

wchar_t rating = 'B';
wchar_t new_rating = rating + 1;

Pokiaľ je požiadavka taká, že pri zadaní známky sa známka zhorší o jeden stupeň, kde ale neplatí, že známky nasledujú za sebou (ako napr. A, B, C, ...), tak potom je výhodné použiť pole v ktorom sa bude posúvať index.

Nahlásit jako SPAM
IP: 217.73.16.–
Bob
~ Anonymní uživatel
46 příspěvků
23. 3. 2008   #19
-
0
-

To AdamHlavatovic : jo opět díky a jak by si to teda udělal konkrétně?
Očekávám tedy nějyký vstup, třeba uživivatel zadá A tak chci aby bylo teda to B použitím posouvání indexu....prosím o příklad kódu

Nahlásit jako SPAM
IP: 84.42.187.–
_k_
Duch
23. 3. 2008   #20
-
0
-

To AdamHlavatovic : Ale programator, ktory mysli na vsetko by if imho aj tak pozuil: co ak zada uzivatel F ? Dostane odpoved G co je neziaduce a uz ani nehovorim o pripade ak by bolo pouzite pole a vracal by sa i+1 index - segfault jak vysity.
Iba ak by bolo pole zadane {'B','C','D','E','F','F'} ale aj tak nejaky bfu (v tom nepeknom vyzname) moze zadat 'G' a ked sa to nijako neotestuje a nejakym sposobom prevedie na cislo zas nam tu hrozi segfault...

EDIT: pravdaze if/switch mam na mysli len na kontrolovnie kritickych podmienok ;)

Nahlásit jako SPAM
IP: 195.91.54.–
AdamHlavatovic0
Stálý člen
24. 3. 2008   #21
-
0
-

> Ale programator, ktory mysli na vsetko by if imho aj tak pozuil: co ak zada uzivatel F ? ...
Cieľom môjho predchádzajúceho príspevku, nebolo riešiť okrajové podmienky (ktoré sa dajú ošetriť aj bez if/else, tak ako to robí nasledujúci príklad).

To Bob : No napríklad takto:



#include <algorithm>
#include <iostream>
using std::cin;
using std::cout;
using std::min;


#define SIZEOF(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))


const char ratings[] =
{
'A', // 1
'K', // 1.5
'L', // 2
'T', // 2.5
'R', // 3
'J' // failed
};


int main(int argcc, char * argv[])
{
cout << "Zadaj znamku [A, K, L, T, R, J]: ";
char rating = 'J';
cin >> rating;

// find entered rating index
int rating_idx = -1;
for (int i = 0; i < SIZEOF(ratings); ++i)
{
if (ratings[i] == rating)
{
rating_idx = i;
break;
}
}

int new_rating_idx = min(rating_idx + 1, int(SIZEOF(ratings)) - 1);
cout << "Nova znamka: " << ratings[new_rating_idx] << "\n";

return 0;
}

Nahlásit jako SPAM
IP: 217.73.16.–
_k_
Duch
24. 3. 2008   #22
-
0
-

Nie ze by tato diskusia bola na nieco dobra, ale ked som uz zacal...
Nejako tam nevidim nepouzitie podmienok...a navyse prechadzat to v cykli ;/
Co tak takto:

#include <stdio.h>


typedef void (*handler_t)(unsigned char num);

char znamky[] = {'b','c','d','e','f','f'};

void ok_func(unsigned char zn)
{
printf("Znamka je : %c\n", znamky[zn]);
}

void bad_func(unsigned char zn)
{
printf("znamky musia byt a..f\n");
}

handler_t funcs[] = {bad_func, ok_func};

int main()
{
unsigned char index=0,x=0; /*unsigned lebo _chcem_ aby to v pripade chyby pretieklo*/
printf("Znamka[a,b,c,d,e,f]: ");
scanf("%c",(char*)&index);
index= (index - 'a'); /*tu to moze pretiect, a to v pripade chyby chcem*/
x = (~(index / 6) + 1) == (index / 6) ;
(*funcs[x])(index);
return 0;
}

Tento sposob obchadzania if/switch mam obvzlast rad ;)

Nahlásit jako SPAM
IP: 195.91.54.–
AdamHlavatovic0
Stálý člen
24. 3. 2008   #23
-
0
-

Lenže váš kód neberie v úvahu základný predpoklad, a to:
Pokiaľ je požiadavka taká, že pri zadaní známky sa známka zhorší o jeden stupeň, kde ale neplatí, že známky nasledujú za sebou (ako napr. A, B, C, ...) ...

Ak známky nasledujú za sebou, použitie pola a indexovania nemá zmysel, vtom prípade stačí jednoduchý inkrement a funkcia min.

Nahlásit jako SPAM
IP: 217.73.16.–
_k_
Duch
24. 3. 2008   #24
-
0
-

Pole a indexovanie som pouzil len koli prehladnosti a jednoduchosti. A ak chceme pouzit incrementovanie a zachovat podmienku ze pri zadani F dostaneme naspat F, da sa to spravit aj bez min() (mozno teraz trepnem sprostost), ktora imo vnutorne podmienky vyuziva...
Staci prepisat ok_func a to pole smazat:

void ok_func(unsigned char zn)

{
unsigned char inc = ((zn+1) | (zn+1)==0x6) & ~(((zn+1)==0x6) << 1);
printf("Znamka je : %c\n", 'a'+inc);
}


Pravdaze keby znamky nesli za sebou (ak by mali niekde system A,B,C,D,F, napr. ako tu niekto poznamenal) tak by som si riesenie bez pola predstavit nevedel...

Nahlásit jako SPAM
IP: 195.91.54.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Znaky C++ — založil Minko

Znaky — založil pepek

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý