freckoMedlem sedan dec. 200010 inlägg Hej.
Jag har ett problem med en uppgift som jag håller på med. Det är så att jag ska skriva ett program som läser in ett antal heltal i intervallet 1 - 10 från en användare och skriver ut hur många av varje siffra som matats in. Inmatningen avslutas med en nolla. Om ett ogiltligt svar matas in så blir det bara ett nytt tal som man ska skriva in. Programmet ska i princip klara hur många tal som helst, men det behövs inte finnas någon speciell felkontroll utan någonting annat än ett heltal skrivs in. Jag tror att detta enklast kan göras med en for loop, men jag är inte säker på det. Utskriften kan tex. vara så här:
1 : 1
2 : 1
3 : 0
4 : 2
osv.
Alltså så ska prgrammet känna av hur många 4 man har tryckt och om man inte har tryckt några fyror så ska det stå 0 där. Någon som har en aning om det här?
Koden som jag har gjort hitills:
#include <iostream.h>
#include <conio.h>
main()
{
int small=0, input=0;
char alt='X';
while (alt != '0')
{
cout << "Skriv in ett tal mellan 1-10, 0 för att avsluta:" << endl;
cin >> input;
if ((input >= 1) && (input <=10))
small++;
cout << "Tryck på 0 för att avsluta, annan för att fortsätta!" << endl << endl;
alt=getch();
}
cout << small << " utmatningar mellan 1-10"<< endl;
getch();
return 0;
}
Hoppas någon vet något, börjar bli desperat :(
------------------
Fredrik
D3VaST8DMedlem sedan dec. 2000485 inlägg Trött, frusen, hungrig och börjar bli lite "smådragen" satte jag mig ner och snickrade ihop detta lite fort...
Använde mig av getline
användaren får skriva in en en radda med heltal, avsluta med enter
koden kan snyggas till men då jag antar det är ett skolarbete får du lösa lite själv.... ;-)
#include <iostream.h>
#include <conio.h>
int main(int argc, char* argv[])
{
const int x=128;
int i=0, j, noll=0, ett=0, tva=0, tre=0, fyra=0, fem=0,
sex=0, sju=0, atta=0, nio=0, tio=0;
char strang[x];
cout \<\< "Skriv in ett tal mellan 0-10:" \<\< endl;
cin.getline(strang, x);
while ((strang *!= '\\0'))
{
switch (strang*)
{
case '1':
ett++;
break;
case '2':
tva++;
break;
case '3':
tre++;
break;
case '4':
fyra++;
break;
case '5':
fem++;
break;
case '6':
sex++;
break;
case '7':
sju++;
break;
case '8':
atta++;
break;
case '9':
nio++;
break;
case '0':
j = i;
if(strang\[j-1\] == '1')
{
tio++;
ett--;
}
else
noll++;
break;
default:
break;
}
i++;
}
cout \<\< "Statistik:" \<\< endl;
cout \<\< "0: " \<\< noll \<\< endl;
cout \<\< "1: " \<\< ett \<\< endl;
cout \<\< "2: " \<\< tva \<\< endl;
cout \<\< "3: " \<\< tre \<\< endl;
cout \<\< "4: " \<\< fyra \<\< endl;
cout \<\< "5: " \<\< fem \<\< endl;
cout \<\< "6: " \<\< sex \<\< endl;
cout \<\< "7: " \<\< sju \<\< endl;
cout \<\< "8: " \<\< atta \<\< endl;
cout \<\< "9: " \<\< nio \<\< endl;
cout \<\< "10: " \<\< tio \<\< endl;
return 0;
}**
freckoMedlem sedan dec. 200010 inlägg Tack.
Ska kolla det på engång.
------------------
Fredrik
PhOrPhErMedlem sedan feb. 20002 300 inlägg Tjo!
Detta är ganska simpelt...
Skapa en heltalsarray innehållande 10 element.
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
int heltal[11]; (Japp, jag kunde ha haft 10 element här men det är snyggare att låta antal ettor ligga på index 1 och antal tvåor på index 2 osv).
Nollställ hela arrayen så att varje element är 0.
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
int i;
for(i=0; i < 10; i++)
heltal = 0;
Om vi nu antar att du skriver siffran 1 så adderar du ett till element 1 i arrayen.
Skriver du in siffran fem så adderar du ett till element 5.
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
heltal[inmatning]++;
Lätt som en plätt?
------------------
- Erik Hellström -
- Datalogiprogrammet - MDH -
- http://3d.burken.nu -
CheezesMedlem sedan nov. 2002501 inlägg Önskar en förklaring och kodexempel, tack.
Jag sprang på den här "dammiga" tråden men min magra geniknöl inom C++ -området fattade inte riktigt hur man egentligen fick utskriften att se ut så här till slut:
Ex.
1 : 1
2 : 1
3 : 0
4 : 2
Leendefull tacksamhet över ett svar, för den som kan putsa till min ena knöl :)
Mvh
/Cheezes
PeWMedlem sedan juni 200010 432 inlägg Re: Önskar en förklaring och kodexempel, tack.
Cheezes skrev:
Jag sprang på den här "dammiga" tråden men min magra geniknöl inom C++ -området fattade inte riktigt hur man egentligen fick utskriften att se ut så här till slut:
Ex.
1 : 1
2 : 1
3 : 0
4 : 2
Leendefull tacksamhet över ett svar, för den som kan putsa till min ena knöl :)
Mvh
/Cheezes
En inmatad sträng loopas till nullterminering och för varje tecken körs selektion (switch-satsen).
Den vänstra siffran är en strängkonstant som skapas i direkt i utströmmen. cout << "0 :". Även kolon ligger med där. Siffran till höger är en variabel som räknas upp beroende på selektionen. << noll << endl;
Mao speglar utskriften förekomsten av ett visst tecken i hela strängen. Man skulle lika gärna kunna räkna på resten av asciitabellen om man nu kände för det.
CheezesMedlem sedan nov. 2002501 inlägg Utskrift önskes!
PeW skrev:
En inmatad sträng loopas till nullterminering och för varje tecken körs selektion (switch-satsen).
Den vänstra siffran är en strängkonstant som skapas i direkt i utströmmen. cout << "0 :". Även kolon ligger med där. Siffran till höger är en variabel som räknas upp beroende på selektionen. << noll << endl;
Mao speglar utskriften förekomsten av ett visst tecken i hela strängen. Man skulle lika gärna kunna räkna på resten av asciitabellen om man nu kände för det.
Tyvärr blev min tänkar-knöl inte tillräckligt tillputsad men ändå lika tacksam, PeW, för ditt svar :)
Jag förmodar att du tog en förklaring av switch-satsen, som jag var dock inte - i denna stund - så intresserad av och för det andra så tycker jag att den satsen är alldeles för "bökig".
Nä, hellre vill jag spetsa mina ögon om array-områdets små konster och få ett mer hum istället över detta.
Förresten, Phorpher, som svarade på freckos desperata fråga, här ovan, skrev följande:
heltal[inmatning]++;
Kan det ha något med utskriften att göra?? :l
Ett kodexempel skulle sitta fint oxå att blänga sina ögon på. Någon som fladdrar med en sådan i handen?
Vore himla tacksam.
Mvh
/Cheezes
CheezesMedlem sedan nov. 2002501 inlägg Siffrorna hittar inte till sin plats i arrayen
Nu har jag suttit mejslat och lekt runt lite själv med kodningen och detta kom jag fram till:
(notera den gröna/blåa texten)
#include <iostream.h>
#include <conio.h>
main()
{
int input=0;
int i;
int heltal[10];
char alt='X';
for(i=0; i < 10; i++)
heltal[i] = 0;
while (alt != '0')
{
cout << "Skriv in ett tal mellan 1-10. 0 för att avsluta:" << endl;
alt=getch();
cin >> input;
if ((input >= 1) && (input <=10))
heltal[i]++; [BLUE][B]// Ööö, står det egentligen rätt till här??
Chansade bara[/B][/BLUE]
}
for (i=1; i<=10; i++) [BLUE][B]// Härifrån och resterande nedre kod,
så chansade jag hej-vilt ännu mera, [/B][/BLUE][1][BLUE]...som tur, var det inte om pengar[/1][/BLUE]
cout << i << ": " << heltal[i] << endl;
getch();
return 0;
}
Visst, så rullade utskriften stegvis fram - 1 till 10 - under programkörningen förutom att det matades in bara med nollor.
1: 0
2: 0
3: 0 o.s.v.
Hur banne mig funkar egentligen dessa arrayer, i denna kodinmatning, av siffror!!??
Att det ska vara sååå krångligt!
*känner efterskotts-medlidande för frecko´s fd lidande här inne*
Mvh
/Cheezes - är nu arr(y)g..!! x(
PhorpherMedlem sedan feb. 20002 300 inlägg Se en array som ett par lådor som alla innehåller samma typ av variabel.
Skapa 10 stycken "lådor" som var och en kan innehålla ett heltal:
int array[10];
För att sedan t.ex. komma åt låda nummer 5 så får du ange vilket index lådan ligger på i arrayen. Index på en array börjar på 0 vilket gör att för att få fram låda 5 så skriver du:
printf("Talet i låda 5 är: %d", array[4]);
Index blir alltså 4 och INTE 5 eftersom indexeringen börjar på 0.
Okej. Om vi nu kollar lite på koden som jag skrev förut. Jag använde något som kan kallas "frekvenstabell". En frekvenstabell är bara en helt vanlig array som innehåller frekvensen för olika tecken.
Om jag vill räkna frekvensen på siffrorna 1-9 så skapar jag en array med 10 lådor. Varför 10 och inte 9 tänker du? Därför att jag vill att i frekvenstabellen så ska antalet 1:or ligga på index 1 och antalet 9:or på index 9.
När du sen läser in t.ex. en 3:a så ökar du på värdet i lådan med index nummer tre (vilket är låda nummer fyra: 0, 1, 2, 3)
Om du läser in strängen: 74562774 så blir resultatet:
[0]: 0
[1]: 0
[2]: 1
[3]: 0
[4]: 2
[5]: 1
[6]: 1
[7]: 3
[8]: 0
[9]: 0
Vet inte om det hjälpte. Är lite stressad så jag hinner inte skriva mer. ;)
PeWMedlem sedan juni 200010 432 inlägg
Phorpher skrev:
Se en array som ett par lådor som alla innehåller samma typ av variabel.
Kunde inte uttryckt det bättre själv :)
Så som ett komplement till Phorphers eminenta inlägg ovan:
En variabel - säg integer - "i", kan efter att den initierats (tilldelats något värde) räknas upp eller ned:
int i = 0;
i = i +1; // i är nu 1
i = i +1; // i är nu 2
osv...
Om jag nu skriver i++ istället för i = i + 1 så blir det exakt samma sak. Vilket ger att om man har en array av heltal (lådor med heltal) så kan man för varje post (låda) använda samma notation. Dvs:
array[i]=array[i]+1;
array[i]++; //samma som ovan.
Observera att detta fungerar om man avser att öka på med 1. Samma med sak gäller för minus: array-- minskar aktuell post "i" med 1. Vill man öka/minska med större tal än 1 är man dock tvungen att använda en annan notation:
array[i]=array[i]+2; // ökar värdet på platsen "i" med 2
array[i]+=2; //samma som ovan
En till detalj som är nog så viktig: Om man skriver notationen "varabel++" så sker uppräkningen med 1 när raden är klar. Vill man att det ska ökas med 1 innan användandet så skrivs "++variabel". Spelar ingen roll i ovan kod (utom i for-satsen), men om man vill korta ned sin kod med uppräkning samtidigt som en variabel accessas vid något tillfälle så har det en avgörande betydelse:
int i,j;
i=0;
j=i++; //j = 0, fast i blev ett efter operationen
j=++i; //j = 2, eftersom i räknades upp innan j tilldelats i's värde
CheezesMedlem sedan nov. 2002501 inlägg A-ha :i Där fick Ni iallafall min "geni"knöl att skina upp!
Så med detta ger jag er, Phorpher&PeW, min sista kodrad här nere, som blir tillägnad till er båda, för era hjälpsamma förklaringar:
cout << "Tack!";
:D
Mvh
/Cheezes