Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Hassunhauscka ohjelmointikilpa (C:llä)

ville-v [06.05.2007 17:37:11]

#

Alla olevalle ohjelmalle on määritelty kolmen luvun ASCII-koodit. Ohjelma laskee luvut yhteen ja näyttää tuloksen. Ohjelmassa on kuitenkin virhe.

Löydä tuo virhe ja olet voittaja. Muiden virheiden löytämisestä saa bonusta.

#include <stdio.h>
#include <stdlib.h>

#define oO 52
#define Oo 50
#define OO 49

int main(void){
	char O00[6],O0O[3],OOO[3],o0;char OO0=0;
	O0O[OO0]=oO;O00[OO0]=80;
	OOO[OO0]=O0O[OO0++]-47;O0O[OO0]=Oo;
	OOO[OO0]=O0O[OO0]-47;O00[OO0++]=O00[OO0-1]-15;
	O0O[OO0]=OO;O00[OO0++]=O00[OO0-2]+5;
	OOO[--OO0]=O0O[OO0++]-47;O00[OO0++]=O00[OO0-1]-2;
	o0=OOO[OO0-3]+OOO[OO0-2];O00[OO0++]=O00[OO0-3]+4;
	o0+=OOO[OO0-4];O00[OO0--]=0;printf("%%\t%d\t%%\n",o0);system(O00);
	return O00[++OO0];
}

Ohjelma kääntyy ainakin Dev-C++:lla ja toimii oikealla tavalla väärin ainakin Windowsilla.

Pitäkää hauskaa :D

Schedler [12.05.2007 02:55:49]

#

Löytyyhän tuosta virheiden lisäksi myös määrittelemättömiä kohtia. Esim. C-standardi ei ota mitään kantaa sijoitukseen OOO[--OO0]=O0O[OO0++]-47, jolloin tulos on riippuvainen kääntäjästä. Kääntäjäriippuvaista on siis se, miten muuttujan OO0 arvo käyttäytyy koska siihen kosketaan kahteen otteeseen saman sequence pointin aikana.

Asiaan: Ongelma koodissasi on se, että yrität laskea yhteen 2+3+5, mutta oikeasti lasketkin 2+3+3. Muuta kohta o0+=OOO[OO0-4] muotoon o0+=OOO[OO0-5] niin saat oikean tuloksen. Teit koodissasi siis C-kielelle tyypillisen off-by-one indeksointivirheen :)

Mikä oli palkinto?

tesmu [12.05.2007 10:30:02]

#

Ei tässä mitään palkintoa ollut! Tää oli selkeesti joku koulutehtävä, johon ville-v haki ovealla tavalla valmiin vastauksen. :)

Metabolix [12.05.2007 14:00:39]

#

Yksi virhe ainakin näyttää ajettuna tältä:
sh: PAUSE: not found
Lisäksi tosiaan tuo indeksointi on aika kyseenalaista. Käännettynä -Wall-lipulla tuosta saa kuusi varoitusta noista indeksin muutteluista sekä paljon varoituksia siitä, että indeksi on char eikä int. Lisäksi mikään ei taida C:n puolesta taata, että char-tyyppisen otuksen printtaus kokonaislukuna onnistuisi. Periaatteessa se voisi funktiolle välittyä tavun kokoisena, mutta funktio yrittäisi kuitenkin hakea neljän tavun (tai mikä arkkitehtuurin int onkaan) kokoista arvoa.

Kaikkiaan tuo oli aivan järjettömän helppo tehtävä, kun sen saattoi helposti "ajaa" ihan käsin.

Vastaus

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

Tietoa sivustosta