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...
Fórum › C / C++
Práce se znaky
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ý..
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
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 :)
>ale znamky niesu nahodou A B C D F ?
nie, náhodou nie (1 1.5 2 2.5 3 nespravil).
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.
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 ;)
> 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;
}
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 ;)
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.
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...
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Menu , prace s textovymi soubory - závěrečná práce , nevim si rady :( — založil honzajs
Práce v Irsku - Práce v IT a jiných oborech — založil MakeITinIreland
Dev C++ a znaky < a > — založil Vazli
Moderátoři diskuze