Fozzy Δημοσ. 13 Ιουνίου 2002 Δημοσ. 13 Ιουνίου 2002 loipon... Egrapsa to ekshs programmataki (aplo me ta sxoliakia tou klp) H douleia pou kanei einai aplh.. diavasei enan-enan xarakthres tous topothetei se enan pinaka kai sto telos emfanizei posoi htan grammata,arithmoi kai kena (mono to plithos tous. To programma trexei kanonika mono pou otan dexetai enter (kritirio diakophs ths while) den stamataei!! apla kanei line feed kai synexizei mporontas na plhktrologiseis k allous xarakthres... Idou to programma... pls help </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">#include <stdio.h> #include <string.h> #include <conio.h> //periexei thn getch(); int main() { int numero,keno,gramma,k=0; char i=0, string[30]; printf ("Dwse ena string xarakthrwn kai ENTER sto telos: "); while (string[k]!=13) //to 13 einai :ascii timh tou ENTER { string[k] = getch(); //oso o xarakthras den einai 13 o pinakas string[k] gemizei for (i=48;i<=57;i++) //epanalhptikh domh gia na doume an o xarakthras einai arithmos //(se ascii 48 ews 57 isodynamei me 0 ews 9) {if (string[k]==i) {numero=numero+1;}} // an o xarakthras einai arithmos tote //o metrhths counter afksanetai kata 1 if (string[k]==20) {keno=keno+1;} //an o xarakthras einai keno (ascii kwdikas kenou=20) //tote o metrhths kseno afksanetai kata ena k++; //to k afksanetai kata 1 gia na dextei ton epomeno xarakthra o pinakas string[k] } gramma=k-numero-keno; //h metavlhth gramma dexnei posa grammata exei to string synolika //dhldh k-numero-keno = synolikoi_xarakhres-arithmitikoi-kena printf ("\nPlithos gramamtwn: %d\n",gramma); //ektypwnei to mhnyma kai to plithos gramamtwn printf ("Plithos kenwn: %d\n",keno); //ektypwnei to mhnyma kai to plithos kenwn printf ("Plithos arithmwn: %d\n",numero); //ektypwnei to mhnyma kai to plithos arithmwn system ("pause"); return 0; }[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">
Επισκέπτης Δημοσ. 13 Ιουνίου 2002 Δημοσ. 13 Ιουνίου 2002 Το λαθος στο proggy πρεπει να ειναι στην γραμμη... int numero,keno,gramma,k=0; δηλωνεις μεταβλητες τυπου integer με ονοματα numero,keno,gramma μεχρι εδω καλα,αλλα μετα μου τα χαλας λιγακι.Η μεταβλητη k δεν μπορει να παρει τιμη στην γραμμη αυτη. Δηλαδη δοκιμασε int numero,keno,gramma,k και οτι το k εχει αρχικα την τιμη 0 πρεπει να το βαλεις πριν το while.Να υπαρχει δηλαδη μια γραμμη πριν το while -> k=0; Ελπιζω να ειναι η απαντηση στο προβλημα σου.
Fozzy Δημοσ. 13 Ιουνίου 2002 Μέλος Δημοσ. 13 Ιουνίου 2002 Mpa.... Dokimasa k afto, kai to i=0 na ta allaksw.. alla pali ta idia.. tp provlhma paramenei... isws yparxei kapioo lathos sthn library? den kserw ti na pw.... Etsi pantos k den yphrxe h library tha xtipouse o compiler logika e? Peite kamia idea gia to ti ftaiei
GothicCrusader Δημοσ. 13 Ιουνίου 2002 Δημοσ. 13 Ιουνίου 2002 Πάντως, πρώτο που βλέπω εγώ ότι πρέπει να αποφεύγεις είναι το ότι την πρώτη φορά που εκτελείται το while ελέγχεις μια τιμή που δεν έχει τεθεί αναγκαστικά σε 0 αφού αυτό εξαρτάται από τον compiler σου. Πρόσεχέ το πολύ αυτό γιατί οδηγεί σε πολύ περίεργες καταστάσεις.. π.χ. στο πρόγραμμά σου </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;"> while (string[0]!=13), [/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">ενώ το string[0] ανάλογα με τον compiler μπορεί να μην έχει τιμή 0 για χίλιους δύο λόγους... Επίσης έχεις λόγο που σώνεις τα δεδομένα σε string? Αν ναι (δηλαδή σκοπεύεις θεωρητικά να την χρησιμοποιήσεις στο ίδιο πρόγραμμα) πρόσεξε ότι δεν την κάνεις terminate στο τέλος. Αυτό θα σου δημιουργήσει προβλήματα, είναι πολύ συνηθισμένο λάθος και θέλει πολύ προσοχή. Καλύτερα να τα συνηθίζεις στην αρχή για να μην σε κυνηγάνε στο τέλος. Πάμε τώρα στην ουσία. Το while ελέγχει αρχικά την string[0]. Θεωρούμε ότι έχεις καινούργιο σχετικά compiler οπότε έχει γίνει initialised η string σου, με τίμη 0 στο πρώτο στοιχείο. Οπότε 0!=13 και εκτελείται πρώτη φορά ο βρόχος. Κοίταξε μία μία τις γραμμές. Παίρνεις τον χαρακτήρα με την getch() και ελέγχεις την τιμή της, πολύ ωραία. Μία γραμμή πριν το τέλος του βρόχου, αυξάνεις την τιμή του κ κατά 1!!! Σωστό..αλλά.... Η νέα επαλήθευση της while ελέγχει την string[k+1] δηλ. string[1] ενώ η τελευταία τιμή που έχει πληκτρολογηθεί είναι αποθηκευμένη στην string[0].. Οπότε οι βρόχοι δεν τελειώνουν ποτέ γιατί κάθε φορά ελέγχεις την τιμή του πίνακα, ένα στοιχείο πιο μετά από αυτό που έχεις αποθηκεύσει. εγώ τώρα θα το έκανα έτσι: </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">... ... int letter=0; while ((letter = getch()) != '\r' && k <30) { string[k] = letter; for (i=48;i<57;i++) if (string[k]==i) numero=numero+1; if (string[k]==20) keno=keno+1; k++; } string[k]=NULL;[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Θεωρώντας ότι το "for" θες να το χρησιμοποιήσεις για εγκυκλοπεδικούς λόγους. Αν δεν το θες, υπάρχουν πολύ καλύτεροι τρόποι να βρεις αν το string[k] είναι νούμερο χώρις να εκτελέσεις τόσους βρόχους που υποτίθεται ότι πρέπει να τους αποφεύγουμε. (φαντάσου ότι για κάθε χαρακτήρα εκτελείς 10 φορές το if!).
Fozzy Δημοσ. 13 Ιουνίου 2002 Μέλος Δημοσ. 13 Ιουνίου 2002 Logika opos les... to parakatw tha douleve kanonika e???? Alla den doulevei... </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">int main() { int numero,keno,gramma,k; char i, string; printf ("Dwse ena string xarakthrwn kai ENTER sto telos: "); k=0; i=0; while (string!=13) //to 13 einai h ascii timh tou ENTER { string= getch(); //oso o xarakthras den einai 13 to string edxetai thn timh tou xarakthra for (i=48;i<=57;i++) //epanalhptikh domh gia na doume an o xarakthras einai arithmos //(se ascii 48 ews 57 isodynamei me 0 ews 9) {if (string==i) {numero=numero+1;}} // an o xarakthras einai arithmos tote //o metrhths counter afksanetai kata 1 if (string==20) {keno=keno+1;} //an o xarakthras einai keno (ascii kwdikas kenou=20) //tote o metrhths kseno afksanetai kata ena k++; //to k afksanetai kata 1 giati apothikevei to plithos olwn twn xarakthrwn } gramma=k-numero-keno; //h metavlhth gramma dexnei posa grammata exei to string synolika //dhldh k-numero-keno = synolikoi_xarakhres-arithmitikoi-kena printf ("\nPlithos gramamtwn: %d\n",gramma); //ektypwnei to mhnyma kai to plithos gramamtwn printf ("Plithos kenwn: %d\n",keno); //ektypwnei to mhnyma kai to plithos kenwn printf ("Plithos arithmwn: %d\n",numero); //ektypwnei to mhnyma kai to plithos arithmwn system ("pause"); return 0; }[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">
Fozzy Δημοσ. 13 Ιουνίου 2002 Μέλος Δημοσ. 13 Ιουνίου 2002 Afto pou ypopsiazomai einai oti kati paizei me thn getch() giati afth dhmiourgei to provlhma... se ena site gia newbies sth C vrhka thn getch() me to ekshs aplo paradeigma </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">#include <CONIO.H> main() { char key = 0; while (key != 13) key = getch(); } [/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">to dokimasa kai xtypaei o compiler sthn printf legontas "implicit declaration printf" ti paizei re paidia...giati eimai kainourgios sth C
GothicCrusader Δημοσ. 13 Ιουνίου 2002 Δημοσ. 13 Ιουνίου 2002 Δοκίμασε να δηλώσεις το string σαν ακέραιο και όχι σαν χαρακτήρα. Κοίτα εμένα μου δούλεψε το πρόγραμμα σου με τις αλλαγές όπως φαίνεται παρακάτω: </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">#include <stdio.h> #include <string.h> #include <conio.h> void main() { int numero,keno,gramma,k=0; char i=0, string[30]; printf ("Dwse ena string xarakthrwn kai ENTER sto telos: "); string[k] = getch(); // <- Edw prosexe while (string[k]!=13) // <- o elegxos afou exei tethei timi stin string[k] { for (i=48;i<=57;i++) { if (string[k]==i) {numero=numero+1;}} if (string[k]==20) {keno=keno+1;} string[++k] = getch(); // <- kai pali edw } gramma=k-numero-keno; printf ("\nPlithos gramamtwn: %d\n",gramma); printf ("Plithos kenwn: %d\n",keno); printf ("Plithos arithmwn: %d\n",numero); }[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Τώρα κοίτα, για τον άλλο κώδικα που έγραψες. Αρχίκα, πες ποιον compiler έχεις, και τι λάθη σου βγάζει ακριβώς. Δεν έκανα πολλές αλλαγές (μόνο οπτικό συμμάζεμα), το δοκίμασα και λειτουργεί: </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">#include <stdio.h> #include <string.h> #include <conio.h> int main() { int numero, keno, gramma; int k=0, i=0; char string=0; printf ("Dwse ena string xarakthrwn kai ENTER sto telos: "); while ( string != 13 ) { string=getch(); for (i=48;i<=57;i++) { if (string == i) { numero++; } } if (string == 20) { keno++; } k++; } gramma=(k - numero - keno); printf ("\nPlithos gramamtwn: %d \n", gramma); printf ("Plithos kenwn: %d\n",keno); printf ("Plithos arithmwn: %d\n",numero); return (0); } [/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Δεν μου χτυπάει κανένα λάθος. Τώρα, επειδή γράφουμε κώδικα προσεχέ πάρα πολύ τα λάθη, για να μην κυνηγάμε φαντάσματα. Στον τελευταίο κώδικα που γράφεις, έχεις βάλει ένα παραπάνω κλείσιμο αγκύλης: </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;"> {if (string[k]==i) {numero=numero+1;}}[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">οπότε σου χτυπάει στις επόμενες printf. πάντα μα πάντα να γράφεις ΚΑΘΑΡΑ <img border="0" title="" alt="[Roll Eyes]" src="images/icons/rolleyes.gif" /> Ανέβασα τα ΤΧΤ ακριβώς όπως έγιναν σωστά compiled σε εμένα. Αν θες κατέβασέ τα: here <small>[ 13-06-2002, 02:11: Το μήνυμα επεξεργάστηκε από: GothicCrusader ]</small>
Billman Δημοσ. 13 Ιουνίου 2002 Δημοσ. 13 Ιουνίου 2002 </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">#include <stdio.h> #include <string.h> #include <conio.h> int main() { int numero = 0, keno = 0, gramma = 0, others = 0; char c; printf ("Dwse ena string xarakthrwn kai ENTER sto telos: "); c = getch(); while (c != 13) { putch ©; // Emfanizoume ayto pou pathse o xrhsths // Elegxoume gia to an einai gramma if ((c >= 'a' && c <= 'z') <<OR>> (c >= 'A' && c <= 'Z')) ++gramma; else if (c >= '0' && c <= '0') // An einai ari8mos ++numero; else if (c == 20) // An einai kenos xarakthras ++keno; else // An den einai tpt apo ta parapanw ++others; c = getch(); } printf ("\nPlithos gramamtwn: %d\n",gramma); printf ("Plithos kenwn: %d\n",keno); printf ("Plithos arithmwn: %d\n",numero); printf ("Plithos ypoloipwn xarakthrwn: %d\n", others); return 0; }[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Sto shmeio pou exw balei to <<OR>> bale thn or me ta dyo ka8eta. Gia na doume ligo tis allages sto programma: a) to programma en xrhsimopoiei pinaka xarakthrwn, alla apla enan xarakthra, ayton pou diabazoume ka8e fora thn for mesa sthn while thn exoume bgalei mias kai o elegxos gia to an einai ari8mos mporei na ginei kai me mia if c) twra elegxei gia grammata, ari8mous, kena kai loipous xarakthres Elpizw na boh8hsei <img border="0" title="" alt="[smile]" src="images/icons/smile.gif" /> <small>[ 13-06-2002, 04:42: Το μήνυμα επεξεργάστηκε από: Billman ]</small>
Fozzy Δημοσ. 13 Ιουνίου 2002 Μέλος Δημοσ. 13 Ιουνίου 2002 Paides DEN PAIZEI!!!! Gia na eimai eilikrinhs dokimasa th lysh tou GothiCrusader h opoia eixe tis ligoteres metatropes ston kwdika (vasika eimai newbie k etsi k paw tou kathighth tetoio kwdika tha me rotisei "ti einai afta?Ta exoume pei?" opote den to riskarw <img border="0" title="" alt="[smile]" src="images/icons/smile.gif" /> ) Ektos aftou opos vlepete k apo to post kontevei 4 to prwi... kai akoma to palevw opote den eimai gia polla Ypopsiazomai oti kati prepei na paizei me ton compiler...afou logika den tha katalavainei oti h times gia tis opoies thelw na ginontai kapoia pragmata einai ASCII(13 gia enter 48-57 gia numbers kai 20 gia keno) Dokimasa na dwsw tis times aftes mesa se aftakia px while string!='13' alla pali tipota... Gia poia ekdosh comiler exo thn Bloodshed C Version 4 me ton Mingw compiler 2.95.2-1 MSVCRT kai Cygnus Inside Debugger... parapanw den kserw... ap'oti vlepete copy paste ta ekana apo to "About"... kai kati asxeto Me pia entolh katharizei h othonh???
Billman Δημοσ. 13 Ιουνίου 2002 Δημοσ. 13 Ιουνίου 2002 Gia na ka8ariseis thn o8onh xrhsimopoieis thn clrscr() Oso gia to problhma pou sou kanei o compiler m akougetai ligo periergo... mporeis na postareis to mhnyma la8ous pou sou bgazei? An den pianei to != 13 dokimase != '\n' h != '\r' (den 8ymamai pio apo ta dyo doulevei gia to enter) Dokimase epishs na kaneis to e3hs: while (string[ k ] != (char)(13)) <- type-casting tou les oti 8es na xrhsimopoihsei ton xarakthra 13 tou pinaka ascii <small>[ 13-06-2002, 04:43: Το μήνυμα επεξεργάστηκε από: Billman ]</small>
Directx Δημοσ. 13 Ιουνίου 2002 Δημοσ. 13 Ιουνίου 2002 Λοιπόν μπορείς να κάνεις τα εξής: </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">#include <stdio.h> #include <string.h> #include <conio.h> //periexei thn getch(); int main() { int numero=0,keno=0,gramma=0,k=0; char i=0, string[30]; printf ("Dwse ena string xarakthrwn kai ENTER sto telos: "); while (string[k-1]!=13) //to 13 einai :ascii timh tou ENTER { string[k] = getch(); //oso o xarakthras den einai 13 o pinakas string[k] gemizei for (i=48;i<=57;i++) //epanalhptikh domh gia na doume an o xarakthras einai arithmos //(se ascii 48 ews 57 isodynamei me 0 ews 9) { if (string[k]==i) {numero=numero+1;} } // an o xarakthras einai arithmos tote //o metrhths counter afksanetai kata 1 if (string[k]==' ') {keno=keno+1;} //an o xarakthras einai keno (ascii kwdikas kenou=20) //tote o metrhths kseno afksanetai kata ena putchar(string[k]); k++; //to k afksanetai kata 1 gia na dextei ton epomeno xarakthra o pinakas string[k] } gramma=k-numero-keno-1; //h metavlhth gramma dexnei posa grammata exei to string synolika // -1 gia to Enter (13) //dhldh k-numero-keno = synolikoi_xarakhres-arithmitikoi-kena printf ("\nPlithos gramamtwn: %d\n",gramma); //ektypwnei to mhnyma kai to plithos gramamtwn printf ("Plithos kenwn: %d\n",keno); //ektypwnei to mhnyma kai to plithos kenwn printf ("Plithos arithmwn: %d\n",numero); //ektypwnei to mhnyma kai to plithos arithmwn system ("pause"); return 0; }[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">1ον)[while (string[k-1]!=13)] Ελέγχουμε τον πίνακα ως k-1 μιας και στο τέλος κάνεις k++ άρα k=1 όμως ο χαρακτήρας αποθηκεύεται εξαρχής μια θέση πιο πίσω πχ. K=0, άρα αν κ=1 για τον επόμενο χαρακτήρα πρέπει να κάνουμε k-1 για να βρούμε τον τελευταίο.. Βέβαια αν εξαρχής k=0 άρα k-1=-1 (!) εντούτοις δεν φαίνεται να επηρεάζει την εκτέλεση (μια μικρή ανοχή της C) αν και κάνουμε κάτι πολύ κακό (είπαμε δεν θέλω να διαβρώσω το λογισμικό σου με νέα δεδομένα [απλός keep it in mind] αν σε ρωτήσει το πάρει «χαμπάρι» κανείς σου ). 2ον) Για έλεγχο του space προτιμούμε την άμεση εισαγωγή του (δεν δούλευε διαφορετικά στον DOS MS-C 6.0 compiler μου). 3ον) [gramma=k-numero-keno-1;] Στο τέλος υπολογίζουμε το gramma με 1 για να μην προσμετράτε σε αυτό ο χαρακτήρας Enter. 4ον) [numero=0,keno=0,gramma=0,k=0;] Μηδενίζουμε εξ αρχής της μεταβλητές μας γιατί διαφορετικά έχουν «σκουπίδια» (τυχαίες τιμές) που καταστρέφουν τους υπολογισμούς μας. 5ον) putchar(x) για να βλέπουμε τι γράφουμε.. Σε εμένα τα παραπάνω δουλεύουν σωστά, δεν θέλησα τέλος να επιφέρω δραματικές αλλαγές στον κώδικα σου σεβόμενος την επιθυμία που εξέφρασες. * Το παράδειγμα δούλεψε τόσο σε MS-C 6.00 for DOS όσο και σε Borland C++ 4.5 Καλή τύχη. <small>[ 13-06-2002, 08:20: Το μήνυμα επεξεργάστηκε από: Directx ]</small>
GothicCrusader Δημοσ. 13 Ιουνίου 2002 Δημοσ. 13 Ιουνίου 2002 Fozzy, αν μπορείς κατέβασε το αρχείο και προσπάθησε να τα κάνεις compile ακριβώς όπως είναι για να είμαστε σίγουροι ότι δεν είναι θέμα του compiler ή θέμα αντιγραφής. Είναι νομίζω ο πιο απλός τρόπος μιας και οι νέοι είναι επιρρεπής σε πολλά λάθάκια στην αρχή <img border="0" title="" alt="[Frown]" src="images/icons/frown.gif" /> Αν σου βγάλουν λάθη από την άλλη τότε αμέσως καταλαβαίνουμε ότι φταίει ο compiler. Το πιο βασικό τώρα, γράψε τι λάθη σου βγάζει. Αν δεν ξέρουμε αυτά, δεν μπορούμε να κάνουμε παρά μόνο εικασίες <img border="0" title="" alt="[Roll Eyes]" src="images/icons/rolleyes.gif" /> Επίσης καλό είναι να αποφεύγεις τους κώδικες ascii όταν υπάρχουν ετοίμες μακροεντολές που κάνουν την ίδια δουλεία. Συχνά μπερδευόμαστε και μετά απλά λάθη γίνονται πονοκέφαλοι...Το 20 π.χ. δεν θα σου δώσει σωστά αποτελέσματα γιατί δεν μετράει spaces. Πρέπει είτε να το κάνεις δεκαεξαδικό είτε να χρησιμοποιήσεις το 32. Τελός πάντων το θέμα είναι γιατί δεν σου κάνει καν compile... <small>[ 13-06-2002, 13:51: Το μήνυμα επεξεργάστηκε από: GothicCrusader ]</small>
Fozzy Δημοσ. 14 Ιουνίου 2002 Μέλος Δημοσ. 14 Ιουνίου 2002 File Directx kai ypoloipoi thanx.. alla me ton kwdika sou Directx xtypaei o compiler implicit declaration of function `int system(...)' ...ti mporei na ftaiei re paidia? o G#@$%@# o compiler isws?
Billman Δημοσ. 14 Ιουνίου 2002 Δημοσ. 14 Ιουνίου 2002 File Fozzy, kane #include <stdlib.h> sthn arxh tou programmatos kai 8a ftia3ei.
DaRK_InST Δημοσ. 14 Ιουνίου 2002 Δημοσ. 14 Ιουνίου 2002 Ama akoma den douleuei me auta pou sou eipan ta paidia, tha sou pw kai egw thn gmwmh mou, otan 'while pin[k]!=13' koitazei na dei ean periexete o arithmos 13 mesa ston pinaka sthn thesh k alla den yparxei dioth exei apothikeutei o xarakthras 13 (Yparxei diafora) afou o pinakas einai Char . Ara einai lathos giati otan patas to enter apothikeuete o xarakthras 13 anti gia ton arithmo opws les sthn sunthikh while . Gia dokimase na baleis while pin[k]!="13" <small>[ 14-06-2002, 02:53: Το μήνυμα επεξεργάστηκε από: DaRK_InST ]</small>
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.