Dagens problem Försäljarprovision Lönen för en försäljare är helt grundad på provision, direkt kopplad till den omsättning han lyckas skapa under en månad. Tabellen nedan anger procentsatser för olika intervall av omsättningens belopp Belopp Belopp > procent 100 000 10 100 000 150 000 12 150 000 200 000 15 200 000 20 För den delen av omsättningen som är 100000 erhåller han 10% kr i lön. För delen som hamnar mellan 100000 kr och 150000 kr får han 12% i lön och så vidare. Skriv ett program som tar emot uppgift om, för hur många månader( 5) beräkningen ska utföras, och därefter lika många månadsbelopp för omsättningen. Programmet ska skriva ut den totala lönen under perioden med två decimaler och i övrig fungera som i exemplen nedan: Antal månader: 2 Antal månader: 3 Månad 1: 150000 Månad 1: 31250 Månad 2: 175000 Månad 2: 130100 Lön under perioden: 35750.00 Månad 3: 250785 Lön under perioden: 50394.00 Håkan Strömberg 1 STH KTH
Löneförhöjning Adam och Bertil ska båda just till att påbörja en ny anställning. Adam kommer inledningsvis att tjäna a kr/mån och Bertil b kr/mån. Även om a är mindre än b, har Adam fått ett löneavtal som ger honom ap% i löneförhöjning varje halvår. Bertil kommer att få lönen höjd med bp% varje helår. Skriv ett program som tar emot data om a,b,ap och bp och som bestämmer hur många månader det dröjer innan Adams månadslön är högre än Bertils. Programmet ska också beräkna hur lång tid (i månader) det tar för Adams totala inkomst att bli större än Bertils. Ett körningsexempel visar dialogen. A månadslön (kr) : 20000 A höjning(proc/halvår): 3 B månadslön (kr) : 23000 B höjning(proc/år) : 4 A har högre månadslön efter 78 månader A har tjänat totalt mer efter 149 månader Tester kommer endast att göras med indata som leder till Adam verkligen kommer att få en högre lön än Bertil Siffersumma Skriv ett program som tar reda på hur många sexsiffriga tal i ett givet intervall (inklusive gränser) det finns, där summan av de tre första siffrorna är lika med summan av de tre sista. Från och med talet: 123456 Till och med talet: 654321 Det finns 31607 sådana tal Det första talet innehåller alltså alltid sex siffror och är mindre än eller lika med det andra talet som också innehåller sex siffror. Håkan Strömberg 2 STH KTH
Stridande arméer Vi ska här simulera en strid mellan två arméer, där striden är indelad i ett antal perioder. Indata till simuleringen är arméernas storlekar, i antal soldater räknat, och sannolikhet att en soldat i den ena armén under en period ska lyckas likvidera en soldat i den andra armén. Här ett exempel på indata: Arme 1 Antal : 1000 Arme 1 Träffproc : 0.02 Arme 2 Antal : 1500 Arme 2 Träffproc : 0.01 Den första armén har alltså från början 1000 soldater. Varje soldat har 2% chans att slå ut en soldat i den andra armén under en tidsperiod. Med hjälp av följande formler kan vi bestämma läget i striden efter period n: { xn+1 = x n t y y n y n+1 = y n t x x n x n och y n är antalet soldater i de två arméerna efter period n. x n+1 och y n+1 är antalet soldater efter period n + 1 t x och t y är motsvarande sannolikheter. Skriv ett program som tar emot indata enligt ovan och som bestämmer efter hur många perioder striden är över. Det kan vara lämpligt att även skriva ut en tabell som visar antalet soldater i de två arméerna period för period. Testdata ovan ger utskriften: Arme 2 har vunnit striden efter 125 perioder. Observera att trots att ordet sannolikhet förekommer i texten så ska inga slumptal användas här. Håkan Strömberg 3 STH KTH
Lösningsförslag Försäljarprovision 1 void main(void){ 2 int belopp,n,i; 3 float tot=0.0; 4 clrscr(); 5 printf("antal månader: "); 6 scanf("%d",&n); 7 for(i=1;i<=n;i++){ 8 printf("månad %d: ",i); 9 scanf("%d",&belopp); 10 if(belopp<=100000) 11 tot=tot+belopp 0.10; 12 else { 13 tot=tot+100000 0.10; 14 if(belopp<=150000) 15 tot=tot+(belopp 100000) 0.12; 16 else { 17 tot=tot+50000 0.12; 18 if(belopp<=200000) 19 tot=tot+(belopp 150000) 0.15; 20 else 21 tot=tot+50000 0.15+(belopp 200000) 0.20; 22 23 24 25 printf("total lön under perioden: %.2f\n",tot); 26 Ja så här började tentamen! Jag blev nog lite chockad när jag förstod att formuleringen av problemet inte gick fram. En ursäkt till de första som frågade då jag bara klappade dem på axeln och uppmanade dem att tänka till. Så småningom föll jag till föga och jag hoppas att alla som ville ha, fick en tillräcklig förklaring. Men varför en sådan uppgift? Jag står på mig det är lika viktigt (om inte viktigare) att kunna läsa en text och tolka dess innehåll, som att kunna skriva ett program i C. Visst men det var första uppgiften och nästan första tentan på hela utbildningen och ni blev nervösa. 8-25 Lösningsförslaget ovan består av en for-sats. Ett varv för varje månad. 11-24 Uppdelandet i olika intervall kan lösas med hjälp av en if-else konstruktion. När man som här undviker att definiera konstanter med define får man en ganska ful kod. Håkan Strömberg 4 STH KTH
Ett alternativ kan vara att lagra konstanterna (belopp och procent) i en matris. Koden blir då något kortare, samtidigt som kodningen blir något svårare. Löneförhöjning #include <stdio.h> void main(void){ float alon,ahoj,blon,bhoj,atot=0.0,btot=0.0; int man=0,totlon=0,manlon=0; printf("a månadslön (kr) "); scanf("%f",&alon); printf("a höjning(%/halvår) "); scanf("%f",&ahoj); printf("b månadslön (kr) "); scanf("%f",&blon); printf("b höjning(%/år) "); scanf("%f",&bhoj); while(manlon==0 totlon==0){ if(alon>blon && manlon==0){ printf("a har högre månadslön efter %d månader\n",man); manlon=1; man++; atot=atot+alon; btot=btot+blon; if(man%6==0) alon=alon*(1+ahoj/100); if(man%12==0) blon=blon*(1+bhoj/100); if(atot>btot && totlon==0){ printf("a har tjänat totalt mer efter %d månader\n",man); totlon=1; Håkan Strömberg 5 STH KTH
Siffersumma 1 void main(void){ 2 int fran,till,antal=0,sum1,sum2,tal,i,j; 3 clrscr(); 4 printf("från och med tal: "); 5 scanf("%d",&fran); 6 printf("till och med tal: "); 7 scanf("%d",&till); 8 for(i=fran;i<=till;i++){ 9 sum1=0; sum2=0; tal=i; 10 for(j=1;j<=3;j++){ 11 sum1=sum1+tal%10; 12 tal=tal/10; 13 14 for(j=1;j<=3;j++){ 15 sum2=sum2+tal%10; 16 tal=tal/10; 17 18 if(sum1==sum2) 19 antal++; 20 21 printf("\ndet finns %d sådana tal\n",antal); 22 8-20 En for-loop, där ett varv tar hand om ett tal i det givna intervallet. För att den övre gränsen ska tas med ska avbrottsvillkoret skrivas i<=till. 10-13 En for-loop som bestämmer summan av de tre sista siffrorna. tal huggs av med en siffra i varje varv. En konstruktion som vi övat på flera gånger under kursen. 14-17 När vi når den loop som ska beräkna summan av talets tre första siffror består tal lagom av just tre siffror. 18-19 Vi har nu två summor, sum1 och sum2 att jämföra. Är de lika är det dags räkna upp antal 21 När vi kommer hit, vet vi hur många tal det finns av den typ vi söker. Håkan Strömberg 6 STH KTH
Stridande arméer #include <stdio.h> int main(void){ float arme1,arme2,t1,t2,tmp; int period=0; printf("arme 1 : "); scanf("%f",&arme1); printf("träffproc : "); scanf("%f",&t1); printf("arme 2 : "); scanf("%f",&arme2); printf("träffproc : "); scanf("%f",&t2); do{ tmp=arme1-t2*arme2; arme2=arme2-t1*arme1; arme1=tmp; period++; printf("%4d %5.0f %5.0f\n",period,arme1,arme2); while(arme1>0 && arme2>0); Håkan Strömberg 7 STH KTH