migf1 Δημοσ. 12 Δεκεμβρίου 2012 Δημοσ. 12 Δεκεμβρίου 2012 ... κανα καλο γρηγορο παραδειγμα και επεξηγηση για την sprintf έχεις ???? έχω ζαλιστει ..... Yeap, την τεκμηρίωσή της στον gcc. p.s Παντως οταν ευκαιρησεις δες λιγο τον κωδικα..... Δεν το υπόσχομαι, τουλάχιστον για σήμερα.
migf1 Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 ... p.s Παντως οταν ευκαιρησεις δες λιγο τον κωδικα..... Στοίχισέ τον σωστά και γράψε με 2 λόγια τι κάνει, που έχεις πρόβλημα και τι πρόβλημα.
Star_Light Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 Στοίχισέ τον σωστά και γράψε με 2 λόγια τι κάνει, που έχεις πρόβλημα και τι πρόβλημα. migf1 δεν ξερω αμα έχω πετυχει την στοίχιση που θές μαλλον δεν την εχω πετυχει.... http://ideone.com/1uEeeF Το προγραμμα λειτουργει σαν ενας μηνιαιος υπενθυμητής που δέχεται την ημερομηνια μαζι την υπενθυμιση σαν strings τα συνενώνει.... αν ο χρηστης εχει δωσει 3 υπενθυμισεις μαζι με τις ημερομηνιες τους πχ 20 Dec testing , 18 Dec reading , 23 Dec relaxing θα τεστάρει τα strings χρησιμοποιώντας την strcmp και πχ το 18 Dec reading θα το αλλαξει θέση στον πινακα στην θέση του 20 Dec testing οποτε η εξοδος στο τελος θα ειναι 18 , 20 , 23 με τις υπενθυμισεις τους. Προβλημα στον κωδικα δεν υπαρχει μιας και καταλαβαινω τι κανει και πως το κανει απλα τον παρεθεσα για να ρωτησω κατι μεσα στο while και βρηκες οτι θελει n-1. Ακομη αυτο δεν το εχω δει παντως θα παω σε λιγο γιατι ακομη και αν του βαλεις τοσα.... θα σου πεταξει περιεργα αμα ξεπερασεις τους χαρακτηρες.
migf1 Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 migf1 ναι το βλεπω αυτο που λες..... τον κώδικα τον έχω πάρει απο τον King και του έχω βαλει κάποιες μικρες βελτιώσεις μεσα πχ να μην δεχεται αρνητικες ημερομηνιες . > #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAX_REMIND 50 #define MSG_LEN 3 int read_line(char str[] , int n); int main( void ) { char reminders[MAX_REMIND][MSG_LEN+3]; char day_str[3] , msg_str[MSG_LEN+1]; int day , i , j , num_remind=0; for(;{ if( num_remind == MAX_REMIND) { printf("-- No space left --\n"); break; } printf(" Enter day and reminder : "); scanf("%2d", &day); if( day == 0 || day < 0) break; sprintf(day_str , "%2d" , day); read_line(msg_str, MSG_LEN); for(i=0; i < num_remind; i++) if(strcmp(day_str , reminders[i]) < 0 ) break; for(j=num_remind; j>i; j--) strcpy(reminders[j], reminders[j-1]); strcpy(reminders[i] , day_str); strcat(reminders[i] , msg_str); num_remind++; } if( !num_remind ) exit(1); printf("\nDay Reminder\n"); for(i=0; i < num_remind; i++) printf(" %s\n" , reminders[i]); return 0; } int read_line(char str[] , int n) { int ch , i =0 ; while( (ch= getchar()) !='\n' && i<n) //if( i < n ) str[i++]= ch; str[i]='\0'; return i; } Καμια διόρθωση σε αυτο που επισημαινεις υπάρχει ? Τελικά το κοίταξα σήμερα (ανατρέχοντας στο βιβλίο για να βρω την εκφώνηση) και βασικά ξανάγραψα όλο το input related κομμάτι του, ώστε να είναι πολύ πιο bullet-proof against bad input. Δεν ξέρω αν είναι αυτό που είχες στο μυαλό σου όταν με ρώταγες αν υπάρχει κάποια διόρθωση σε αυτό που επισήμανα, αλλά έχω χρησιμοποιήσει δυο ρουτίνες από την LIBS (την s_trim() και την read_line() που στην LIBS την ονομάζω s_getsflushed() ), μια ρουτίνα από το CC HexView (την s_cpTrim()) και μια που έγραψα τώρα, την s_cpNextBlank(). Μπορεί να μου έχει ξεφύγει και τίποτα, γιατί δεν έκανα εξαντλητικές δοκιμές. Πριν σου παραθέσω τον κώδικα, να πω πως ο κώδικας που δίνει ο King στο βιβλίο δεν πάσχει από το πρόβλημα που σου επισήμανα, διότι όταν ορίζει το msg_str[] το ορίζει με MSG_LEN+1 χαρακτήρες, και το διαβάζει με: read_line(str_msg, MSG_LEN); Άρα μέσα στην read_line() το n του αντιστοιχεί σε sizeof()-1, και άρα δουλεύει σωστά... στο ποστ που παρέθεσες με τα loops δεν είχες παραθέσει αυτή την πληροφορία... αυτά που σου έγραψα εγώ, όπως και το παράδειγμα θεωρούν πως το n αντιστοιχεί σε sizeof(). Παραθέτω και τον κώδικα με το βελτιωμένο input-handling... > #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXINPUT (255+1) #define MAX_REMINDS 50 /* max # of reminders */ #define MAXSIZE_MSG (60+1) /* max size of a reminder msg, including '\0' */ #define VALID_DAY(d) ( (d) > 0 && (d) < 32 ) /*********************************************************//** * @brief Read a c-string from stdin, flushing any extra characters. ************************************************************* */ int read_line( char line[], size_t size ) { size_t i = 0; /* sanity checks */ if ( !line || size < 1 ) return 0; /* read chars from stdin */ for (i=0; i < size-1 && '\n' != (line[i]=getc(stdin)); i++) ; /* void */ /* flush stdin, if needed */ if ( line[i] != '\n' ) { /* size reached without '\n' */ while ( '\n' != getchar() ) /* ... flush remaining chars */ ; /* void */ } /* nul-terminate line */ line[i] = '\0'; return i; } /*********************************************************//** * @brief Return a pointer to the 1st non-blank character of a c-string, * or NULL on error. ************************************************************* */ char *s_cpTrim( const char *s ) { char *cp = (char *)s; if ( !s ) return NULL; while ( isspace( (int)(*cp) ) ) cp++; /* void */ return cp; } /*********************************************************//** * @brief Return a pointer to the 1st blank character of a c-string, * or NULL on error. ************************************************************* */ char *s_cpNextBlank( const char *s ) { char *cp = (char *)s; if ( !s ) return NULL; while ( !isspace( (int)(*cp) ) ) cp++; /* void */ return cp; } /*********************************************************//** * @brief Τrim leading & trailing blanks (spaces & tabs) from a c-string. ************************************************************* */ char *s_trim( char *s ) { char *cp1 = NULL; /* for parsing the whole s */ char *cp2 = NULL; /* for shifting & padding */ /* sanity checks */ if ( !s ) { return NULL; } if ( !*s ) { return s; } /* trim leading & shift remaining to the left */ for (cp1=s; ' ' == *cp1 || '\t' == *cp1; cp1++)/* skip leading spaces, via cp1 */ ; for (cp2=s; *cp1; cp1++, cp2++) /* shift left remaining chars, via cp2 */ *cp2 = *cp1; *cp2-- = '\0'; /* mark end of left trimmed s */ /* replace trailing spaces with '\0's */ while ( cp2 > s && (' ' == *cp2 || '\t' == *cp2) ) *cp2-- = '\0'; /* pad with '\0' */ return s; } /* ----------------------------------- */ int main( void ) { char input[ MAXINPUT ] = {'\0'}; char reminds[MAX_REMINDS][MAXSIZE_MSG+3] = {{'\0'}}; char strDay[4] = {'\0'}; char strMsg[ MAXSIZE_MSG ] = {'\0'}; int day, i, j, nremind = 0; for (; { if ( nremind == MAX_REMINDS) { printf("-- No space left --\n"); break; } /* handle user input */ for (; { char *cp = NULL; printf( "Enter day & reminder: " ); read_line( input, MAXINPUT ); s_trim( input ); /* remove leading & trailing blanks */ sscanf( input, "%d", &day ); cp = s_cpNextBlank( input ); /* skip day input */ if ( cp ) cp = s_cpTrim(cp); /* skip blanks */ if ( NULL == cp || (0 != day && !VALID_DAY(day)) ) { fputs( "\t*** invalid input, try again...\n", stderr ); continue; } if ( cp ) strncpy(strMsg, cp, MAXSIZE_MSG-1); break; } if ( 0 == day ) break; sprintf( strDay, "%2d ", day ); /* accept inputted day */ for (i=0; i < nremind; i++) if( strcmp(strDay, reminds[i]) < 0 ) break; for (j=nremind; j > i; j--) strcpy(reminds[j], reminds[j-1]); strcpy(reminds[i], strDay); strcat(reminds[i], strMsg); nremind++; } if ( !nremind ) exit(1); printf("\nDay Reminder\n"); for (i=0; i < nremind; i++) printf( "%s\n", reminds[i] ); system("pause"); return 0; } ΥΓ. Με την ευκαρία να πω πως είχα ξεκινήσει να φτιάχνω νεότερη έκδοση της LIBS, αυτή τη φορά με την τεκμηρίωση της σε doxygen. Αλλά δεν έχω καταφέρει να την συνεχίσω από τότε. Πριν από μερικές μέρες όμως ανέβασα online ότι τεκμηρίωση είχα γράψει σε doxugen, και ας μην αντιστοιχεί 100% στην 1η έκδοση της βιβλιοθήκης. Βασικά είναι η τεκμηρίωση των πρισσότερεων από τις έξτρα συναρτήσεις, συγκρτικά με το <string.h>. Το link για όποιον ενδιαφερεται είναι αυτό: http://x-karagiannis.gr/prg/custom/doc/libs/html/group__libs_additional.html (btw, ενδιαφέρουσα συνάρτηση είναι η: sarr_nsort_by_tokorder() η οποία αν θυμάμαι σωστά υπάρχει και στην 1η έκδοση, αλλά τώρα έχει και παράδειγμα με κώδικα). Αν και όταν καταφέρω να ολοκληρώση την 2η έκδοση και την τεκμηρίωσή της, θα το αναφέρω στο σχετικό νήμα.
Star_Light Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 @μιγφ1 ναι αλλα αμα αλλαξω το > #define MSG_LEN 10 και δωσω > kostas@kostas-SSL:~/PROGRAMS$ ./calculator Enter day and reminder : 23 December test Enter day and reminder : Enter day and reminder : 20 Dec reading Enter day and reminder : Enter day and reminder : 0 Day Reminder 20g 20 Dec readi 23est 23 December Mε αλλα λογια δηλαδη γινεται πανικος στην έξοδο.... αυτο βεβαια επειδη μεσα στην συναρτηση έχει βαλει την getchar() απο οσο υποψιαζομαι και μαλλον υποψιαζομαι σωστα. O κωδικας που παραθέτεις βέβαια δουλεύει διορθώνοντας το παραπανω προβλημα.
migf1 Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 ... (btw, ενδιαφέρουσα συνάρτηση είναι η: sarr_nsort_by_tokorder() η οποία αν θυμάμαι σωστά υπάρχει και στην 1η έκδοση, αλλά τώρα έχει και παράδειγμα με κώδικα). ... Όντως υπάρχει, μόλις το τσέκαρα, αλλά έχει bug! Ο κώδικας που ακολουθεί είναι από την 2η έκδοση, και πρέπει να είναι οκ... > int sarr_nsort_by_tokorder( char *sarr[], int n, int tokorder, size_t toksize, const char *delims ) { register int i=0, j=0; char s[2][toksize]; /* 2 προσωρινά strings: s[0] και s[1] */ char *tokens[ tokorder + 1 ]; /* για την s_tokenize() */ /* sanity checks */ if ( !sarr || !delims ) { errno = EFAULT; return 0; } if ( n < 2 || tokorder < 1 || toksize < 1 ) { errno = EINVAL; return 0; } for (i=0; i < n; i++) { for (j=0; j < (n-1); j++) { /* αντιγραφή στο s[0] της tokorder λέξης του sarr[j] (ή '\0' αν δεν υπαρχει) */ s_strcpy(s[0], sarr[j]); if ( s_tokenize( s[0], tokens, tokorder + 1, delims ) >= tokorder ) s_strncpy(s[0], tokens[ tokorder - 1 ], toksize); else *s[0] = '\0'; /* αντιγραφή στο s[1] της tokorder λέξης του sarr[j+1] (ή '\0' αν δεν υπαρχει) */ s_strcpy(s[1], sarr[j+1] ); if ( s_tokenize( s[1], tokens, tokorder + 1, delims ) >= tokorder ) s_strncpy(s[1], tokens[ tokorder - 1 ], toksize); else *s[1] = '\0'; if ( s_strcmp(s[0], s[1]) > 0 ) s_swap_addr( &sarr[j+1], &sarr[j] ); } } return 1; /* TRUE */ } @μιγφ1 ναι αλλα αμα αλλαξω το > #define MSG_LEN 10 και δωσω > kostas@kostas-SSL:~/PROGRAMS$ ./calculator Enter day and reminder : 23 December test Enter day and reminder : Enter day and reminder : 20 Dec reading Enter day and reminder : Enter day and reminder : 0 Day Reminder 20g 20 Dec readi 23est 23 December Mε αλλα λογια δηλαδη γινεται πανικος στην έξοδο.... αυτο βεβαια επειδη μεσα στην συναρτηση έχει βαλει την getchar() απο οσο υποψιαζομαι και μαλλον υποψιαζομαι σωστα. Σε ποιανού τον κώδικα αναφέρσαι, τον δικό μου ή του King? (ρε συ, γράφε πιο σαφή μηνύματα... μη βαριέσαι ) ... Mε αλλα λογια δηλαδη γινεται πανικος στην έξοδο.... αυτο βεβαια επειδη μεσα στην συναρτηση έχει βαλει την getchar() απο οσο υποψιαζομαι και μαλλον υποψιαζομαι σωστα. ... Λογικά δεν έχει σχέση η getchar() αλλά το ότι χρησιμοποιεί strcpy() αντί για strncpy().
Star_Light Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 χαχαχα δεν βαριεμαι ρε συ... απλα εχω ζαλιστει εδω περα στου King εννοειται..... οχι στον δικο σου!
migf1 Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 χαχαχα δεν βαριεμαι ρε συ... απλα εχω ζαλιστει εδω περα στου King εννοειται..... οχι στον δικο σου!
Star_Light Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 @migf1 εχω την εντυπωση οτι οι αρχικοποιήσεις που κάνεις στα strings δεν χρειάζονται εκτος και αν θες να εισαι 100% τυπικος... πχ σε τι χρειαζεται να αρχικοποιήσεις σε '\0' τον input ? αφου ουτως η άλλως θα κανει αυτη την δουλεια η συνάρτηση read_line ... επισης για ποιο λογο να αρχικοποιήσεις το str_Day εφοσον αυτη την δουλεια θα την κάνει και παλι αυτοματα η sprintf κοτσάροντας στο τελός εναν null character.... O Κινγκ ολους αυτους δεν τους αρχικοποιει εξαρχης.....
migf1 Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 @migf1 εχω την εντυπωση οτι οι αρχικοποιήσεις που κάνεις στα strings δεν χρειάζονται εκτος και αν θες να εισαι 100% τυπικος... πχ σε τι χρειαζεται να αρχικοποιήσεις σε '\0' τον input ? αφου ουτως η άλλως θα κανει αυτη την δουλεια η συνάρτηση read_line ... επισης για ποιο λογο να αρχικοποιήσεις το str_Day εφοσον αυτη την δουλεια θα την κάνει και παλι αυτοματα η sprintf κοτσάροντας στο τελός εναν null character.... O Κινγκ ολους αυτους δεν τους αρχικοποιει εξαρχης..... Σου προτείνω να κάνεις πάντα αρχικοπoιήσεις, διότι δεν ξέρεις πότε και που θα σε δαγκώσουν τα σκουπίδια που αναθέτονται σε μη αρχικοποιημένες τοπικές μεταβλητές. Π.χ... > int main( void ) { char s[200]; strcat(s, "1234"); puts( s ); system("pause"); return 0; } Λοιπόν, κάτσε να σε βοηθήσω λίγο με τον δικό μου κώδικα, σε περίπτωση που είναι δυσνόητος. Εννοώ το κομμάτι που κάνει το input... > /* handle user input */ for (; { char *cp = NULL; printf( "Enter day & reminder: " ); read_line( input, MAXINPUT ); s_trim( input ); /* remove leading & trailing blanks */ sscanf( input, "%d", &day ); cp = s_cpNextBlank( input ); /* skip day input */ if ( cp ) cp = s_cpTrim(cp); /* skip blanks */ if ( NULL == cp || (0 != day && !VALID_DAY(day)) ) { fputs( "\t*** invalid input, try again...\n", stderr ); continue; } if ( cp ) strncpy(strMsg, cp, MAXSIZE_MSG-1); break; } Καταρχή η read_line() κάνει flush την stdin αν χρειάζεται, οπότε καθαρίσαμε με αυτό (παρεμπιπτόντως, ήταν ωραίο ήταν το Αν του Παπακαλλιάτη, δεν το περίμανα ) Η s_trim() αφαιρεί τυχόν κενούς χαρακτήρες στην αρχή ή/και στο τέλος του input που επιστρέφει η read_line(). Η sscanf() διαβάζει κατόπιν τα 1o "token" του καθαρισμένου input και το εκχωρεί στην day. Μετά η s_cpNextBlank() πάει στον 1ο κενό χαρακτήρα που έπεται της ημέρας μέσα στο input, και μέσω της s_cpTrim() προσπερνάει τυχόν κενούς χαρακτήρες (άρα δείχνει στην αρχή του κειμένου που θέλουμε να μπει στο strMsg. Σε αυτό το σημείο κανει validation των day και cp, κι αν υπάρχει πρόβλημα, πληροφορεί τον χρήστη και τον προτρέπει για νέο input. Αλλιώς, εκχωρεί τον cp στο strMsg μέσω της strncpy(). Απο εκεί και κάτω είναι όπως ο αυθεντικός κώδικας του King.
Star_Light Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 Α. Εννοεις δηλαδη οτι μπορει να ξεχαστείς γενικά να αρχικοποιήσεις το s..... παρακατω στο προγραμμα.... οποτε θα έχει τιμές "σκουπιδια" μεσα του.
migf1 Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 Ναι, το ίδιο ισχύει για όλες τις μεταβλητές (δλδ όχι μόνο για τα strings)... π.χ. νομίζω πως και στον δικό μου κώδικα το ότι έχω αφήσει un-initialized την data όπως την είχε ο King, ενδέχεται να δημιουργήσει πρόβλημα σε κάποιες περιπτώσεις bad-input, αλλά βαριέμαι τώρα να το τσεκάρω ενδελεχώς... αρχικοποίησέ την κι αυτή σε 0 καλού-κακού). 1
Antonis3d Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 παιδια λιγη βοηθεια αν μπορειτε γιατι τα εχω κανει σαλατα με ενα προγραμματακι. η δουλεια του ειναι να παταει ο χρηστης διαφορα συμβολακια και αναλογα με πιο συμβολο παταει να κανει την αντιστοιχη πραξη σε 2 ακεραιους που επισης παταει ο χρηστης >#include <stdio.h> #include <math.h> int prosthesi(int a , int b ); int afairesi(int a , int b ); int mult(int a , int b ); float diairesi(int a , int ; int min(int a , int b ); int max(int a , int b ); int main() { int a, b; char epilogi; printf("Παρακαλώ πληκτρολογήστε:\n+. για Πρόσθεση\n‐. για Αφαίρεση \n*. για Πολλαπλασιασμό \n/.για Διαίρεση \n^. για τον Υπολογισμό της δύναμης(π.χ. α^β) \n<. για τον Υπολογισμό του ελάχιστουδύο τιμών \n>. για τον Υπολογισμό του μέγιστουδύο τιμών \ne. για Έξοδο από το πρόγραμμα\n"); scanf("%s",&epilogi); while(epilogi!='e') { printf("Δώσε 2 ακέραιoυς.\n"); scanf("%d%d",&a,&; if (epilogi == '+') { int apotelesma; apotelesma = prosthesi(a, ; printf("το %d+%d είναι ίσο με %d\n",a,b,apotelesma); } else if (epilogi == '-') { int apotelesma; apotelesma = afairesi(a, ; printf("το %d-%d είναι ίσο με %d\n",a,b,apotelesma); } else if (epilogi == '*') { int apotelesma; apotelesma = mult(a, ; printf("το %d*%d είναι ίσο με %d\n",a,b,apotelesma); } else if (epilogi == '/') { if (b==0) { printf("Αδύνατη διαίρεση!\n"); } else { float apotelesma; apotelesma = diairesi(a, ; printf("το %d/%d είναι ίσο με %.2f\n",a,b,apotelesma); } } else if (epilogi == '^') { double apotelesma; apotelesma = pow(a, ; printf("το %d^%d είναι ίσο με %.0lf\n",a,b,apotelesma); } else if (epilogi == '<') { int apotelesma; apotelesma = min(a, ; printf("το ελάχιστο μεταξύ %d και %d είναι το %d\n",a,b,apotelesma); } else if (epilogi == '>') { int apotelesma; apotelesma = max(a, ; printf("το μέγιστο μεταξύ %d και %d είναι το %d\n",a,b,apotelesma); } else if(epilogi != 'e') { printf("Οι επιλογές είναι +,-,*,<,>,^,/,e\n"); } printf("Παρακαλώ πληκτρολογήστε:\n+. για Πρόσθεση\n‐. για Αφαίρεση \n*. για Πολλαπλασιασμό \n/.για Διαίρεση \n^. για τον Υπολογισμό της δύναμης(π.χ. α^β) \n<. για τον Υπολογισμό του ελάχιστουδύο τιμών \n>. για τον Υπολογισμό του μέγιστουδύο τιμών \ne. για Έξοδο από το πρόγραμμα\n"); scanf("%s",&epilogi); } return 0; } int prosthesi(int a , int b ); { return a+b; } int afairesi(int a , int b ); { return a-b; } int mult(int a , int b ); { return a*b; } float diairesi(int a, int b ); { return a/b; } int max(int a, int ; { if (a> { return a; } else { return b; } } int min(int a, int ; { if (a< { return a; } else { return b; } Αν μπορειτε να με βοηθησετε παιδια θα σας ειμαι ευγνωμων! EDIT: Παιδια τα καταφερα! Δεν υπαρχει η ευχαριστιση που νιωθεις οταν δεν βγαζει σφαλματα!!!
Star_Light Δημοσ. 13 Δεκεμβρίου 2012 Δημοσ. 13 Δεκεμβρίου 2012 > scanf("%s",&epilogi); Η μεταβλητή epilogi ειναι τύπου char ενω εσυ βάζεις την scanf να αναμένει string (%s) . > To ερωτηματικό στο τέλος της επικεφαλιδας της συνάρτησης μπαινει μονο στα προτυπα και οχι οταν πας να την γράψεις. > Για ποιο λογο δηλώνεις κάθε φορα την apotelesma με περιορισμενη εμβέλεια? > Ωραίο το return a+b ; στο τέλος για αρχάριο... συνηθως βάζουν sum = a+b; και μετά return sum; Γιατι δεν γράφεις την συνάρτηση του μέγιστου αλλα και ελάχιστου έτσι > int max(int a, int { return a > b ? a : b; } Αν το a ειναι μεγαλύτερο του b έχεις a αλλιώς εχεις b. Γλιτώνεις απο if / else καθως και απο τις αγκυλες... Εγω το εχω ξαναγραψει ειμαι κατα των αγκυλων οταν το σώμα μιας συνθήκης ειναι μονο μια εντολη τα braces ειναι optional. Ο λογος ειναι οτι να για παραδειγμα τωρα ξέφυγε ενα καθως τα έγραφες και ειχα compilation error αν ο κώδικας ειναι καμποσες γραμμες γιατι να φάω τα ματια και τον χρονο μου ψάχνοντας ένα τέτοιο error? 1
migf1 Δημοσ. 14 Δεκεμβρίου 2012 Δημοσ. 14 Δεκεμβρίου 2012 ... EDIT: Παιδια τα καταφερα! Δεν υπαρχει η ευχαριστιση που νιωθεις οταν δεν βγαζει σφαλματα!!! Χεχε, όντως. Έχεις λαθάκια βέβαια μέσα, όπως τα ; που σου είπε και ο StarLight, καθώς επίσης και τα γνωστά προβλήματα της scanf() με το line-buffering. Μπορείς επίσης να συμπτύξεις αρκετά την main() σου. Δεν ξέρω τι έχετε μάθετε και τι όχι, αλλά προσπάθησα να μη σου αλλάξω τελείως τον κώδικά σου, για να μπορέσεις να το παρακολουθήσεις πιο εύκολα... > #include <stdio.h> #include <string.h> #include <math.h> // Εντολές Προεπεξεργαστή #define MAXINPUT (255+1) #define COMMANDS "+-*/^<>e" // Πρότυπα Συναρτήσεων char menu( void ); int prosthesi( int x, int y ); int afairesi( int x, int y ); int mult( int x, int y ); float diairesi( int x , int y); int min(int x, int y ); int max(int x, int y ); // Ορισμοί Συναρτήσεων /* ------------------------------------------------------- */ int main( void ) { int x, y; char input[MAXINPUT] = {'\0'}; while ( 1 ) // ατέρμονας βρόγχος { char epilogi = menu(); if ( 'e' == epilogi ) break; if ( !strchr(COMMANDS, epilogi) ) { printf( "*** Οι επιλογές είναι: %s\n", COMMANDS ); continue; } printf( "Δώσε 2 ακέραιoυς: " ); fgets( input, MAXINPUT, stdin ); sscanf( input, "%d %d", &x, &y ); if ( '+' == epilogi ) { printf( "το %d+%d είναι ίσο με %d\n", x, y, prosthesi(x, y) ); } else if ( '-' == epilogi ) { printf( "το %d-%d είναι ίσο με %d\n", x, y, afairesi(x, y) ); } else if ( '*' == epilogi ) { printf("το %d*%d είναι ίσο με %d\n", x, y, mult(x, y) ); } else if ( '/' == epilogi ) { if ( 0 == y ) puts( "*** Αδύνατη διαίρεση!" ); else printf("το %d/%d είναι ίσο με %.2f\n", x, y, diairesi(x, y) ); } else if ( '^' == epilogi ) { printf("το %d^%d είναι ίσο με %.0lf\n", x, y, pow(x, y) ); } else if ( '<' == epilogi ) { printf("το ελάχιστο μεταξύ %d και %d είναι το %d\n", x, y, min(x, y) ); } else if ( '>' == epilogi ) { printf("το μέγιστο μεταξύ %d και %d είναι το %d\n", x, y, max(x, y)); } } return 0; } /* ------------------------------------------------------- */ char menu( void ) { char input[MAXINPUT] = {'\0'}; puts( "\nΠαρακαλώ πληκτρολογήστε:" ); puts( "+. για Πρόσθεση" ); puts( "-. για Αφαίρεση" ); puts( "*. για Πολλαπλασιασμό" ); puts( "/. για Διαίρεση" ); puts( "^. για τον Υπολογισμό της δύναμης(π.χ. x^y)" ); puts( "<. για τον Υπολογισμό του ελάχιστου δύο τιμών" ); puts( ">. για τον Υπολογισμό του μέγιστου δύο τιμών" ); puts( "e. για Έξοδο από το πρόγραμμα" ); fgets( input, MAXINPUT, stdin ); return input[0]; } /* ------------------------------------------------------- */ int prosthesi(int x, int y) { return x + y; } int afairesi(int x, int y) { return x - y; } int mult(int x, int y) { return x * y; } float diairesi(int x, int y) { return x / y; } /* ------------------------------------------------------- */ int max( int x, int y ) { if ( x > y ) return x; return y; } /* ------------------------------------------------------- */ int min( int x, int y ) { if ( x < y ) return x; return y; } 1
Προτεινόμενες αναρτήσεις