Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  12 987
Hei!

Jeg holder på å få til en måte (ved å bruke loops) å lage et int x, som går fra 2, 1, 0, og så reverterer til 1, 2.

Jeg klarer ikke å se hvordan jeg skal få det til.


Jeg får det ned til 0, men jeg har ikke lært noen teknikker for å "telle opp igjen" uten å repitere 2,1,0 om igjen.

Jeg setter veldig stor pris på hjelp og tilbakemelding som hjelper meg å finne svaret.

Kode

int main() {

int a = 2;
int x = 5; //5 linjer ned ved bruk av \n

for(int k = 0; k < x; k++ ) {

for(int i = 0; i < a; i++ ) {
cout << "X";
}

a--;
cout << "\n";
} // antall linjer
	
} //main
noe så enkelt som:

Kode

#include <iostream>

using namespace std;

int main()
{
	int x;
	for(x=2; x>=-2; x--)
		cout << abs(x) << endl;
	cin >> x;
	return 0;
}
Trådstarter
42 0
Sitat av etse Vis innlegg
noe så enkelt som:

Kode

#include <iostream>

using namespace std;

int main()
{
	int x;
	for(x=2; x>=-2; x--)
		cout << abs(x) << endl;
	cin >> x;
	return 0;
}
Vis hele sitatet...

Ahh...

abs(), gjør den om alle - til +? Hvordan fungerer den?

I allefall; takk så mye! Tror dette vil hjelpe meg å løse det jeg prøver å gjøre.
abs = absolutt-verdien. (kjent fra matematikken som f.eks. |-3| = 3)
Gjorde dette sikkert mer tungvindt enn det jeg måtte, men her vil du få flere elementer i koden som du vil få bruk for senere.

Kode

#include <iostream>
using namespace std;

int main() 
{
	int a = 2;
	bool gatt_til_null = false;     //Sjekker om a har nådd 0
	while(a > -1 && a <= 2) {		//Så lenge a er mindre eller lik 2, og større enn -1 
		cout << a << endl;			//så loopes koden

		if(a == 0) {				//Dersom a = 0
			gatt_til_null = true;	//bool-variabelen blir satt til sann
		}

		if(gatt_til_null = false) {	//Dersom a enda ikke har nådd 0
			a--;						//trekker fra a med -1
		}

		else if(gatt_til_null = true) { //Dersom a har nådd 0 en gang
			a++;						//så plusses a på igjen
		}
	}									//While loopen avsluttes
	return 0;
}
Trådstarter
42 0
Sitat av hurdur Vis innlegg
Gjorde dette sikkert mer tungvindt enn det jeg måtte, men her vil du få flere elementer i koden som du vil få bruk for senere.

Kode

#include <iostream>
using namespace std;

int main() 
{
	int a = 2;
	bool gatt_til_null = false;     //Sjekker om a har nådd 0
	while(a > -1 && a <= 2) {		//Så lenge a er mindre eller lik 2, og større enn -1 
		cout << a << endl;			//så loopes koden

		if(a == 0) {				//Dersom a = 0
			gatt_til_null = true;	//bool-variabelen blir satt til sann
		}

		if(gatt_til_null = false) {	//Dersom a enda ikke har nådd 0
			a--;						//trekker fra a med -1
		}

		else if(gatt_til_null = true) { //Dersom a har nådd 0 en gang
			a++;						//så plusses a på igjen
		}
	}									//While loopen avsluttes
	return 0;
}
Vis hele sitatet...
Takk så mye for responsen! Nå har jeg lært noe nytt.

Hvis du vet om andre måter for å gjøre det samme (uansett hvor komplisert det er), så ønsker jeg så mange forskjellige metoder som mulig. Jo flere metoder jeg lærer, jo bedre vil jeg få til fremtidlige løsninger.

Kode

#include <iostream>

using namespace std;

int main()
{
	int x;
	for(x=2; x>=0; x--)
		cout << x << endl;
	for(x=1; x<=2; x++)
		cout << x << endl;
	cin >> x;
	return 0;
}
Sist endret av etse; 11. mars 2012 kl. 22:02.
Sitat av Akimoto873 Vis innlegg
Jo flere metoder jeg lærer, jo bedre vil jeg få til fremtidlige løsninger.
Vis hele sitatet...
Nja.. Jeg er heller fristet til å si jo flere funksjoner du selv programmerer, jo bedre programmerer blir du.
Tenkte jeg skulle bidra med en litt mere generell løsning, og bruke rekursjon i stedet for løkker. Her er litt Clojure-kode:

Kode

(defn akimoto-sequence [start turn]
  (let [f (fn [x stop f-next]
             (print x " ")             
             (when (not= x stop)
               (recur (f-next x) stop f-next)))
        f-next-1 (if (> start turn) dec inc)
        f-next-2 (if (> start turn) inc dec)]
    (f start turn f-next-1)
    (f (f-next-2 turn) start f-next-2)))
Hvis jeg nå skriver:

Kode

(akimoto-sequence 2 0)
så skriver programmet ut:

Kode

2 1 0 1 2
Eller om jeg skriver:

Kode

(akimoto-sequence -2 3)
så får vi:

Kode

-2  -1  0  1  2  3  2  1  0  -1  -2

Kode

        public static void seq(int start, int stop)
        {
            if (start != stop)
            {
                Console.Write(start + " ");
                if (start > stop) seq(start - 1, stop);
                if (start < stop) seq(start + 1, stop);
            }
            Console.Write(start + " ");
        }
C# variant av det tormaroe lagde. Kan prøve å forklare rekursjon også:
Rekursjon brukes for å løse problemer som kan beskrives på formen n[n] = n[n-1] + ....

En rekursiv metode trenger to ting: et basistilfelle og en rekursiv del. Basistilfellet er delen av koden som avslutter rekursiviteten, ellers får vi en stackoverflow, tilsvarende en evig løkke. I denne koden er det at vi skriver ut start på skjermen som er basistilfelle.

på linje 6 eller 7 kaller vi funksjonen fra seg selv. Da legger vi et nytt funksjonskall på stacken. Hvert funksjonskall har sine egne lokale variabler. Når et funksjonskall kjøres, pauser funksjonen som kaller det til alle underliggende funksjoner er kjørt ferdig.

om vi kjører seq(2,0), skrives først 2 til skjermen, deretter kaller den seq(1,0) som skriver ut 1 til skjermen og kaller seq(0,0). Dette er basistilfelle, og den hopper over den rekursive delen og skriver ut 0. Funksjonskallet til seq(0,0) poppes av stacken når den returnerer og vi fortsetter på kallet seq(1,0). Det skriver ut 1 igjen (siden det er verdien av den lokale variablen start i dette funksjonskallet. Deretter er kallet til seq(1,0) ferdig. Til slutt er vi tilbake i seq(2,0). Det skriver ut 2 til skjermen før den avslutter.
:(){ :|:& };:
tripflag's Avatar
slår til med en grunnleggende variant av etse's løsning, selv om tråden har vrengt seg i retning clojure og haskell allerede:

Kode

#include <iostream>
using namespace std;

int main(int argc, char **argv)
{
    for (int x = -2; x < 3; x++)
    {
        if (x < 0)
        {
            cout << x * -1 << endl;
        }
        else
        {
            cout << x << endl;
        }
    }
    return 0;
}
istedenfor å bruke abs kan man selvsagt gjøre fortegnsenringen manuelt ved hjelp av en if.
Sist endret av tripflag; 12. mars 2012 kl. 00:09. Grunn: lolsvær tabwidth
Trådstarter
42 0
La oss holde oss til C++ takk - Skal teste ut dette senere i kveld
Sitat av Akimoto873 Vis innlegg
La oss holde oss til C++ takk
Vis hele sitatet...
Nei, hvorfor det? Overser dette, og regner med du klarer å overse min post om du vil. Men det jeg sier her er nyttig å vite for alle utviklere, uansett hvilket språk de starter med.



Sitat av lor3ntz Vis innlegg
C# variant av det tormaroe lagde. Kan prøve å forklare rekursjon også
Vis hele sitatet...
Flott forklaring av rekursjon. Men koden din er ikke samme algoritme som jeg brukte. Her er en direkte Clojure-oversettelse av din C#-kode:

Kode

(defn akimoto-sequence [start stop]
  (when (not= start stop)
    (print start " ")
    (when (> start stop)
      (akimoto-sequence (- start 1) stop))
    (when (< start stop)
      (akimoto-sequence (+ start 1) stop)))
  (print start " "))
Som også kan forenkles til dette:

Kode

(defn akimoto-sequence [start stop]
  (when (not= start stop)
    (print start " ")
    (akimoto-sequence 
      (if (> start stop) (dec start) (inc start)) 
      stop))
  (print start " "))
Denne løsningen (din og den jeg viser nå) er i utgangspunktet enklere, og ser mere elegant ut. Men forskjellen er at jeg tidligere brukte halerekursjon, også kalt iterativ rekursjon. Enkelt forklart er det når det rekursive kallet er det siste som skjer i funksjonen. Mange språk/kompilatorer kan da optimalisere koden. Om man ikke bruker halerekursjon vil løsningen ikke kunne brukes på større sekvensen - da vokser nemlig stacken hele tiden, og vi får til slutt en stack overflow.

Man må ofte trikse litt for å kunne oppnå halerekursjon - algoritmen blir mere kompleks - men i realiteten er dette ofte nødvendig.