WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   c-übungsbeispiel - switch (http://www.wcm.at/forum/showthread.php?t=117391)

Bastet 01.12.2003 20:16

c-übungsbeispiel - switch
 
also ich hab ein übungsbeispiel:

Buchhandlungsprogramm erstellen:
Ausgabe: Rabatt in S; EK-preis minus rabatt in S;
wenn der Einkauf:
über 5000 S ist bekommst du 20%
über 3000 - 4999 S bekommst du 14%
über 2000 - 3999 S bekommst du 8 %
usw.

also ich kann das beispiel mit ner if anweisung lösen, aber ich hab mir gedacht, wenn ich ne switch anweisung schreib wärs effizienter. allerdings hab ich noch nicht gelernt wie ne switch syntax ausschaun muss wenn der: ekpreis im bereich VON 5000 BIS 4999 liegt.

zb. ek = 3256
ek <=5000 (??? - aber wie ists mit liegt zw. 5000 - 4999 ???)

thx
btw: n00b erklärung bütte ;)

moorhahn 01.12.2003 20:26

geht imo nicht.

die switch syntax: http://www-numi.fnal.gov/offline_sof...ib/switch.html

googlen: http://www.google.at/search?q=switch...-8&hl=de&meta=

Bastet 01.12.2003 20:45

hmm... dacht ich mir fast :( , aba da ich noch anfänger bin, weiss ich auch, dass ich noch viel lernen muss. und irgendjemand weiss immer ne 'kürzere' lösung.

btw: ich kann auch googeln ;)

Who-T 02.12.2003 00:08

also in dem fall ginge es mit einem workaround


Code:

switch (price/1000)
{
  case 0:
  case 1: discount = 0.05; break;
  case 2: discount = 0.08; break;
  case 3:
  case 4: discount = 0.15; break;
  default: discount = 0.2; break;

}


wenn du eine integerdivison machst (int/int) dann werden die kommastellen weggeschnitten

3000 / 1000 = 3
3999 / 1000 = 3
usw

Bastet 02.12.2003 09:56

thx, werd ich heute abend gleich mal ausprobieren.

kikakater 02.12.2003 14:40

Sehr gute Lösung mit dem Switch !

Für den Alltag sollte es aber wirklich so aussehen:

Code:

if(preis<nicht_rabattfaehige_grenze) rabatt= 0.0;
else if(preis<rabattgrenze1) rabatt= hausnummer1;
else if ...

oder

Code:

#define RABATT_STUFEN 5

float preis,rabatt;
int i;

/* Array mit Preisgrenzen und Rabatten in Prozent */
float preis_rabatt[RABATT_STUFEN][2];

preis_rabatt[0][0]= 2000.0; /* alles zwischen 0 und 1999.99999 */
preis_rabatt[0][1]= 0.0; /* 0 Prozent */

preis_rabatt[1][0]= 3000.0; /* alles zwischen 2000 und 2999.99999 */
preis_rabatt[1][1]= 2.0; /* 2 Prozent */

preis_rabatt[2][0]= 4000.0; /* alles zwischen 3000 und 3999.99999 */
preis_rabatt[2][1]= 5.0; /* 5 Prozent */

preis_rabatt[3][0]= 5000.0; /* alles zwischen 4000 und 4999.99999 */
preis_rabatt[3][1]= 8.0; /* 8 Prozent */

preis_rabatt[4][0]= 5000.0; /* alles ab 5000 */
preis_rabatt[4][1]= 10.0; /* 10 Prozent */

if(preis_rabatt[RABATT_STUFEN-1][0]>=preis)
{ rabatt= preis_rabatt[RABATT_STUFEN-1][1]; }
else
{
 for(rabatt=0.0,i=0;i<RABATT_STUFEN;i++)
 {
  if(preis_rabatt[i][0]>preis)
  { rabatt= preis_rabatt[i][1]; break; }
 }
}

printf("Der Preis %f erlaubt %f Prozent Rabatt.\n"
"Somit ist der Rabatt reduzierte Preis: %f\n",preis,rabatt,preis - preis * rabatt);


Bastet 02.12.2003 16:50

:eek: des is jo so kurz :D

hab mir gedacht ich mach das beispiel halt mal mit verschiedenen anweisungen, dann lernt man wirklich was. ich habs mal mit if gemacht, so jetzt werd ich mal switch ausprobieren und dann guck ich mir deins ganz genau an :)

ajo, mal mein code post... habs a bisserl verkürzt, weil ich doch noch draufgekommen bin wie ich von - bis benützen kann. allerdings hab ich den preis: über 3000 - 4999 S bekommst du 14% von 3000 auf 4000 geändert.(glaube da ham die sich verschrieben)

Code:

#include <stdio.h>


int main(void)
 {
        int ekpreis, rabatt1, rabatt2, rabatt3, rabatt4, summe, antwort;

      do
  {
        printf("\nGeben Sie den Einkaufspreis ein:");
        scanf("%d",&ekpreis);


        rabatt1=(ekpreis/100)*3;
        rabatt2=(ekpreis/100)*8;
        rabatt3=(ekpreis/100)*14;
        rabatt4=(ekpreis/100)*20;


        if(ekpreis<=999)
        {          ekpreis=ekpreis;
                  printf("\nDer Einkaufspreis betraegt %d S. - Es wird kein Rabatt gewaehrt", ekpreis);
        }
        if((ekpreis>=1000) && (ekpreis<=1999))
        {          ekpreis-=rabatt1;
                  printf("\nDer ermaessigte Preis betraegt %d S. Rabatt von 3%% - %d S. wurde abgezogen", ekpreis, rabatt1);
        }
        if((ekpreis>=2000) && (ekpreis<=3999))
        {          ekpreis-=rabatt2;
                  printf("\nDer ermaessigte Preis betraegt %d S. Rabatt von 8%% - %d S. wurde abgezogen", ekpreis, rabatt2);
        }
        if((ekpreis>=4000) && (ekpreis<=4999))
        {          ekpreis-=rabatt3;
                  printf("\nDer ermaessigte Preis betraegt %d S. Rabatt von 14%% - %d S. wurde abgezogen", ekpreis, rabatt3);
        }
        if(ekpreis>=5000)
        {          ekpreis-=rabatt4;
                  printf("\nDer ermaessigte Preis betraegt %d S. Rabatt von 20%% - %d S. wurde abgezogen", ekpreis, rabatt4);
        }
        getchar();

        printf("\nWollen sie noch eine Preiseingabe taetigen? (j/n)");
        antwort=getchar();
  } while(antwort=='j');

  printf("\nTschuess!");


Bastet 02.12.2003 17:14

*grml* da fällt mir grad auf dass i a unnötige var gmacht hab
:lol: i weiss garnimma wieso i a summe gmacht hab
fällt mir grad wieder ein, ich wollte eigentlich des selbe aber anstatt rabatt1-4 mit summe1-4 machen :o

Who-T 03.12.2003 03:03

Zitat:

Original geschrieben von Bastet
Code:

        if(ekpreis<=999)
        {          ekpreis=ekpreis;
                  printf("\nDer Einkaufspreis betraegt %d S. - Es wird kein Rabatt gewaehrt", ekpreis);
        }
        if((ekpreis>=1000) && (ekpreis<=1999))
        {          ekpreis-=rabatt1;
                  printf("\nDer ermaessigte Preis betraegt %d S. Rabatt von 3%% - %d S. wurde abgezogen", ekpreis, rabatt1);
        }
[...]


mach es mit else

Code:

if (ekpreis<=999)
{
  // do_stuff
} else if (ekpreis <= 1999)
{
  // do_stuff
} else if (ekpreis <= 2999)
...

denn derzeit überprüfst du immer jede if-bedingung.
mit else überprüfst du bis zur ersten zutreffenden, der rest wird übersprungen.

außerdem ersparst du dir das ek > n && ek < N, weil ek > n true ist wenn er überhaupt bis dorthin kommt

Bastet 03.12.2003 09:47

naja - warum einfach wenns kompliziert auch geht :D ;)

genau deshalb dacht ich mir, wenn ich dieses beispiel nehme und mal mehrere arten ausprobier, lern ich eher die unterschiede. hatte garnicht daran gedacht, dass alle ifs abgearbeitet werden... primär gings mir darum dass es überhaupt funktioniert. (lern erst seit 20.11.03 an dem c-einführungsskript)

für das array beispiel vom kikakater muss ich noch viel lernen :rolleyes:


merci leute, für den super input - werd mich anstrengen :)


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag