» »

[c] char zadeva

[c] char zadeva

TheCyborg ::

Pozdravljeni!

Sem še bolj med začetnimi programerji in me tukaj nekaj muči pri char tipu. Vem da je majcena zankica, vendar je ne znam rešiti, in sicer takole. Koda zgleda takole:


int main()
{
char a,b,vsota,razlika,kvocient,produkt,zelja,s;


while(zelja!=5)
{


printf("Vnesi prvo stevilo a:");
scanf("%c%c",&a);
printf("Vnesi drugo stevilo b:");
scanf("%c%c",&b);
system("cls");

printf("Pritisnite 1 za izracun vsote\nPritisnite 2 za izracun produkta\nPritisnite 3 za izracun kvocienta\nPritisnite 4 za izracun razlike\nPritisnite 5 za izhod iz programa\nPritisnite S za izris smeskota\n");
scanf("%c%c",&zelja);
if(zelja=='1')
{
vsota=a+b;
printf("Vsota teh dveh stevil je = %c\n",vsota);
}
else if(zelja=='2')
{
produkt=a*b;
printf("Produkt teh dveh stevil je = %c\n",produkt);
}
else if(zelja=='3')
{
kvocient=a/b;
printf("Kolicnik teh dveh stevil je = %c\n",kvocient);
}
else if(zelja=='4')
{
razlika=a-b;
printf("Razlika teh dveh stevil je = %c\n",razlika);
}

else if(zelja=='5')
{
system("pause");
return 0;
}
else if(zelja=='s' || zelja=='S')
{
printf("\n\n * *\n");
printf(" - \n");
printf(" |________|\n");
}

}

}

Mene muči sedaj, ko naprimer pritisnem "1" da sešteje 2 števili, mi namesto številke vsote, izpiše isto znak. In ko želim sešteti 5 + 5 je rezultat "J". Zelim da pa bi bil stevilka 10.
Char sem uporabil samo za to, da ko pritisnes S da ti izrise smeskota. (malce je zamaknjen v kodi, čeprav izpis je zelo drugačen)

Hvala za vse.

Lp, Cyborg
  • spremenilo: OwcA ()

Utk ::

Ja prve dve številke preberi kot številke, pol tisto v "meniju" pa kot char, če ga že moraš met...(v čem je pa fora tega smeškota??:\ )

Gundolf ::

char a;
printf("Vnesi prvo stevilo a:");
scanf("%c%c",&a);

Prvič, ne vem zakaj preberes dva znaka.
Drugič, namesto znaka raje preberi int (ali pa double)
int a;
printf("Vnesi prvo stevilo a:");
scanf("%d",&a);

Za željo lahko še vedno uporabljaš char.

ql000 ::

če pa ravno vstrajaš pri char tipu pa obstajajo tudi funkcije za konverzjo, npr: atoi (ascii to integer). za ostale si pa malo na netu poglej.

LP

BigBoss ::

Kot prvo in prvo. Nimaš kontrole na deljenje z 0 (če je b=0 se bo program neslavno sesul).

Hm. Zakaj char ?

Kot drugo in drugo. Nimaš postavljenih začetnh vrednosti za a in b

Programira se nikoli kar iz glave.

Vedno se najprej naredi načrt programa in na njem preveri delovanje. Kot lahko vidiš lahko že v par vrsticah zakriviš "division with zero".

Ko se uvede novo spremenljivko se vedno psotavi tudi začetne vrednosti. Neupoštevanje tega pravila vodi k veliki zgubi časa pri odkrivanju vzroka "kraških pojavov".

TheCyborg ::

Dva znaka prebere za to, da mi "enter" iz prejsne vrstice ne zavzame. Fora smeskota, je samo malce da nalogo zakompliciram.

Če dam a in b kod intiger, oz. float potem sploh rezultata ne napise. Prepisite program pa probajte, boste videli.

Gundolf ::

Uporabi možgane, zato jih pa imaš. Če imaš a in b tipa int ali float, potem morajo biti istega tipa tudi vsi možni rezultati (produkt, vsota, ... - sploh ne vem zakaj imaš različna imena). Drugače pa kakor si že opazil ti "%c" v printf formau pove da izpisuješ char, se pravi znak in ne številke, kar moraš povedati z "%d"za inte oziroma "%f" za floate.

Zakaj je scanf("%d%c", a) narobe? Resda ti prebere še enter takoj za znakom a tega nikamor ne pospraviš. Toliko kolikor spremenljivk prebereš, toliko jih moraš shraniti. Bolje bi bilo scanf("%d%d", a, dummy), pri čemer spremenljivke dummy pač nikjer ne uporabiš. Mislim pa da deluje tudi naslednji način scanf("%d\n", a). Drugače si pa poglej specifikacijo scanf-a za njegovo pravilno uporabo.

TheCyborg ::

Sorry ampak mi ni jasno. Sm zamenjal v print-u %f. In potem sm dal, a,b,kvocient,razlika,produkt,vsota kot float. Zelja pa s, pa kot char. In potem se program sesuje. Isto sm probal na %d%c in ni delovalo.

Gundolf ::

Daj double. Kje pa sploh uporabljaš spremenljivko s?

TheCyborg ::

Spremenljivko S uporabim, ta ko pritisnes S da ti izrise smeskota.

Isto je z double, vnesem a vnese b, in potem izberem svojo zeljo, ter dam 1 za sestevanje, in program se sesuje.

Zgodovina sprememb…

OwcA ::

Če že praviš, da delaš v C++ si olajšaj življenje in uporabi std::string ter tokove.
Otroška radovednost - gonilo napredka.

Gundolf ::

Pejsti še program ki ti crasha, tokrat ga postavi med [ st.koda c] in [ /st.koda c] (brez presledkov za oklepajem), da se ga bo malo lepše videlo. Sigurno kje nisi uporabil "%f".

Glede spremenjlivke s, je pa NE uporabljas. Vsaj v tej verziji ki si jo pokazal je ne.

Še to, ta tema se tiče C-ja in ne C++-a, tako za naslednjič.

TheCyborg ::

Je pa programiranje, ali ne? Mas več jezikov, c, c#,c++,visual basic c... (sorry če se motim)

Evo koda, sesuje se, ko zelim sesteti, se pravi ko pritisnem stevilko 1.

#include <stdio.h>
#include <stdlib.h>

int main()
{
char zelja,s;
float a,b,vsota,razlika,kvocient,produkt;



while(zelja!=5)
{


printf("Vnesi prvo stevilo a:");
scanf("%f",&a);
printf("Vnesi drugo stevilo b:");
scanf("%f",&b);
system("cls");

printf("Pritisnite 1 za izracun vsote\n
Pritisnite 2 za izracun produkta\n
Pritisnite 3 za izracun kvocienta\n
Pritisnite 4 za izracun razlike\n
Pritisnite 5 za izhod iz programa\n
Pritisnite S za izris smeskota\n");

scanf("%c%c",&zelja);
if(zelja=='1')
  {
     vsota=a+b;
     printf("Vsota teh dveh stevil je = %f\n",vsota);
  }
else if(zelja=='2')
     {
       produkt=a*b;
       printf("Produkt teh dveh stevil je = %f\n",produkt);
     }
else if(zelja=='3')
       {
           kvocient=a/b;
           printf("Kolicnik teh dveh stevil je = %f\n",kvocient);
       }
else if(zelja=='4')
         {
            razlika=a-b;
            printf("Razlika teh dveh stevil je = %f\n",razlika);
         }

else if(zelja=='5')
            {
               system("pause");
               return 0;
            }
else if(zelja=='s' || zelja=='S')
  {
    printf("            * *\n");
    printf("             - \n");
    printf("         |________|\n");
  }

}

}

Zgodovina sprememb…

OwcA ::

Evo koda, sesuje se, ko zelim sesteti, se pravi ko pritisnem stevilko 1.

Samo v tem primeru?
Zdi se mi, da je tisti scanf narobe, oziroma je nedefinirano obnašanje, če imaš premalo parametrov (ena večjih pomanjklivosti stdio knjižnice).

Je pa programiranje, ali ne? Mas več jezikov, c, c#,c++,visual basic c... (sorry če se motim)

Poglej naslov teme.
Kar ti pišeš je čisti C.
Otroška radovednost - gonilo napredka.

SasoS ::

scanf("%c%c",&zelja);

bereš 2 characterja, shraniš pa samo enega. ni čudno da se sesuje.
daj za scanf še en getch() če se hočeš znebit entra.

TheCyborg ::

SasoS sm probal in ni slo. Sj mas doma kak compiler, vpisi program pa probaj pa bos videl.

@Owca: Ops, se opravičujem, tebi tudi Gundolf.

Zgodovina sprememb…

OwcA ::

Poskusil si:
scanf("%c", &zelja);
getch();

?

Lepo bi bilo tudi zelja inicializirati, while se v prvi ponovitvi obnaša nedefinirano.
Otroška radovednost - gonilo napredka.

Quikee ::

Se lepse bi bil do.. while

TheCyborg ::

Owca, ne z getch(); ne deluje, sm probal pred scanf in za scanf. Ter oboje in ni delovalo. Sem pa probal od Gundolf-a moznost, ter sm uvedel se eno spremenljivko, dummy, ki prebere enter, druga pa potem mojo zeljo prebere. Tako da program sedaj deluje. Amapk kako bi lahko naredil brez dummy spremenljivke. Slisal sem da %*c ne prebere entra iz prejsne vrstice. Ta "*".

Koda je pa sedaj takšna.

#include <stdio.h>
#include <stdlib.h>

int main(void){
char zelja,s,dummy;
float a,b,vsota,razlika,kvocient,produkt;

do
{


printf("Vnesi prvo stevilo a:");
scanf("%f",&a);
printf("Vnesi drugo stevilo b:");
scanf("%f",&b);
system("cls");

printf("Pritisnite 1 za izracun vsote\n
Pritisnite 2 za izracun produkta\n
Pritisnite 3 za izracun kvocienta\n
Pritisnite 4 za izracun razlike\n
Pritisnite 5 za izhod iz programa\n
Pritisnite S za izris smeskota\n");
scanf("%c%c",&dummy,&zelja);
if(zelja=='1')
{
vsota=a+b;
printf("Vsota teh dveh stevil je = %f\n",vsota);
}
else if(zelja=='2')
{
produkt=a*b;
printf("Produkt teh dveh stevil je = %f\n",produkt);
}
else if(zelja=='3')
{
kvocient=a/b;
printf("Kolicnik teh dveh stevil je = %f\n",kvocient);
}
else if(zelja=='4')
{
razlika=a-b;
printf("Razlika teh dveh stevil je = %f\n",razlika);
}

else if(zelja=='5')
{
system("pause");
return 0;
}
else if(zelja=='s' || zelja=='S')
{
printf("            * *\n");
printf("             - \n");
printf("         |________|\n");
}
}
while(zelja!=5);

}


Hvala za pomoč ! :D

Zgodovina sprememb…

Gundolf ::

Še vedno predlagam, da si pogledaš help za scanf in printf. Da boš videl vse možne %f %d %g %1.2g * / []..., s katerimi lahko določiš čisto vse kar hočeš. Obstaja tudi način, s katerim prebereš vse do konca vrstice in to zavržeš (brez uporabe dummy spremenljivke). Še bolje je pa če presedlaš na C++ in uporabljaš string-e in stream-e. Samo boš pa moral prej malo bolj razumeti objektno programiranje.

TheCyborg ::

Ja, ravnokar sm delal na programu da bi se tega znebil in dela tudi takole: scanf("%*c%c",&zelja);

Lp, Cyborg

losnah ::

Čist sam za informacijo. Da nimaš tolk spremenljivk razlika, vsota, ..., lahko napišeš tko:

if(zelja == '1')
    printf("Vsota teh dveh stevil je = %f\n", a+b);
else if(zelja == '2')
    printf("Produkt teh dveh stevil je = %f\n", a*b);
itd...


Al jih pa zamenaš z eno samo rezultat.

if(zelja == '1')
{
    rezultat = a+b;
    printf("Vsota teh dveh stevil je = %f\n", rezultat);
}
else if(zelja == '2')
{
    rezultat = a*b;
    printf("Produkt teh dveh stevil je = %f\n", rezultat);
}
itd...

TheCyborg ::

Sj ql, program lahko potem poenostavljaš! Vseeno hvala za vaš trud!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] - Spreminjanje programa s pointerji

Oddelek: Programiranje
61076 (828) DaMachk
»

C programiranje (strani: 1 2 3 )

Oddelek: Programiranje
14126700 (16996) amacar
»

naloga ne funkcionira

Oddelek: Programiranje
101353 (1262) FX6300B
»

Nemorem rešit ene naloge z c++ (sem začetnik) (strani: 1 2 )

Oddelek: Programiranje
6810001 (5739) technolog
»

Prikaz programa v windowsih

Oddelek: Programiranje
101143 (1061) s51as

Več podobnih tem