Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Taas virheitä korjattavana

Sivun loppuun

Azure [14.01.2006 00:42:10]

#

Joo! Älkää välittäkö tämän ohjelman järkevyydestäm, koska haluan vain yhdistellä tässä vasta opittuja asioita yhdeksi paketiksi tämä ohjelma on vielä keksen eräinen joten ei sitäkään ihmetellä.

Mutta aiheeni koskee ohjelman virheitä ja sen pituutta(aika pitkä).

Eli koodi:

#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
 int a;
 char vastaus[20];

while (1)
  {
  cout << "-------------------------------------------------------------------------\n";
  cout << "Testi tyokalu ohjelma\n";
  cout << "....\n";
  cout << "Talla ohjelmalla naytan tahan asti opittuja asioita C++:sta\n";
  cout << "-------------------------------------------------------------------------\n\n";

  cout << "Valitse tasta:\n";
  cout << "    (1) Asetukset\n";
  cout << "    (2) Avaa tiedosto tai ohjelma\n";
  cout << "    (3) Kirjoita lokiin\n";
  cout << "    (4) Hae tiedostoja ja kansioita koneelta\n";
  cout << "    (5) Ohje\n";
  cout << "    (6) Sammuta ohjelma\n";

  if (a)
  {
  cin >> a;
  switch (a)
  {
 case 1:
 {
 system("CLS");

  cout << "-------------------------------------------------------------------------\n";
  cout << "Testi työkalu ohjelma\n";
  cout << "Asetukset.\n";
  cout << "Tervetuloa Asetuksiin, ole hyvä ja kirjoita haluamasi toiminto\n";
  cout << "--------------------------------------------------------------------------\n\n";

  cout << "Toiminto `help´ nayttaa kaikki komennot\n";
  cin >> vastaus;
  if (vastaus == "help")
  {
  cout << "Toimintoa `/help´ ei ole vielä luotu\n";
  system("PAUSE");
  system("CLS");
  continue;
  }

  else
  {

  system("PAUSE");

  cout << "Pahoittelemme toiminta hairiota, ohjelma on keskenerainen\n";

  system("PAUSE");
  system("CLS");
  continue;

  }
 {
 case 2:
 {
 cout << "Pahoittelemme toiminta hairiota, ohjelma on keskenerainen\n";
 continue;
 }

 {
  case 6:
 {
 return 0;
}
 {
 default:
 {
 system("CLS");
 continue;
 {
};


else
  {
  cout << "syntaxt error" << endl;
  system("pause");
  continue;
  }
}
}
}
}
}
}
}
}
};

Mitäs tässä pitäisi korjata, kun tarkoituksena on että kun käynnistää ohjelman, niin jos ei kirjoita kentään 1,2 tai 6, niin ohjelma vastaa että syntaxt error ja aloittaa alusta, koska muuten jos avaan ohejelman se tilttaa jos yritän laittaa jotain muuta noiden sijasta joten ajattelin viritellä näitä ehtorakenteita avuksi. Apua! Mikä vika?

Auttakaa korjaamaan ensin tuo minun tekemä koodi ja sen jälkeen vasta voitte lyhennellä koodia omin tavoin jos haluatte (onhan se hyvin pitkä, yksinkertaisuudessaan).


Itse neuvon itseäni aluksi, että toi system("CLS") voisi ehkä poistaa noista muista jutuista ja laittaa se vain kerran while:in eteen. =/

Touho [14.01.2006 01:03:25]

#

Merkkijonojen vertailuun on kaksi vaihtoehtoa: joko käyttää char taulukoita ja strcmp() funktiota vertailuun tai sitten käyttää string luokkaa, jossa vertailu tapahtuu tähän tyyliin: merkkijono == "teksti"

Itse laittaisin continue-käskyn paikalle break-käskyn. en nyt muista, mitä eroa noilla oli, koska en ole continuea pahemmin käyttänyt.

Jos kaikki sisennytket otettaisiin mukaan, koodi olisi paljon selkeämpi.

Azure [14.01.2006 01:08:33]

#

No joo, noi aaltosulku jutut, eli sisennykset on kyllä menny p*leen, ja string merkkijonoa käytin aluksi, mutta meni aika sekavaksi toi koodi. Funktioihin en ole vielä tutustunut opiskelun aikana, muuta kuin tuohon int main() -funktioon. =/

Sami [14.01.2006 01:33:57]

#

Kannattaa ainakin ihan ensin opetella käyttämään oikein tuota switch-lausetta. Muuten ohjelma saattaakin olla kohtalaisen hyvin kunnossa, mutta tuo switch-lause ei taida olla lähellekään syntaksin mukainen.

Alla on lyhyehkö esimerkki switch-lauseen toiminnasta, mikä siis tulostaa "1", jos annettu syöte on "1" (case 1:) ja vastaavasti 2:n ja 3:n kohdalla (case 2: ja case 3:). Muilla syötteillä (default:) ohjelma tulostaa "x".
Huomaa myös breakin käyttö jokaisen lohkon lopussa.

#include <iostream>
using namespace std;

int main()
{
	int a;
	cin >> a;

	switch(a) {
		case 1:
			cout << "1" << endl;
			break;

		case 2:
			cout << "2" << endl;
			break;

		case 3:
			cout << "3" << endl;
			break;

		default:
			cout << "x" << endl;
			break;
	}
}

TeeVee [14.01.2006 09:09:52]

#

Sisentele koodiasi huomattavasti enemmän. Esimerkissäsi ylhäällä on aaltosulkuja erittäin pitkä lista, hahmoitat ohjelmasi toiminnan paremmin sisentelemällä selkeästi. System(CLS) -komentojen käyttöä en tietenkään suosittele, koska ne eivät ole standardia. Samin esimerkistä voisit katsastaa switch-rakenteen. Et ole ilmeisesti paljoa opasta lueskellut samalla kun teit koodiasi :]

Baglair [14.01.2006 10:42:12]

#

Älä käytä myöskään system("PAUSE"). Ei toimi linuxillani.

Deewiant [14.01.2006 11:57:06]

#

Ties vaikka nämä sisennykset selventäisivät ongelmaasi.

#include <iostream>
#include <stdlib.h>
using namespace std;

int main() {
	int a;
	char vastaus[20];

	while (1) {
		cout << "-------------------------------------------------------------------------\n";
		cout << "Testi tyokalu ohjelma\n";
		cout << "....\n";
		cout << "Talla ohjelmalla naytan tahan asti opittuja asioita C++:sta\n";
		cout << "-------------------------------------------------------------------------\n\n";

		cout << "Valitse tasta:\n";
		cout << "    (1) Asetukset\n";
		cout << "    (2) Avaa tiedosto tai ohjelma\n";
		cout << "    (3) Kirjoita lokiin\n";
		cout << "    (4) Hae tiedostoja ja kansioita koneelta\n";
		cout << "    (5) Ohje\n";
		cout << "    (6) Sammuta ohjelma\n";
		if (a) {
			cin >> a;
			switch (a) {
				case 1:
				{
					system("CLS");

					cout << "-------------------------------------------------------------------------\n";
					cout << "Testi työkalu ohjelma\n";
					cout << "Asetukset.\n";
					cout << "Tervetuloa Asetuksiin, ole hyvä ja kirjoita haluamasi toiminto\n";
					cout << "--------------------------------------------------------------------------\n\n";

					cout << "Toiminto `help´ nayttaa kaikki komennot\n";
					cin >> vastaus;
					if (vastaus == "help") {
						cout << "Toimintoa `/help´ ei ole vielä luotu\n";
						system("PAUSE");
						system("CLS");
						continue;
					} else {
						system("PAUSE");

						cout << "Pahoittelemme toiminta hairiota, ohjelma on keskenerainen\n";

						system("PAUSE");
						system("CLS");
						continue;
					}
					{
						case 2:
						{
							cout << "Pahoittelemme toiminta hairiota, ohjelma on keskenerainen\n";
							continue;
						}

						{
							case 6:
							{
								return 0;
							}
							{
								default:
								{
									system("CLS");
									continue;
									{};


									else {
										cout << "syntaxt error" << endl;
										system("pause");
										continue;
									}
								}
							}
						}
					}
				}
			}
		}
	}
}

kooderi [14.01.2006 12:21:56]

#

Tuo if (a) -rivi kannattaa ottaa kokonaan pois. Tutkit ihan ekaksi a:n arvoa, joka tuolla hetkellä voi olla mitä vaan. Jos se sattuu olemaan nolla, ohjelma pyörii while-silmukassa tekemättä yhtään mitään.

if (vastaus == "help") ei toimi noin. On käytettävä muotoa
if (!strcmp(vastaus, "help")) tai sitten muutettava muuttuja 'vastaus' string -tyyppiseksi.

Virhemahdollisuuksiin kannattaa kiinnittää sen verran huomiota, että jos käyttäjä antaakin avstaukseen 21 merkkiä, ohjelma kaatuu siihen. Eli kannattaa käyttää rohkeasti reilunkokoisia taulukoita. esim. char vastaus[255];

Azure [14.01.2006 13:29:26]

#

Kääntäjä valittaa tuosta Dewiantin koodista, että

72::expected primary-expression before 'else'
72::expected ; before else

Eli rivillä 72, tuossa viimeisessä else: ehtolasueen päässä on virhe ja että sitä ennen on laitettava tuo ; , mutta sen jälkeenhän on jo laitettu nuo lopetus >> ; << merkit?

TeeVee [14.01.2006 13:50:54]

#

Annan switch-rakenteesta esimerkin. Kokeile rakentaa ohjelmasi alusta asti ja sitten tule kyselemään uuden pätkäsi kanssa vihjeitä, uskon että tällä kertaa onnistut :]

#include <iostream>

using std::cin;
using std::cout;
using std::endl;


int main(int argv, char *argc[])
{
	char valinta;
	cout << "Tervetuloa TeeVee:n pariin!" << endl;
	cout << "Onko ohjelma (h)ieno vai (p)aska?" << endl;
	cin >> valinta;
	switch(valinta)
	{
		case 'h':
			cout << endl << "Sepä mukava kuulla xD";
			break;
		case 'p':
			cout << endl << "Harmin paikka, otan osaa";
		default:
			cout << "Suosittelen lukemaan ohjeet!";
	}

	return 0;
}

Komentoriviltä käynnistät. Huomasin juuri, ettei Code::Blocks tykännyt, että laitoin switch:n tutkittavaksi kohteeksi stringin. Pitäisikö tämän onnistua? Olisin muuten ottanut syötteen getline():n avulla :(

EDIT: Ohjelmoi sitä ohjelmaasi vaiheittain, älä ahmi liikaa. Kääntele paljon ja usein sitä ja tarkkaile mahdollisten virheiden määrää. http://www.nic.funet.fi/c opas/ Täällä on hieno ohje vähän muuhunkin kuin switch-rakenteeseen, "Google will be with you".
EDIT EDIT: Kun kysellään charia, täytyy olla '-merkit, mutta kun kysellään kokonaislukua niin ei kuulu olla. Ajattelin vielä varmistaa.

Heikki [14.01.2006 14:21:39]

#

TeeVee kirjoitti:

Komentoriviltä käynnistät. Huomasin juuri, ettei Code::Blocks tykännyt, että laitoin switch:n tutkittavaksi kohteeksi stringin. Pitäisikö tämän onnistua? Olisin muuten ottanut syötteen getline():n avulla :(

Ei pidä (tai ei ainakaan toimi gcc:llä).

Metabolix [14.01.2006 16:30:24]

#

Mutta onneksi on olemassa if-lause, jolloin string-vertailukin onnistuu.

TeeVee [14.01.2006 16:37:24]

#

Metabolix kirjoitti:

Mutta onneksi on olemassa if-lause, jolloin string-vertailukin onnistuu.

Heh, tämän kyllä tiesinkin :). Kysyinkin tässä aikaisemmin tuon getline()-funktion (string-luokan) käytöstä. Nykyisin osaan sitä käyttääkin, ja hoksasin jopa että sen käyttö cin-virran kanssa on erittäin kätevää. Miten muuten putkan hakemiston kanssa on, stringeistähän voisi kirjoitella sinne juttua (itsekin voisin kirjoittaa jotain pientä, mitä osaan), vai onko hakemisto kuollut jo (www.ohjelmointiputka.net/hak)?

Metabolix [14.01.2006 16:45:39]

#

No ei sitä ole vähään aikaan päivitetty. Ja näyttäisi olevan siinä määrin kuollut, että muokkaussivun PHP-skripti valittelee yhden funktion puuttumisesta ^^. Toivottavasti hakemisto tulee hieman paremmin esille (vaikka opassivulle omaksi osiokseen eri kielten pääsivut), kun nämä Putkan kuuluisat uudistukset alkavat valmistua.

Deewiant [14.01.2006 21:44:15]

#

Azure kirjoitti:

Kääntäjä valittaa tuosta Dewiantin koodista, että

72::expected primary-expression before 'else'
72::expected ; before else

Eli rivillä 72, tuossa viimeisessä else: ehtolasueen päässä on virhe ja että sitä ennen on laitettava tuo ; , mutta sen jälkeenhän on jo laitettu nuo lopetus >> ; << merkit?

Tottakai se valittaa siitä koodista, se on vain alkuperäinen koodisi, johon on lisätty selkeämmät sisennykset. Pointtina oli, että näkisit ehkä paremmin, missä vika piilee. Samat virheet kääntäjä antaa itsepostaamastasi koodista.

Huomannet esimerkiksi sen, että tuo else on ilman vastaavaa if-lausetta, minkä takia kääntäjä siitä valittaa.

nakkisormi [15.01.2006 02:16:56]

#

Ja kun et ole asettanut muuttujan A arvoksi mitään, se voi olla täysin sattumanvarainen luku. Alusta se vaikka tähän malliin:

Int a = 0;

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta