Toon posts:

[C] Fout in driehoek functie

Pagina: 1
Acties:
  • 42 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik heb de volgende functie om een soort driehoek te berekenen:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int TriangleCheck(int iA, int iB, int iC);
{
if(iA==iB&&iB==iC&&iA==iC){ 
                            printf("%d\t%d\t%d\t%s" , iA, iB, iC, naam1);
                            return 0;
                            }                  


if(iC!=iA==iB||iA!=iB==iC||iB!=iA==iC && (iC>=iA+iB)||(iA>=iB+iC)||(iB>=iA+iC)){
                                      printf("%d\t%d\t%d\t%s", iA, iB, iC, naam2);
                                      return 0;
                                      }
                           
                           
if(iA!=iB && iB!=iC && iA!=iC && (iC>=iA+iB)||(iA>=iB+iC)||(iB>=iA+iC)){ 
                             printf("%d\t%d\t%d\t%s", iA, iB, iC, naam3);
                             return 0;
                             }
                                      
                                      else{ 
                                          printf("%d\t%d\t%d\t%s" , iA, iB, iC, naam4);
                                          return 0;
                                          } 


iA, iB en iC zijn waardes die voor deze functie worden ingevoerd.
naam1 = EQUILATERAL (alle zijdes gelijk)
naam2 = ISOSCELES (2 zijdes gelijk)
naam3 = SCALENE (geen van de zijdes gelijk)
naam4 = NOTRIANGLE (als iA of iB of iC hoger is dan de andere 2 opgeteld)

Als ik de getallen 3, 3 en 2 invoer kom ik op NOTRIANGLE uit. Dit zou ISOSCELES moeten zijn. 1, 1, 2 komt dan wel weer op ISOSCELES uit.

Weet iemand wat ik fout doe in deze functie?

[ Voor 0% gewijzigd door RobIII op 29-03-2007 15:38 . Reden: Code tags toegevoegd omdat TS dit zelf niet wil doen... ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wil je even code tags gebruiken? Dat maakt het geheel wat leesbaarder ;)
Daarnaast is je topic nogal 'quickfixerig'. Zou je even (conform onze Programming Beleid Quickstart) kunnen aangeven wat je al hebt geprobeerd? Wat er niet werkte? Heb je uberhaupt al gedebugged?

[ Voor 57% gewijzigd door RobIII op 29-03-2007 13:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Marcj
  • Registratie: November 2000
  • Laatst online: 10:21
als je onder C dit doet 2 != 3 == 3, dan wordt dat geinterpreteerd als (2 != 3) == 3, oftewel TRUE == 3, oftwel FALSE (in C wordt TRUE meestal gedefinieerd als ~0, oftwel -1). Dit kan dus niet en zul je van moeten maken (2 != 3) && (3 == 3). Dan werkt het wel

Verwijderd

Topicstarter
Bedankt! Hij werkt nu zo te zien wel goed, weer wat nieuws geleerd.

  • Marcj
  • Registratie: November 2000
  • Laatst online: 10:21
Deze opdracht komt me heel bekent voor van de universiteit hier (was dacht ik het vak Testing Techniques) en ik kan je nu al vertellen dat er meer dingen zijn waarmee je geen rekening hebt gehouden, maar ik zal niet alles verklappen. Gewoon goed testen (vooral uitersten)! Want daar gaat het volgens mij om, of niet ;)

Verwijderd

Topicstarter
Het is voor software testing ja :) ben al meer fouten tegen gekomen en ik denk dat die in de berekening zitten of het een geldige driehoek is of niet.
Dus nog ff verder zoeken.

Verwijderd

Topicstarter
Ik kom in de functie niet meer op NOTRIANGLE.
Ik heb de berekening zelf nagerekend en daar klopt het wel maar toch word er toch alleen op het verschil van de getallen gesorteerd.
Iemand die daar de fout wel in ziet?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Bij deze: Debuggen: Hoe doe ik dat?; daar had ik je al op gewezen, maar de link had ik (klaarblijkelijk) nog niet geplaatst. Je bent daar trouwens in je vorige topic ook al op gewezen.

Zowieso is het voor een schoolopdracht wel handig als je een beetje weet waar het over gaat en dat je je eigen code debugged. Het is PRG niet de bedoeling dat we je aan het handje gaan houden.

[ Voor 31% gewijzigd door RobIII op 29-03-2007 15:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Ik weet waar het over gaat en debuggen heb ik ook gedaan maar toch kan ik het niet vinden. Waarschijnlijk is het een kleine fout die ik over het hoofd zie.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op donderdag 29 maart 2007 @ 15:55:
Ik weet waar het over gaat en debuggen heb ik ook gedaan maar toch kan ik het niet vinden.
Dan laat je resultaten van dat debuggen eens zien? Het is niet de bedoeling dat wij je code voor je gaan zitten debuggen (en al helemaal niet met 'huiswerk'); dat moet je zelf doen. Als je er met zorgvuldig debuggen niet uit komt ben je hier van harte welkom, maar ik geloof er niks van dat je structureel hebt gezocht naar het probleem.
Verwijderd schreef op donderdag 29 maart 2007 @ 15:55:
Waarschijnlijk is het een kleine fout die ik over het hoofd zie.
Als je niet in de laatste 'else' komt dan betekent dat dat je ALTIJD in 1 van de andere if-clauses terecht komt; daar zit je probleem dan lijkt me.

Het zou zowieso wel handig zijn als je je code fatsoenlijk indenteert.

[ Voor 3% gewijzigd door RobIII op 29-03-2007 16:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Ja daar zit het probleem dat zei ik in mijn vorige post al. In de berekening in 1 van de if structuren.
Debuggen heb ik door middel van steps door het programma en opgezocht of de operatoren goed zijn, en nog met de hand nagerekent hoe het zou moeten lopen.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op donderdag 29 maart 2007 @ 16:01:
Ja daar zit het probleem dat zei ik in mijn vorige post al. In de berekening in 1 van de if structuren.
Debuggen heb ik door middel van steps door het programma en opgezocht of de operatoren goed zijn, en nog met de hand nagerekent hoe het zou moeten lopen.
En als je die IF's dan eens 'uitkleedt'? Of de comparisons 1 voor 1 evalueert? Dan moet je op een gegeven moment zien waarom 1 van de comparisons naar True evalueert; anders kwam je die 'if' niet in.

Sowieso zou het helpen als je de waardes die je gebruikt om te testen post en de resultaten; maar again: ik wil je toch echt op het hart drukken dat dit prima zelf te debuggen moet zijn.

[ Voor 14% gewijzigd door RobIII op 29-03-2007 16:04 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Tja, RobIII & Marcj hebben helemaal gelijk. Schrijf die IF-statements eens helemaal uit en doe die sub-vergelijkingen ook eens in () wrappen, want volgens mij zie ik daar nog een foutje - ala Marcj's opmerking - in zitten ...

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Verwijderd

Topicstarter
De vergelijking: (iC>=(iA+iB)||(iA>=(iB+iC)||(iB>=(iA+iC)) had ik zo al in een aparte if gezet maar ik hield hetzelfde probleem.

  • Marcj
  • Registratie: November 2000
  • Laatst online: 10:21
Maar als je nu met een debugger een set getallen probeert dan kun je toch ook zien waar het misgaat en dan kun je toch ook wel beredeneren waarom dit mis gaat? Dat de code die boven staat helemaal bagger is, dat kunnen wij ook wel zien. Het is nu de bedoeling dat je zelf inziet waar het misgaat en waarom.

Ook een tip: lees dit eens door. Deze gaat misschien over java, maar klopt grotendeels ook wel voor C (iemand een linkje voor C?). Waarschijnlijk gaat het fout op een punt waar de voorrangregels van de operatoren net anders gaat dan jij zou verwachten...

  • Soultaker
  • Registratie: September 2000
  • Nu online
Volgens mij klopt het nu ook niet, want je rapporteert een driehoek als 1, 1, 10 als gelijkbenig, terwijl 'ie helemaal niet bestaat.

Ik zou beginnen met controleren of het ueberhaupt een geldige driehoek is. Dat is zo als de je a, b en c oplopend sorteert, en a > 0 && b > 0 && c > 0 && a + b <= c (makkelijk in te zien, lijkt me).

Daarna heb je drie mogelijkheden:
• gelijkzijdig (a == b && b == c)
• gelijkbenig (a == b)
• 'gewone' driehoek (a != b && b != c; gaat op als bovenstaande niet geldt).

[ Voor 16% gewijzigd door Soultaker op 29-03-2007 16:38 ]


  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Marcj schreef op donderdag 29 maart 2007 @ 16:27:
Ook een tip: lees dit eens door. Deze gaat misschien over java, maar klopt grotendeels ook wel voor C (iemand een linkje voor C?). Waarschijnlijk gaat het fout op een punt waar de voorrangregels van de operatoren net anders gaat dan jij zou verwachten...
http://www.google.nl/sear...&btnG=Google+zoeken&meta=

Linkjes genoeg. :)

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 01-12 16:07
Soultaker schreef op donderdag 29 maart 2007 @ 16:35:
Volgens mij klopt het nu ook niet, want je rapporteert een driehoek als 1, 1, 10 als gelijkbenig, terwijl 'ie helemaal niet bestaat.

Ik zou beginnen met controleren of het ueberhaupt een geldige driehoek is. Dat is zo als de je a, b en c oplopend sorteert, en a > 0 && b > 0 && c > 0 && a + b <= c (makkelijk in te zien, lijkt me).

Daarna heb je drie mogelijkheden:
• gelijkzijdig (a == b && b == c)
• gelijkbenig (a == b)
• 'gewone' driehoek (a != b && b != c; gaat op als bovenstaande niet geldt).
- je moet enkel testen of a > 0, want de andere zijn dan zowiezo groter dan nul
- a+b >= c bedoel je?
-gelijkbenig als (a==b) || (b == c)

[ Voor 5% gewijzigd door schoene op 29-03-2007 17:18 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op donderdag 29 maart 2007 @ 16:19:
De vergelijking: (iC>=(iA+iB)||(iA>=(iB+iC)||(iB>=(iA+iC)) had ik zo al in een aparte if gezet maar ik hield hetzelfde probleem.
Ja, sorry, maar nu ben ik dit topic aardig beu; je post niet de gegevens waar we je om vragen (je debug resultaten, welke getallen je mee test etc.) en je laat totaal geen eigen inzet zien.

Er zijn inmiddels voldoende tips en hints gegeven en daarmee moet je er prima kunnen komen als je zelf een beetje je best doet. En anders kun je natuurlijk altijd nog naar je docent stappen (die zijn daar voor én die wordt er voor betaald :P ).

Met telkens een 'korte opmerking' als post heb ik toch heel erg het idee dat je aan het handje gehouden wil worden, en dat gaan we hier écht niet doen. Sorry.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.