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

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

Δημοσ.

...

κανα καλο γρηγορο παραδειγμα και

επεξηγηση για την sprintf έχεις ???? έχω ζαλιστει .....

 

Yeap, την τεκμηρίωσή της στον gcc.

 

p.s Παντως οταν ευκαιρησεις δες λιγο τον κωδικα.....

 

Δεν το υπόσχομαι, τουλάχιστον για σήμερα.

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

...

p.s Παντως οταν ευκαιρησεις δες λιγο τον κωδικα.....

 

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

Δημοσ.

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

 

migf1 δεν ξερω αμα έχω πετυχει την στοίχιση που θές :P

μαλλον δεν την εχω πετυχει....

 

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 ναι το βλεπω αυτο που λες..... τον κώδικα τον έχω πάρει απο τον 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η έκδοση και την τεκμηρίωσή της, θα το αναφέρω στο σχετικό νήμα.

Δημοσ.

@μιγφ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 κωδικας που παραθέτεις βέβαια δουλεύει διορθώνοντας το παραπανω προβλημα.

Δημοσ.

 

...

(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?

 

(ρε συ, γράφε πιο σαφή μηνύματα... μη βαριέσαι :lol:)

 

...

Mε αλλα λογια δηλαδη γινεται πανικος στην έξοδο.... αυτο βεβαια επειδη μεσα στην συναρτηση έχει βαλει την getchar() απο οσο υποψιαζομαι και μαλλον υποψιαζομαι σωστα.

...

 

Λογικά δεν έχει σχέση η getchar() αλλά το ότι χρησιμοποιεί strcpy() αντί για strncpy().

 

 

Δημοσ.

@migf1 εχω την εντυπωση οτι οι αρχικοποιήσεις που κάνεις στα strings δεν χρειάζονται εκτος και αν θες να εισαι 100% τυπικος...

πχ σε τι χρειαζεται να αρχικοποιήσεις σε '\0' τον

input ? αφου ουτως η άλλως θα κανει αυτη την δουλεια η συνάρτηση read_line ... επισης για ποιο λογο

να αρχικοποιήσεις το str_Day εφοσον αυτη την δουλεια θα την κάνει και παλι αυτοματα η sprintf κοτσάροντας στο τελός εναν null character....

 

O Κινγκ ολους αυτους δεν τους αρχικοποιει εξαρχης.....

Δημοσ.

@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 αν χρειάζεται, οπότε καθαρίσαμε με αυτό (παρεμπιπτόντως, ήταν ωραίο ήταν το Αν του Παπακαλλιάτη, δεν το περίμανα :lol:)

 

Η 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.

Δημοσ.

Α. Εννοεις δηλαδη οτι μπορει να ξεχαστείς γενικά να αρχικοποιήσεις το s.....

παρακατω στο προγραμμα.... οποτε θα έχει τιμές "σκουπιδια" μεσα του.

Δημοσ.

Ναι, το ίδιο ισχύει για όλες τις μεταβλητές (δλδ όχι μόνο για τα strings)... π.χ. νομίζω πως και στον δικό μου κώδικα το ότι έχω αφήσει un-initialized την data όπως την είχε ο King, ενδέχεται να δημιουργήσει πρόβλημα σε κάποιες περιπτώσεις bad-input, αλλά βαριέμαι τώρα να το τσεκάρω ενδελεχώς... αρχικοποίησέ την κι αυτή σε 0 καλού-κακού).

  • Like 1
Δημοσ.

παιδια λιγη βοηθεια αν μπορειτε γιατι τα εχω κανει σαλατα με ενα προγραμματακι.

 

η δουλεια του ειναι να παταει ο χρηστης διαφορα συμβολακια και αναλογα με πιο συμβολο παταει να κανει την αντιστοιχη πραξη σε 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: Παιδια τα καταφερα! Δεν υπαρχει η ευχαριστιση που νιωθεις οταν δεν βγαζει σφαλματα!!! :D

Δημοσ.

>
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?

  • Like 1
Δημοσ.

...

EDIT: Παιδια τα καταφερα! Δεν υπαρχει η ευχαριστιση που νιωθεις οταν δεν βγαζει σφαλματα!!! :D

 

Χεχε, όντως.

 

Έχεις λαθάκια βέβαια μέσα, όπως τα ; που σου είπε και ο 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;
}

 

 

  • Like 1
Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...