Προς το περιεχόμενο

σκουπιδακια και μη λειτουργια while στη c


jordaninio

Προτεινόμενες αναρτήσεις

παιδια εχω κανει το παρακατω προγραμματακι για μια ασκηση που εχω..το θεμα που προκυπτει είναι ότι η while τη δευτερη φορα που τρεχει δν μ αφηνει να δωσω τιμες και οταν τρεχει το προγραμμα μου βγαζει αυτα τα συμβολακια που μαλλον ειναι σκουπιδια απο οτι μ ειπαν..θα ημουν ευγνωμων για λιγη βοηθεια.. :)

 

>#include <stdio.h>
#include <process.h>


int sinartish(int i);

int main()
{
int theseis[10][4];
int i,j;
char gramma;
char epilogh;
int kratish,seira,noumero;
gramma='A';

for(i=1;i<=10;i++){
for (j=1;j<=4;j++){
	theseis[i][j]=0;}}


printf ("%c",sinartish(i));
scanf("%c",&epilogh);

while (epilogh != 'Q' ) {

	if (epilogh=='E')
		for(i=1;i<=10;i++){
	if(i>1)
		gramma++;
		for (j=1;j<=4;j++){
			if (theseis[i][j]==0)
				printf("kenh thesh %c%d\n",gramma,j);
		}}



	else if (epilogh=='K')

		printf("dose arithmo theseon\n");
	    scanf("%d",&kratish);
		 
	
		for (i=0;i<kratish;i++){
			
			printf("dose gramma seiras\n");
		    scanf("%d",&seira);
		    printf("dose noumero seiras\n");
		    scanf("%d",&noumero);
			theseis[seira][noumero]=1;
		    printf("to eisitirio pou desmeutike einai to %c%d\n",gramma+(seira-1),noumero);
					}
		

printf ("%c",sinartish(i));
scanf("%c",&epilogh);
}



system("pause");
return 0;
}

int sinartish(int i)
{ printf("parakalo pliktrologiste E gia 'emfanish kenon theseon'\n parakalo pliktrologiste K gia'kratisi theseon'\n parakalo pliktrologiste Q'gia exodo apo to programma'\n");

return i;

}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κατάργησε την scanf() για διάβασμα από την είσοδο, και αντικατέστησέ την με τις fgets() και sscanf()...

 

Π.χ. αντί για...

>
 int n; float x;

 scanf( "%d %f", &n, &x );

 

αυτό...

>
 char input[ 256+1 ] = {'\0'};
 int n; float x;

 fgets( input, 256+1, stdin );
 sscanf( input, "%d %f", &n, &x );

 

Κάνε κι αναζήτηση στο φόρουμ, το συγκεκριμένο το έχω εξηγήσει αναλυτικά και με εναλλακτικές περίπου 2000 φορές :P

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

φιλε επειδη τωρα εχω αρχισει να μαθαινω υπαρχει κατι πιο απλο?οκ αυτο που μου γραφεις εσυ αλλα αν παραδωσω τετοια εργασια δν θα ειμαι και πολυ πιστευτος :rolleyes: ..στην while ποιο ειναι το θεμα?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βάλε σε σχόλια μέσα στον κώδικα πως είχες πρόβλημα με την scanf() και σου υπέδειξαν αυτόν τον τρόπο ως επίλυση.

 

Η εναλλακτική είναι να καθαρίζεις μόνος σου την κύρια είσοδο μετά ή πριν από κάθε χρήση της scanf() (και άλλων συναρτήσεων από τις στάνταρ)... κάνε Search στο φόρουμ, τα έχω εξηγήσει αναλυτικά τι, πως και γιατί.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

φιλε επειδη τωρα εχω αρχισει να μαθαινω υπαρχει κατι πιο απλο?οκ αυτο που μου γραφεις εσυ αλλα αν παραδωσω τετοια εργασια δν θα ειμαι και πολυ πιστευτος :rolleyes: ..στην while ποιο ειναι το θεμα?

 

Ακολούθησε την συμβουλή του φίλου migf1 για την ανάγνωση εισόδου και επίσης διόρθωσε τις ισότητες πχ. "<=4" & "<=10" που έχεις ορίσει στα for-loop σου σε πχ. "<4" && "<10" διότι ξεφεύγεις από το μέγεθος του πίνακα που ορίζεις ([10][4]) καθώς στην C μετράμε από το μηδέν οπότε το πρώτο στοιχείο του πίνακα σου είναι το [0] και το ανώτερο είναι το [9] & [3] αντίστοιχα (btw. τέτοια σφάλματα συνήθως έχουν την παρενέργεια -μεταξύ άλλων πιο σοβαρών- να παρουσιάζονται "σκουπίδια" κατά την εκτέλεση ή την έξοδο του προγράμματος).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επειδή το συγκεκριμένο θέμα επανέρχεται συνεχώς κάθε τόσο, σχεδόν τελείωσα μια μικρή βιβλιοθήκη ειδικά για ανάγνωση της κύριας εισόδου με C. Μέχρι να τελειώσω την τεκμηρίωσή της και να την ποστάρω τη βιβλιοθήκη σε δικό της νήμα, παραθέτω ένα απόσπασμα της τεκμηρίωσης το οποίο εξηγεί ακριβώς το συγκεκριμένο πρόβλημα.

 

 

 

 

Line Buffering

 

Μια άλλη, σημαντική χρησιμότητα της βιβλιοθήκης είναι πως αντιμετωπίζει ένα πολύ συχνό πρόβλημα: το line buffering.

 

Τί είναι το line-buffering;

 

Όταν πληκτρολογείτε χαρακτήρες στην κύρια εισόδο, δεν παραδίδονται στο πρόγραμμα σε πραγματικό χρόνο, αλλά συσσωρεύονται στο buffer της κύριας εισόδου έως ότου γεμίσει (η χωρητικότητα διαφέρει από πλατφόρμα σε πλατφόρμα) ή έως ότου πατήσετε ENTER ή έως ότου σηματοδοτήσετε ολοκληρωση της διαδικασίας με τον χαρακτήρα EOF (end of file). Στην γραμμή εντολών των Windows ο χαρακτήρας EOF παράγεται συνήθως με Ctrl+D, ενώ σε περιβάλλοντα POSIX (Unix, Linux, κλπ) συνήθως παράγεται με Ctrl+Z.

 

Το line-buffering δεν υλοποιείται από την C, αλλά από το περιβάλλον στο οποίο εκτελούνται όλα τα προγράμματα, άρα και τα προγράμματα που είναι γραμμένα σε C. Δηλαδή εν πολλοίς από την κονσόλα (φλοιό, γραμμή εντολών, κλπ) που χρησιμοποιεί το λειτουργικό σας σύστημα. Υψηλότερου επιπέδου γλώσσες, όπως για παράδειγμα η Java, σπάνια χρησιμοποιούν απευθείας την κονσόλα του λειτουργικού συστήματος για την εκτέλεση των προγραμμάτων τους, συνήθως τα εκτελούν μέσα σε δικό τους ελεγχόμενο περιβάλλον, σε υψηλοτερο επίπεδο.

 

Όπως και να έχει, το line-buffering είναι ιδιαίτερα χρήσιμο, διότι επιτρέπει στον χρήστη να επεξεργαστεί την είσοδο (π.χ. να διορθώσει λάθη) πριν την παραδώσει στο πρόγραμμα, συνήθως πατώντας το πλήκτρο ENTER. Προκαλεί όμως δυσάρεστες παρενέργειες σε προγράμματα που δεν φροντίζουν να καθαρίσουν το buffer της εισόδου μετά από κάθε απόπειρα ανάγνωσης δεδομένων από αυτήν.

 

Ας πάρουμε για παράδειγμα την στάνταρ συνάρτηση getchar() η οποία διαβάζει μόνο έναν χαρακτήρα από την κύρια είσοδο. Ας υποθέσουμε πως τη χρησιμοποιούμε στον παρακάτω κώδικα, όπου στο τέλος του προγράμματος ρωτάμε τον χρήστη αν θέλει να εκτελέσει νέο υπολογισμό:

 

>
#include <stdio.h>

int main( void )
{
       int x = 0, y = 0;

       puts( "Άθροισμα 2 ακεραίων" );
       for (; {
               printf( "δώστε 1ο αριθμό: ");
               scanf( "%d", &x );
               printf( "δώστε 2ο αριθμό: ");
               scanf( "%d", &y );
               printf( "%d + %d = %d\n", x, y, x+y );

               printf( "\nΘέλετε να υπολογίσετε νέο άθροισμα (ν/); " );
               if ( 'ν' !=  getchar() )
                       break;
       }
       return 0;
}

 

Εκτελώντας τον παραπάνω κώδικα θα διαπιστώσετε πως όταν διατυπωθεί η ερώτηση για υπολογισμό νέου αθροίσματος, το πρόγραμμα τερματιζεται χωρίς καν να απαντήσει ο χρήστης στην ερώτηση.

 

Αυτό που συμβαινει είναι πως λόγω του line-buffering, το ENTER που πατήθηκε μετά την είσοδο του 1ου αριθμού στην πρώτη scanf() περάστηκε ως είσοδος στην επόμενη scanf(), ακριβώς μπροστά από το 2ο νούμερο που πληκτρολογήθηκε. Η scanf() εξ' ορισμου αγνοεί τα ENTER, αλλά δεν τα αφαιρεί από το buffer της εισόδου. Οπότε το πρόγραμμά ναι μεν αγνοεί το πρώτο ENTER, αλλά το 2ο ENTER το περνάει σαν είσοδο στην getchar(). Κι επειδή το ENTER δεν ισούται με 'ν', η συνθήκη if γίνεται αληθής, οπότε σταματάει το loop λόγω της εντολής break και τερματιζεται το πρόγραμμα.

 

Το παραπάνω είναι ένα μόνο παράδειγμα των παρενεργειών από τις οποίες ενδέχεται να υποφέρουν τα προγράμματά σας, αν δεν έχετε φροντίσει να διαχειρίζεστε σωστά το buffer της κύριας εισόδου. Και η getchar() είναι μια μόνο από τις συναρτήσεις που επηρεάζονται από το line-buffering. Σχεδόν όλες οι στάνταρ συναρτήσεις εισόδου της C επηρεάζονται από το line-buffering, συμπεριλαμβανομένης της scanf()

 

Αυτός είναι κι ένας από τους κύριους λόγους που σε πραγματικές εφαρμογές η ανάγνωση από την κύρια είσοδο γίνεται με custom συναρτήσεις. Συχνότατα μάλιστα γίνεται ανάγνωση ολοκληρης της γραμμής εισόδου και κατόπιν διαχωρισμός της μεταβλητής ή των μεταβλητών που χρειάζεται το πρόγραμμα από τη συγκεκριμένη γραμμή εισόδου.

 

Παραπλήσια τεχνική χρησιμοποιεί κι αυτή η βιβλιοθήκη σε όλες της τις συναρτήσεις, φροντίζοντας μάλιστα να καθαρίζει το buffer της εισόδου μετά από κάθε ανάγνωση, έτσι ώστε η επόμενη προτροπή εισόδου να ξεκινάει με καθαρό buffer.

 

Ο κώδικας που ακολουθεί χρησιμοποιεί την βιβλιοθήκη για να υλοποιήσει ότι και ο προηγούμενος, και δεν υποφέρει από παρενέργειες του line-buffering:

 

>

#include <stdio.h>
#include "prompt_for.h"

int main( void )
{
       int x = 0, y = 0;

       puts( "Άθροισμα 2 ακεραίων" );
       for (; {
               x = prompt_for_int( "δώστε 1ο αριθμό: ");
               y = prompt_for_int( "δώστε 2ο αριθμό: ");
               printf( "%d + %d = %d\n", x, y, x+y );

               if ( 'ν' != prompt_for_char("\nΘέλετε να υπολογίσετε νέο άθροισμα (ν/); ") )
                       break;
       }
       return 0;
}

 

 

 

Κι εδώ ένα άλλο απόσπασμα, σχετικά με την προσέγγιση της συγκεκριμένης βιβλιοθήκης στο θέμα ανάγνωση κύριας εισόδου με C ...

 

 

 

 

Γενική μορφή συναρτήσεων

 

Όπως αναφέρθηκε ήδη παραπάνω, μια από τις διευκολύνσεις που σας παρέχει αυτή η βιβλιοθήκη είναι πως δεν χρειάζεται να θυμάστε ποιον μορφοποιητή αναμονής εισόδου πρέπει να χρησιμοποιήστε για να διαβάσετε μια μεταβλητή. Επίσης δεν χρειάζεται να χρησιμοποιήσετε τη διεύθυνση της μεταβλητής προκειμένου να τη διαβάσετε.

 

Για παράδειγμα, αν θέλετε να προτρέψετε τον χρήστη να σας δώσει έναν μικρό ακέραιο για να τον αποθηκεύσετε σε μια μεταβλητή num, τότε μια πιθανή υλοποίηση με χρήση της στάνταρ συνάρτησης scanf() είναι ο εξής κώδικας:

 

>
   	short int num;

       printf( "Παρακαλώ δώστε έναν μικρό ακέραιο: " );
       scanf( "%hd", &num );

 

Επειδή όμως, όπως αναλύθηκε σε προηγούμενη ενότητα, η scanf() είναι επιρρεπής σε παρενέργειες του Line Buffering, ένας πιο ασφαλής τρόπος ανάγνωσης του μικρού ακεραίου είναι με μονοκόμματη ανάγνωση ολόκληρης της γραμμής εισόδου ως μια μεγάλη συμβολοσειρά, και κατόπιν μετατροπή της πρώτης λέξης σε μικρό ακέραιο. Αυτό με στάνταρ συναρτήσεις της C, μπορεί να υλοποιηθεί κάπως έτσι...

 

>
   	char input[ 1024+1 ] = {'\0'};
       short int num;

       printf( "Παρακαλώ δώστε έναν μικρό ακέραιο: " );
       fgets( input, 1024+1, stdin ) )
       sscanf( input, "%hd", &num );

Αν μάλιστα θελήσουμε να ελέγξουμε πιθανή αποτυχία της εισόδου, όπως είναι το σωστό σε κάθε σοβαρό πρόγραμμα, τότε ο κώδικας γίνεται κάπως έτσι...

 

>
   	char input[ 1024+1 ] = {'\0'};
       short int num;

       printf( "Παρακαλώ δώστε έναν μικρό ακέραιο: " );
       if ( fgets( input, 1024+1, stdin ) )
               if ( 1 != sscanf( input, "%hd", &num ) )
                       // εσφαλμένη είσοδος

Με χρήση της βιβλιοθήκης prompt_for, η ίδια δουλειά χωρις έλεγχο για αποτυχία γίνεται με σημαντικά πιο απλό κώδικα, ως εξής:

 

>
  	short int num;
       num = prompt_for_short( "Παρακαλώ δώστε έναν μικρό ακέραιο: " );

 

ενώ ακόμα και με έλεγχο για αποτυχία, ο κώδικας παραμένει σημαντικά πιο απλός και κυρίως σημαντικά πιο ευανάγνωστος...

 

>
  	short int num;

       num = prompt_for_short( "Παρακαλώ δώστε έναν μικρό ακέραιο: " );
       if ( num == PF_ERR_SHORT )
               // εσφαλμένη είσοδος

Είναι δηλαδή πολύ πιο πιο εύκολο να θυμάστε το num = short από το (%hd, &num), όπως επίσης είναι πολύ πιο εύκολο να ελέγχετε για αποτυχία με μια ευανάγνωστη συνθήκη if, αντί για 2 δυσανάγνωστες.

 

Αυτή είναι και η γενικότερη φιλοσοφία όλων των συναρτήσεων της βιβλιοθήκης, με 3 μόνο εξαίρεσεις: τη συνάρτηση prompt_for_string() που διαβάζει συμβολοσειρές μηδενισμένου τέλους (c-strings) και τις συναρτήσεις prompt_for() και prompt_for_nargs() που διαβάζουν μεταβλητού πλήθους & τύπου μεταβλητές, κατά τα πρότυπα της στάνταρ συνάρτησης scanf().

 

Οπότε για να διαβάσετε μια μεταβλητή οποιουδήποτε βασικού τύπου, το μόνο που χρειάζεται να θυμάστε είναι η ονομασία που χρησιμοποιεί για τον τύπο αυτό η βιβλιοθήκη. Για τους ελέγχους αποτυχίας χρειάζεται να θυμάστε και τους κώδικες σφαλμάτων, αλλά αν θυμάστε τις συναρτήσεις, τότε οι κωδικοί σφάλματος που τους αντιστοιχούν είναι το τελευταίο μέρος από το όνομα της συνάρτησης με το πρόθεμα: PF_ERR_ ( που σημαίνει: PromptFor_ERRor_ ).

 

Οι ονομασίες είναι σχεδόν αυτονόητες, οπότε δεν χρειάζονται πάνω από 1-2 μέρες για να τις εντυπώσει κάνεις στη μνήμη του. Δείτε για παράδειγμα το ακόλουθο απόσπασμα κώδικα, που διαβάζει από την κύρια είσοδο μεταβλητές διάφορων τύπων...

 

 

>
#define MAXSTRLEN   	(80+1)
...
   	int 			n = 0;
   	unsigned long   oct = 0;
   	unsigned short  hex = 0;
   	char        	booktitle[ MAXSTRLEN ] = {'\0'};
   	struct Point { float x; float y; } point;

   	n   	= prompt_for_int( "Δώστε έναν ακέραιο: " );
   	hex 	= prompt_for_ushort_hex( "Δώστε έναν θετικό σε 16-αδική βάση: " );
   	oct 	= prompt_for_ulong_oct( "Δώστε έναν μεγάλο θετικό σε 8-αδική βάση" );

   	puts( "Δώστε τις συντεταγμένες ενός σημείου στο καρτεσιανό..." );
   	point.x = prompt_for_float( "x: ");
   	point.y = prompt_for_float( "y: ");

   	prompt_for_string("Ποιον τίτλο βιβλίου αναζητάτε; ", booktitle, MAXSTRLEN );
...

Αν θελήσετε να πρoσθέσετε ελέγχους αποτυχίας εισόδου, τότε ο κώδικας αλλάζει ως εξής:

 

>
#define MAXSTRLEN   	(80+1)
...
   	int 			n = 0;
   	unsigned long   oct = 0;
   	unsigned short  hex = 0;
   	char        	booktitle[ MAXSTRLEN ] = {'\0'};
   	struct Point { float x; float y; } point;

   	n = prompt_for_int( "Δώστε έναν ακέραιο: " );
   	if ( n == PF_ERR_INT )
           	// εσφαλμένη είσοδος

   	hex = prompt_for_ushort_hex( "Δώστε έναν θετικό σε 16-αδική βάση: " );
   	if ( hex == PF_ERR_USHORT_HEX )
           	// εσφαλμένη είσοδος

   	oct = prompt_for_ulong_oct( "Δώστε έναν μεγάλο θετικό σε 8-αδική βάση" );
   	if ( oct == PF_ERR_ULONG_OCT )
           	// εσφαλμένη είσοδος

   	puts( "Δώστε τις συντεταγμένες ενός σημείου στο καρτεσιανό..." );

   	point.x = prompt_for_float( "x: ");
   	if ( point.x == PF_ERR_FLOAT )
           	// εσφαλμένη είσοδος

   	point.y = prompt_for_float( "y: ");
   	if ( point.y == PF_ERR_FLOAT )
           	// εσφαλμένη είσοδος

   	if ( !prompt_for_string("Ποιον τίτλο βιβλίου αναζητάτε; ", booktitle, MAXSTRLEN) )
           	// εσφαλμένη είσοδος

Ο αντίστοιχος κώδικας με στάνταρ συναρτήσεις της C βγαίνει περίπου διπλάσιος και πολύ πιο δυσανάγνωστος.

 

Η βιβλιοθήκη σας βοηθάει να αυξήσετε την παραγωγικότητά σας, αλλά ταυτόχρονα σας απομακρύνει από την εκμάθηση της ίδιας της γλώσσας. Η ιδανική περίπτωση είναι όταν είστε ήδη εξοικειωμένοι με τη γλώσσα, αλλά έχετε επιλέξει συνειδητά τη χρήση της βιβλιοθήκης, ώστε να γράφετε λιγότερο, πιο ευανάγνωστο και πιο ασφαλή κώδικα.

 

 

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κι εγώ ευχαριστώ :)

 

Ελπίζω μέχρι αύριο να την έχω τελειώσει και να την ποστάρω. Ούτε πτυχιακή να έγραφα... ο κώδικας έτοιμος σε 2-3 ώρες και η τεκμηρίωση είναι στη 2η μέρα κι ακόμα δεν έχει τελειώσει :lol:

 

EDIT:

 

Α, παρεμπιπτόντως, εδώ ένα εξαιρετικό link το οποίο εξηγεί αναλυτικότατα γιατί το διάβασμα της κύριας εισόδου μόνο απλή υπόθεση δεν είναι: http://home.datacomm.ch/t_wolf/tw/c/getting_input.html (γενικώς όλο το site είναι εξαιρετικό!)

 

Στη βιβλιοθήκη που έφτιαξα αντιμετωπίζω τα περισσότερα από όσα περιγράφει κι αυτός. Τα λιγοστά που απομένουν θα τα βάλω σε επόμενη έκδοση :)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

για τα όρια πινάκων στο εξήγησαν ήδη οι προηγούμενοι

-------------------------------------------------------------------------------------

int sinartish(int i){

printf("parakalo pliktrologiste E gia 'emfanish kenon theseon'");

printf("\n parakalo pliktrologiste K gia'kratisi theseon'");

printf("\n parakalo pliktrologiste Q'gia exodo apo to programma'\n");

return i;

}

 

 

ποια η χρησιμότητα του i στο παραπάνω?μήπως να γίνει void?

--------------------------------------------------------------------------------------

όσο για τα σκουπιδάκια που αναφέρεις οφείλονται στην πιο κάτω γραμμή του κώδικα σου

 

>
printf ("%c",sinartish(i));

 

τυπώνεις σαν χαρακτήρα τον ακέραιο i που πέρασες και επεστρεψες στην συνάρτηση σου

μπορείς απλά να το γράψεις

>
sinartish(i);

--------------------------------------------------------------------------------------

γιατί ζητας γράμμα σειρας και διαβάζεις ακέραιο?

>
........
                       printf("dose gramma seiras\n");
                       scanf("%d",&seira);getchar();
........

--------------------------------------------------------------------------------------

πρέπει να βάλεις μέσα σε άγγιστρα( {}) τον κώδικα που ακολουθεί μετά το else if (epilogh=='K')

 

>
               else if (epilogh=='K'){
                   printf("dose arithmo theseon\n");
                   scanf("%d",&kratish);getchar();
                   for (i=0;i<kratish;i++){
                       printf("dose gramma seiras\n");
                       scanf("%d",&seira);getchar();
                       printf("dose noumero seiras\n");
                       scanf("%d",&noumero);getchar();
                       theseis[seira][noumero]=1;
                       printf("to eisitirio pou desmeutike einai to %c%d\n",gramma+(seira-1),noumero);
                   }
               }

-------------------------------------------------------------------------------------

και τέλος μετά από κάθε scanf που έχεις στον κώδικα σου βάλε και μία getchar();

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

και τέλος μετά από κάθε scanf που έχεις στον κώδικα σου βάλε και μία getchar();

Αυτό δυστυχώς πάλι θα δημιουργήσει το ίδιο πρόβλημα αν για παράδειγμα έστω και κατά λάθος πατηθεί ένα ENTER πριν την πληκτρολόγηση της τιμής που αναμένει η scanf().

 

Δεν αποτελεί δηλαδή αξιόπιστη λύση. Αξιόπιστη λύση είναι να καθαρίζει με ένα while από getchar() τυχόν έξτρα χαρακτήρες (έως '\n' ή έως EOF).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

παιδια κουτσα στραβα τα ελυσα τα προβληματακια..το μονο που μου εχει μείνει ειναι οτι αφου μπει στην επαναληψη πρωτη φορα οταν ξαναεμφανιζεται το μενου το εμφανιζει διπλη φορα...αν μπορει καποιος να βρει το λαθος θα με χαροποιησει ιδιαιτερα :)

 

>#include <stdio.h>



char sinartish(char epilogh);

int main()
{
       int theseis[10][4];
       int i,j;
       char gramma,gramma1;
       char epilogh;
       int kratish,seira,noumero,noumero1,sinolo;
       gramma='A';
       sinolo=0;
       for(i=0;i<10;i++){
       for (j=0;j<4;j++){
               theseis[i][j]=0;}}


       printf ("%c",sinartish(epilogh));
       scanf("%c",&epilogh);
       
       while (epilogh != 'Q' ) {
       gramma='A';
               if (epilogh=='E')
            
                       for(i=0;i<10;i++){
               if(i>0)
                       gramma++;
                       for (j=0;j<4;j++){
                               if (theseis[i][j]==0)
                                       printf("kenh thesh %c%d\n",gramma,j+1);
                       }}


       
               else if (epilogh=='K' && sinolo<=39 ){

                       printf("dose arithmo theseon\n");
                   scanf("%d",&kratish);
                        sinolo=sinolo+kratish;
               
                       for (i=0;i<kratish;i++){
                                gramma='A'; 
                           printf("dose gramma seiras\n");
                           scanf("%d",&seira);
                           printf("dose noumero seiras\n");
                           scanf("%d",&noumero);
                               while(theseis[seira][noumero]==1){
                               printf("piasmenh thesh.xanadose");
                               printf("dose gramma seiras\n");
                               scanf("%d",&seira);
                               printf("dose noumero seiras\n");
                               scanf("%d",&noumero);}
                               theseis[seira][noumero]=1;
                             
                           printf("to eisitirio pou desmeutike einai to %c%d\n",gramma+seira,noumero+1);
                                               }}
                     else if(sinolo>39)
                     printf("mi diathesimes theseis\n");  

       printf ("%c",sinartish(i));
       scanf("%c",&epilogh);
       }


       
       return 0;
}

char sinartish(char epilogh)
{ printf("parakalo pliktrologiste E gia 'emfanish kenon theseon'\n parakalo pliktrologiste K gia'kratisi theseon'\n parakalo pliktrologiste Q'gia exodo apo to programma'\n");

return 0;}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

΄δοκίμασε έτσι

>

#include <stdio.h>

void sinartish();

int main(){
   char gramma='A',gramma1,epilogh;
   int theseis[10][4]={0},i,j,kratish,seira,noumero,noumero1,sinolo=0;
   sinartish();
   scanf("%c",&epilogh);getchar();
   while (epilogh != 'Q' ) {
       gramma='A';
       if (epilogh=='E')
           for(i=0;i<10;i++){
               if(i>0)
                   gramma++;
               for (j=0;j<4;j++)
                   if (theseis[i][j]==0)
                       printf("kenh thesh %c%d\n",gramma,j+1);
               }
       else if (epilogh=='K' && sinolo<=39 ){
           printf("dose arithmo theseon\n");
           scanf("%d",&kratish);getchar();
           sinolo=sinolo+kratish;
           for (i=0;i<kratish;i++){
               gramma='A';
               int error=1;
               while(error){ 
                   error=0;
                   printf("dose gramma seiras\n");
                   scanf("%d",&seira);getchar();
                   printf("dose noumero seiras\n");
                   scanf("%d",&noumero);getchar();
                   if(seira<0 || seira>9){
                       printf("la8os seira.xanadose\n");
                       error=1;
                   }
                   else if(noumero<0 || noumero>3){
                       printf("la8os noumero.xanadose\n");
                       error=1;
                   }
                   else if(theseis[seira][noumero]==1){
                       printf("piasmenh thesh.xanadose\n");
                       error=1;
                   }
               }
               theseis[seira][noumero]=1;
               printf("to eisitirio pou desmeutike einai to %c%d\n",gramma+seira,noumero+1);
           }
       }else if(sinolo>39)
           printf("mi diathesimes theseis\n");  
       sinartish();
       scanf("%c",&epilogh);getchar();
   }
   return 0;
}

void sinartish(){
   printf("parakalo pliktrologiste E gia 'emfanish kenon theseon'");
   printf("\n parakalo pliktrologiste K gia'kratisi theseon'");
   printf("\n parakalo pliktrologiste Q'gia exodo apo to programma'\n");
}



 

σου έχω κάνει και κάποιες διορθώσεις όπως π.χ. έλεγχο αν η σειρά που θα δώσει ο χρήστης

είναι μέσα στα όρια που θέλουμε

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...