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

Εργασία σε C


Nereus

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

Δημοσ.

Καλησπέρα.

Αυτο τον καίρο εχω μια εργασία στη σχολή σε C. Ειναι η πρώτη φορα που γράφω ενα πρόγραμμα και δεν εχω πείρα.Το πρόγραμμα άρχικά δέχεται καποιες αριθμητικές τιμες (ακέραιες) με τις οποίες μετα κανει ορισμένες πράξεις.Βασικά το πρόγραμμα το έχω γράψει.

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

 

καμιά ιδέα? :confused:

 

Please.

Δημοσ.

Μπορεις να δεχεσαι input αρχικα οχι μονο αριθμους αλλα χαρακτηρες γενικα. Μετα να ελεγχεις αν οι χαρακτηρες ειναι οντως μεταξυ 0-9 και αν ειναι προχωρας παρα περα. Δηλαδη μετα να αποσπασεις την τιμη του αριθμου χρησιμοποιωντας αυτους τους χαρακτηρες και να κανεις τις πραξεις σου.

 

Δεν ξερω C για να σου πω πιο πολλες λεπτομερειες. Σε αλλες γλωσσες αυτη η διαδικασια ειναι αλλοτε πιο ευκολη και αλλοτε πιο δυσκολη. Παντως μια καλη αρχη ειναι να αρχισεις να ψαχνεις το reference της γλωσσας και τις βασικες ετοιμες συναρτησεις που διαθετει και σιγουρα θα βρεις κατι. Φυσικα οποισδηποτε ξερει βασικη C μπορει να σου το λυσει αμεσως αλλα ισως αξιζει να το ψαξεις λιγο μονος σου στην αρχη

Δημοσ.

Παρόλα αυτά πιστεύω ότι αν χρησιμοποιείς την scanf δεν έχεις παρά να διαβάσεις προσεκτικά την χρήση της. Για διευκόλυνση και ξεκαθάρισμα των νέων γνώσεων ξεκίνα το διάβασμα από την printf. Και αν έχεις απορίες...

Δημοσ.

Eftiaksa kati proxeiro kai vlepo oti douleuei

 

int main()

{

int x;

if(scanf("%d",&x)!= NULL)

printf("%d\n",x);

else

printf("not an integer\n");

return 0;

}

 

H scanf an den parei to orisma ston typo pou theleis epistrefei NULL.

Δημοσ.
Γι΄αυτο που θελεις δεν κανει η scanf, μολις εχω ελευθερο χρονο θα σου γραψω κατι...Ποτε ειναι να παραδοθει η ασκηση????

 

Μεχρι τέλος Οκτωβρίου.:|

Δημοσ.
Eftiaksa kati proxeiro kai vlepo oti douleuei

 

int main()

{

int x;

if(scanf("%d",&x)!= NULL)

printf("%d\n",x);

else

printf("not an integer\n");

return 0;

}

 

H scanf an den parei to orisma ston typo pou theleis epistrefei NULL.

 

Paidia h scanf επιστρεφει το ΠΛΗΘΟΣ των ορισματων που διαβασε. ΔΕΝ επιστρεφει pointer!! Προσοχη..

Πρεπει απλα να διαβασουμε string me thn gets(temp) kai meta arithmos=atoi(temp);

Ta leme...

Δημοσ.
Paidia h scanf επιστρεφει το ΠΛΗΘΟΣ των ορισματων που διαβασε. ΔΕΝ επιστρεφει pointer!! Προσοχη..

Πρεπει απλα να διαβασουμε string me thn gets(temp) kai meta arithmos=atoi(temp);

Ta leme...

 

Θα το δοκημάσω:mrgreen:

Δημοσ.

Ο παρακάτω κώδικας, γραμμένος σε Borland C/C++ Builder 6.0, ελέγχει για το εάν η είσοδος του χρήστη περιέχει μόνο αριθμητικές ή και άλλου είδους τιμές.

 

Τούτο καθίσταται εφικτό με την χρήση της C ρουτίνας isdigit η οποία ελέγχει κάθε ASCII χαρακτήρα της εισόδου μας επιστρέφοντας 0 όταν κάποιος χαρακτήρας δεν είναι αριθμητικός.

 

Ο παραπάνω έλεγχος υλοποιείται συνολικά από την ρουτίνα μας _TrueNumber η οποία επιστρέφει 1 εάν η είσοδος μας είναι αριθμητική (οπότε ο βρόχος εισαγωγής της τιμής διακόπτεται) ή μηδέν εάν όχι.

 

Υ.Γ.

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

 

>
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
//---------------------------------------------------------------------------
char  szUserInput[128];
//---------------------------------------------------------------------------
int   _TrueNumber(char *pszBuffer);
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
  for(;
   {
     printf(" Enter number:"); gets(szUserInput);
     if(!_TrueNumber(szUserInput))
      printf(" Incorrect input - %s\n",szUserInput);
     else
      break;
   }

  printf(" Our Number = %d\nPlease hit any key to quit..",atoi(szUserInput));

  getch();
  return 0;
}
//---------------------------------------------------------------------------
int   _TrueNumber(char *pszBuffer)
{
  int   nUserInputIdx;
  
  for(nUserInputIdx=0;nUserInputIdx<strlen(pszBuffer);nUserInputIdx++)
   if(!isdigit(pszBuffer[nUserInputIdx]))
    return 0;

  return 1;
}

 

Καλή τύχη!

Δημοσ.

Η gets() είναι επικίνδυνη (δεν ελέγχει πόσο διαβάζει). Η καλύτερη εναλλακτική είναι η fgets(), που δέχεται το μέγεθος του temporary buffer.

 

Επιπλέον, η atoi() αν δει κάποιο χαρακτήρα δεν επιστρέφει μήνυμα λάθους - το πολύ πολύ να σου δώσει ένα 0 σαν τιμή επιστροφής.

 

Το καλύτερο που μπορείς να κάνεις είναι το εξής:

>
int c;
int n = 0;
/* read input, stop when you encountered EOF or enter */
for (c = getchar(); c!=EOF && c!='\r' && c!='\n'; c = getchar())
{
 if (!isdigit(c))
 {
   /* error - you must only use numbers */
 }
 n *= 10;
 n += c - '0'; // works only with systems that digit are continuous
}

Δημοσ.
Nereus, Σου εστειλα ΠΜ......

 

Το διάβασα.:mrgreen:

 

1. αν ο χρήστης εισάγει στην num το 0 το πρόγραμμα λέει οτι δεν έχει εισαχθεί ακέραιος.:-?

 

2. Σε μια απο τις άσκησεις που έχω ο χρήστης θα πρέπει να εισάγει 2 τιμές οι οποίες να χωρίζονται με space. Δηλαδη έχω γράψει scanf("%d %d"&a,&B). Δεν ξέρω πως σε αυτό χρησημοποιήται η gets().

Πάντως στις άλλες δύο ασκήσεις η gets() θα βοηθάει.:-D

 

 

Όσο για τις πρότασεις του Directx και του dop θα τις δοκιμάσω αύριο.

Αρχειοθετημένο

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

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