C++: Hur skriver jag en lista?

Tråden skapades och har fått 32 svar. Det senaste inlägget skrevs .
  • Medlem
  • Sundsvall
  • 2006-12-01 11:14

Hej hej!

Jag har skrivit ett litet program i c++ som tar emot 20 heltal, gör några beräkningar på dem och sedan skriva ut vilka tal det var användaren matade in i någon form av lista, för det blir ju ganska tråkigt att bara skriva ut talen en efter en när de är så här många.

Som det ser ut i min kod nedan så ser det ganska tråkigt ut på skärmen, kan någon ge mig förslag på hur jag kan sätta upp en fin och tydlig lista över talen?

cout<<"Talen du matade in är: "<<endl;
for(i=0; i<ANTAL; i++)
{

cout.width(8);
cout<<talen[i] <<endl;

}

  • Medlem
  • Sollentuna
  • 2006-12-01 11:40

Vad menar Du med "sätta upp lista"?
Menar Du typ en kolumn med fast bredd, så att siffrorna hamnar snyggt ovanför varandra?

  • Medlem
  • Sundsvall
  • 2006-12-01 11:50

cout.width(8); bestämmer väl hur bredd kolumnen är?

men kanske att det skulle stå någon text eller symbol bredvid varje siffra och då blir det kanske finare även om de bara i gger i en enda kolumn och inte i två kolumner, men kom gärna med förslag om hur ni skulle göra.

  • Medlem
  • Sollentuna
  • 2006-12-01 12:16

Ok, för att välja lämpligaste presentation måste man kanske veta lite mer om vad det är för siffror man hanterar. Är det temperaturer, valutor, vilket intervall representerar de olika indexen, etc.

Ett sätt är att skriva

cout << i << " : " << talen[i] <<endl;

men som sagt, det skall nog ses i ljuset av rätt kontext...

  • Medlem
  • Sundsvall
  • 2006-12-01 12:44

Tackar!
Det blev ju fint.

  • Medlem
  • Sundsvall
  • 2006-12-01 14:27

Aha, märkte en sak. Loopen räknar ju från 0 till 20 så det visas på skärmen enligt det exemplet du skrev Tal 0: något och det sista blir Tal 19: något.

Hur kan vi göra för att det ska visas från 1 till 20 istället så att numreringen blir rätt och inte enligt indexen?

  • Medlem
  • Sollentuna
  • 2006-12-01 14:50

cout << i+1 << " : " << talen[i] <<endl;

  • Medlem
  • Sundsvall
  • 2006-12-01 15:04

Perfekt! Tack ulfis.

  • Medlem
  • Sundsvall
  • 2006-12-04 09:26

Hej igen!
Känns som om det är något fel med den koden, har inte kört det än för programmet inte är klart, kan du se vad det är som måste rättas till?
Jag kommer nämligen att räkna fram 50st tal och skriva ut dem i 5 kolumner, och då skrev jag så här:
for(i=0; i<5; i++)
{
for(j=0; j<10; j++)
{
utdata=[i,j];
cout<<utdata<<endl;
}
}

  • Medlem
  • 2006-12-04 10:05

Ligger alla talen i en array?
Isf borde
utdata=[i,j];
vara
utdata = talen[i*10+j];
(fast kanske bättre att ha en egen räknare till arrayen som går direkt mellan 0-50)

Och så vill du nog inte ha endl efter varje enskilt tal om du ska ha "kolumner".

  • Medlem
  • Sundsvall
  • 2006-12-04 11:04

Hmm nu har jag ställt till det ordentligt, får bara en massa bokstäver och siffror i utskrift och inte ser alls ut som kolumner

int main (){

int i,j, utdata[5][5], primtal=50;


cout<<"Primtalen är: ";

for(i=0; i<=primtal; i++)
{
if(i%i==0 && i%1==0)
utdata[i,i];

cout.width(3);
cout<<utdata;

}



return 0;
}

Ursprungligen av Banaz:

Hmm nu har jag ställt till det ordentligt, får bara en massa bokstäver och siffror i utskrift och inte ser alls ut som kolumner

int main (){
    
	int i,j, utdata[5][5], primtal=50;
	
	
	cout<<"Primtalen är: ";
	
	 for(i=0; i<=primtal; i++)
	 {
		if(i%i==0 && i%1==0)
			utdata[i,i];
		
		cout.width(3);	
		cout<<utdata;
	
	}
	
    return 0;
}

Vad är det du vill skriva ut egentligen? Du försöker nu skriva ut cdata som är en array av arrayer, dvs en stackpekare. Sifforna du ser är nog minnesadresser (hexadecimalt, därav bokstäverna). Och vad vill du att raden efter if-satsen ska göra? Jag tycker det ser ut som en icke-operation just nu.

Fast egentligen kanske jag ska fråga vilken metod för primtalsberäkning du egentligen vill använda. Den metod du använder nu kommer ange att alla tal är primtal.

--Tage

  • Medlem
  • Sundsvall
  • 2006-12-06 12:38

Som sagt så har jag ställt till det, det jag vill egentligen är att programmet ska ta fram de första 50 primtalen. Metoden jag använder betraktar alla tal som prima ja.
Jag kan inte någon metod att räkna ut primtalen, man kanske kan kontrollera att talet inte går att dela med ett mindre tal för att bestämma om det är primt eller inte, men jag vet inte hur jag ska skriva algoritmen.
När detta är klart så ska dessa tal skrivas ut i 5 kolumner.

  • Medlem
  • Mölndal
  • 2006-12-06 13:19

Tycker din metod låter jättebra. Se först till att du har en array med alla dina primtal (och inga andra tal ). Att skriva ut dem snyggt får sedan bli steg två.

Ursprungligen av memark:

Tycker din metod låter jättebra. Se först till att du har en array med alla dina primtal (och inga andra tal ). Att skriva ut dem snyggt får sedan bli steg två.

Memark har helt rätt. När det gäller en sådan här uppgift gäller det att först veta det centrala man försöker göra och hur man ska göra det. Själva presentationen är en senare fråga.

Memarks förslag med en array med tal i är en bra idé, men börja med att ha alla tal i den och sedan stoppa in nollor för tal som inte är prima. Detta är en klassiskt metod för att hitta primtal under ett visst tal och kallas Eratosthenes såll. Du kan läsa om Eratosthenes såll på susning.nu: http://susning.nu/Eratosthenes_s%e5ll och på Wikipedia: http://sv.wikipedia.org/wiki/Eratosthenes_s%C3%A5ll (obs att exemplet på susning.nu använder en genväg för att inte behöva räkna så mycket, därav kommentaren om roten ur 20).

--Tage

  • Medlem
  • Sundsvall
  • 2006-12-06 13:50
Ursprungligen av memark:

Tycker din metod låter jättebra. Se först till att du har en array med alla dina primtal (och inga andra tal ). Att skriva ut dem snyggt får sedan bli steg två.

Jaså?
Men jag kan väl inte skriva primtalen själv i en array? Är inte tanken att räkna fram de?

Ursprungligen av Banaz:

Jaså?
Men jag kan väl inte skriva primtalen själv i en array? Är inte tanken att räkna fram de?

Se mitt inlägg (två upp).

--Tage

  • Medlem
  • Sundsvall
  • 2006-12-06 22:20

oki nu har jag läst i susning och wikipedia, algoritmen är lätt allt skriva för hand ja, men jag ahr ingen aning om hur det blir i kod.
Sedan om jag ska skriva alla de första 50 primtalen i en array, då kan jag väl bara skriva ut de, varför ska jag räkna fram de igen när jag har de i en array?

Ursprungligen av Banaz:

oki nu har jag läst i susning och wikipedia, algoritmen är lätt allt skriva för hand ja, men jag ahr ingen aning om hur det blir i kod.
Sedan om jag ska skriva alla de första 50 primtalen i en array, då kan jag väl bara skriva ut de, varför ska jag räkna fram de igen när jag har de i en array?

Nu missade du nån liten bit av det jag skrev, tror jag. Först skapar du en array med de 50 första heltalen (inte bara primtalen, det är ju dem du söker):

int primes[50];
for (int i = 0; i < 50; i++)
    primes[i] = i+1;

sedan går du igenom arrayen enligt instruktionerna på susning.nu med en ny for-loop. Ersätt alla jämna multipler av 2, 3, osv med 0. När det är klart har du en array som innehåller ett gäng nollor samt alla primtal under 50.

Att lära sig programmera är för övrigt att lära sig just precis det du tycker verkar besvärligt: att översätta från tanke till kod. Så du har slagit huvudet på spiken gällande vad det är som du behöver komma under fund med.

Är detta en skoluppgift, förresten?

--Tage

  • Medlem
  • Sundsvall
  • 2006-12-10 19:55

Ja, det är en skoluppgift. Har kollat på lösningsförslaget som finns i bokens webbplats till denna uppgift men är fortfarane osäker på om jag förstår hur han tar fram dessa tal..

int main()
{
const int ANTAL_PRIM = 50;
int prim_tab[ANTAL_PRIM];
bool primtal;
int antal=0, tal=1;

while (antal < ANTAL_PRIM)
{
tal++;
primtal=true;

for (int i=0; i< antal && primtal; i++) //
if (tal%prim_tab[i] == 0)
primtal=false;
if (primtal)
prim_tab[antal++] = tal;
}

for(int i=0; i<=9; i++)
{
for(int j=0; j<=4;j++)
cout<<setw(10)<<prim_tab[i*5+j];
cout<<endl;
}
return 0;
}

Ursprungligen av Banaz:

Ja, det är en skoluppgift. Har kollat på lösningsförslaget som finns i bokens webbplats till denna uppgift men är fortfarane osäker på om jag förstår hur han tar fram dessa tal..

int main()
{
  const int ANTAL_PRIM = 50; 
  int prim_tab[ANTAL_PRIM];  
  bool primtal;
  int antal=0, tal=1; 

  while (antal < ANTAL_PRIM) 
  {
    tal++; 
    primtal=true;
	
    for (int i=0; i< antal && primtal; i++) //
      if (tal%prim_tab[i] == 0)
        primtal=false;
    if (primtal)
      prim_tab[antal++] = tal;
  }
 

  for(int i=0; i<=9; i++)  
  {
   for(int j=0; j<=4;j++) 
	  cout<<setw(10)<<prim_tab[i*5+j]; 
   cout<<endl;
   }
return 0;
}

[co de] och [/co de] UTAN mellanslag i mitten.

För att förstå vad som händer kan du ta fram ett papper och skriva ut värdena på tal, i, antal, primtal, och prim_tab[i] på en rad. Gå sedan igenom while-loopen några gånger och fundera ut vad värdena blir efter varje gång. Skriv upp värdena på en ny rad för varje gång också. Till slut fattar du nog vad som händer.

--Tage

  • Medlem
  • Sundsvall
  • 2006-12-11 10:43

hmm tycker det är enklare att förstår algoritmen du tipsade om, Tage, men jag kan fortfarande inte översätta det till kod...
måste nog ha två for loopar till för att gå genom arrayen och en för att dela varje element i arrayen med..varför ska det vara så krångligt när det är så lätt?:(

  • Medlem
  • Sundsvall
  • 2006-12-11 10:56

int main()
{
const int ANTAL_PRIM = 229;
int prim_tab[ANTAL_PRIM];
int index=0;

Försöker så här, men blir inte rätt heller...kan någon hjälpa mig på traven?

for(int i=2; i<=ANTAL_PRIM; i++)
{
prim_tab[i]=i;
}

for(int i=0; i<=ANTAL_PRIM; i++){

for(int j=0; j<=ANTAL_PRIM; j++)

if(i%j == 0)
prim_tab[index]=0;

else
prim_tab[index++]=i ;

  • Medlem
  • Sundsvall
  • 2006-12-11 19:24

En lite bättre version, men problemet nu är att programmet skriver ut nollorna som jag ersatte de icke primtalen med...

int main()
{
const int ANTAL_PRIM = 229;
int prim_tab[ANTAL_PRIM+1];




for(int i=2; i<=ANTAL_PRIM; i++)
{
prim_tab[i]=i;
}

for(int i=2; i<=ANTAL_PRIM; i++)
{

for(int j=2; j<=ANTAL_PRIM; j++)


if(i!=j && j%i == 0)
prim_tab[j]=0;


}

//Utskrift av primtalen

for(int i=0; i<=9; i++)
{
for(int j=0; j<=4;j++)
cout<<setw(10)<<prim_tab[i*5+j];
cout<<endl;
}


return 0;
}

  • Medlem
  • Mölndal
  • 2006-12-11 19:34

Prova att för varje tal testa mot noll med en if-sats innan du skriver ut talet.

Ett annat tips är att använda "[co de] bla bla bla [/co de]" (utan mellanslagen) när man ska posta kod på forumet.

  • Medlem
  • Sundsvall
  • 2006-12-11 20:26

Ok det har jag okcså tänkt på, försökte med ett par vilkor men det blir inte rätt, antingen är vilkoren jag skapar är fel eller så skriver jag dem på fel ställe, som

[co de]
for(int i=0; i<=9; i++)
{
for(int j=0; j<=4;j++)
if(prim_tab !=0)

cout<<setw(10)<<prim_tab[i*5+j];
cout<<endl;
}

[/co de]

  • Medlem
  • Mölndal
  • 2006-12-11 23:36
Ursprungligen av Banaz:

Ok det har jag okcså tänkt på, försökte med ett par vilkor men det blir inte rätt, antingen är vilkoren jag skapar är fel eller så skriver jag dem på fel ställe, som

for(int i=0; i<=9; i++) 
 {
    for(int j=0; j<=4;j++) 
     if(prim_tab !=0)
     cout<<setw(10)<<prim_tab[i*5+j];
     cout<<endl;
}

Istället för " if(prim_tab !=0)" får du ha " if(prim_tab[i*5+j] !=0)" samt {}-parenteser för de följande två cout-raderna. Du vill ju testa varje enskilt tal, och inte hela arrayen.

  • Medlem
  • Sundsvall
  • 2006-12-11 20:28

oj så tråkig koden ser ut, har jag förstått ditt tips fel, skulle inte [co de][/co de] stå där de gör nu?

  • Medlem
  • Sundsvall
  • 2006-12-11 22:17

Precis, gjorde så och jag förstår det nu. Men jag vill nu göra om den algoritmen du tipsade om till kod så har jag något eget liksom och inte det förfarraten har skrivit.

  • Medlem
  • Sundsvall
  • 2006-12-12 07:42

Tack memark, men jag har testat det tidigare också, det blir fel, det enda som rättas till är att nollorna inte skrivs ut, men då får jag bara en anda kolumn.
Primtalen som skrivsut är bara från 2 till 47 vilket är fel, de som ska skrivas ut är de 50 första, alltså upp till 229.

Bevaka tråden