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

Βοήθεια σε άσκηση με string


mariamx83

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

Καλησπέρα , έχω να κάνω την εξής άσκηση :

Να γράψετε πρόγραμμα σε γλώσσα C, που να ζητάει έναν οποιοδήποτε αριθμό (ακέραιο ή δεκαδικό (με τελεία)) και να τον εκτυπώνει αφού πρώτα ελέγξει ότι είναι όντως αριθμός και τίποτα άλλο. Επιτρέπεται μόνο το πρόσημο + ή – μπροστά από τον αριθμό προαιρετικά. Σε περίπτωση λάθους το πρόγραμμα θα ενημερώνει το χρήση με κατάλληλο μήνυμα και θα ξαναζητά την εισαγωγή αριθμού, ώσπου ο πελάτης να δώσει σωστή είσοδο. Μόλις εκτυπωθεί ο αριθμός, το πρόγραμμα θα τερματίζει.

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

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

2 λεπτά πριν, Kercyn είπε

Καλησπέρα! Τι έχεις κάνει μέχρι τώρα;

αυτό απ οτι βλέπω είναι με δείκτες και δεν εχουμε διδαχτει ακομη

 

int main()
{
    system("CHCP 1253");
    system("CLS");
    
   char arith;
    char str = 'arith';
    
   printf("Δώσε έναν αριθμό:\n");
    scanf("%c",&arith);
   
   do
   {
   if(isdigit(arith)==0)
   
       
   
    {
       printf("Δεν δώσατε αριθμό! Προσπαθήστε ξανά!");
      system("PAUSE");
      return 0;
     }
   else
    
     {
       printf("Ο αριθμός που δώσατε είναι ο :%c\n",arith);
       break;
    } getch();
   }while(arith!= isdigit(arith));
   
    
    
    
    
    system("PAUSE");
    return 0;
}

 

αυτος ειναι ο κωδικας μου , δουλευει αλλα δεν ξερω πως να κανω να δεχετε το + και το - , επίσης δεν δουλευει και σωστα η loop

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

  • Moderators

Αυτό που σου ζητάει δε γίνεται χωρίς pointers. Πρώτα πρέπει να διαβάσεις ένα string, το οποίο στη C είναι ένας πίνακας από χαρακτήρες με το χαρακτήρα \0 στο τέλος. Στη συνέχεια, πρέπει να προσπελάσεις κάθε χαρακτήρα αυτού του string και να αποφασίσεις αν είναι αποδεκτός χαρακτήρας και σε αποδεκτή θέση (δηλαδή, ο χαρακτήρας '+' είναι αποδεκτός, αλλά μόνον αν βρίσκεται στην πρώτη θέση του πίνακά σου). Με κάθε επιφύλαξη (γιατί δεν ξέρω C) και θεωρώντας ότι η άσκηση είναι στα πλαίσια μαθήματος μικρού εξαμήνου σε κάποια σχολή, δε νομίζω ότι οι διαφορές ενός array με έναν pointer αποτελούν αντικείμενο του μαθήματος σου, άρα αν δεν έχετε κάνει pointers μέχρι τώρα δε μπορώ να φανταστώ τρόπο για να λυθεί.

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

  • Moderators

Δώσε μου λίγη ώρα μπας και φτιάξω λίγο μια υποτυπώδη λύση.

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

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void) {
	char number[100];
	int isNumberValid;
	int hasEncounteredDot = 0;
	char currentChar;
	
	do {
		scanf("%s", number);
		for (int i = 0; i < strlen(number); i++) {
			currentChar = number[i];
			if (
				!isdigit(currentChar)
				&& (currentChar != '+')
				&& (currentChar != '-')
				&& (currentChar != '.')
			) {
				isNumberValid = 0;
				break;
			}
			
			if (
				currentChar == '.'
			) {
				if (hasEncounteredDot) {
					isNumberValid = 0;
					break;
				} else {
					hasEncounteredDot = 1;
				}
			}
			
			if (
				i != 0
				&& (
					currentChar == '+'
					|| currentChar == '-'
				)
			) {
				isNumberValid = 0;
				break;
			}
			
			isNumberValid = 1;
		}
	} while (!isNumberValid);
	
	printf("%s\n", number);
	
	return 0;
}

 

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

δεν εχει πουθενα input και output αριθμου.. το ετρεξα αλλα βγαζει κενη οθονη

40 λεπτά πριν, Kercyn είπε

Δώσε μου λίγη ώρα μπας και φτιάξω λίγο μια υποτυπώδη λύση.

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


#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void) {
	char number[100];
	int isNumberValid;
	int hasEncounteredDot = 0;
	char currentChar;
	
	do {
		scanf("%s", number);
		for (int i = 0; i < strlen(number); i++) {
			currentChar = number[i];
			if (
				!isdigit(currentChar)
				&& (currentChar != '+')
				&& (currentChar != '-')
				&& (currentChar != '.')
			) {
				isNumberValid = 0;
				break;
			}
			
			if (
				currentChar == '.'
			) {
				if (hasEncounteredDot) {
					isNumberValid = 0;
					break;
				} else {
					hasEncounteredDot = 1;
				}
			}
			
			if (
				i != 0
				&& (
					currentChar == '+'
					|| currentChar == '-'
				)
			) {
				isNumberValid = 0;
				break;
			}
			
			isNumberValid = 1;
		}
	} while (!isNumberValid);
	
	printf("%s\n", number);
	
	return 0;
}

 

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

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

  • Moderators

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

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

Δεν ξερω πως προεκυψε ο τιτλος string. Διαβαζοντας ομως την ασκηση ειναι σαν να διαβαζω το documentation της scanf

Floating point number A series of decimal digits, optionally containing a decimal point, optionally preceeded by a sign (+ or -) and optionally followed by the e or E character and a decimal integer (or some of the other sequences supported by strtod).
Implementations complying with C99 also support hexadecimal floating-point format when preceded by 0x or 0X.
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

sscanf έχετε μάθει;

#include <stdio.h>                                                              
                                                                                
int main(void)                                                                  
{                                                                               
        char number[100];                                                       
        int isNumberValid = 1;                                                  
        float f = 0;                                                            
                                                                                
        do {                                                                    
                scanf("%s", number);                                            
                isNumberValid = sscanf(number, "%f", &f);                       
                if (!isNumberValid)                                             
                        printf("Den edoses swsto arithmo\n");                   
        } while (!isNumberValid);                                               
                                                                                
        printf("Number = %f", f);                                               
                                                                                
        return 0;                                                               
}                                            

Σίγουρα η άσκηση εννοεί να υλοποιήσεις εσύ τον έλεγχο όπως σου έδειξε ο Kercyn αλλά εναλλακτικά θα μπορούσε να γίνει μέσω της sscanf (και πολλών άλλων συναρτήσεων) όπως φαίνεται παραπάνω.

Η sscanf κάνει ό,τι και η scanf αλλά αντί να δέχεται είσοδο από τον χρήστη, χρησιμοποιεί ένα "string". Οπότε η παραπάνω εντολή λέει πάρε την συμβολοσειρά number και δες αν μπορείς να την ερμηνεύσεις σαν float (οπότε καλύπτονται με την μία το πρόσημο, η τελεία, το αν το υπόλοιπο είναι αριθμός, κτλ). Αν είναι αριθμός, το αποτέλεσμα αποθηκεύεται στην μεταβλητή f. Στην μεταβλητή isNumberValid επιστρέφεται το σε πόσες μεταβλητές τέθηκε σωστά τιμή δηλαδή στην περίπτωση μας ή 1 ή 0. Αν δεν έχει δωθεί αριθμός, τότε θα ξανατρέξει το σώμα του do.

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

4 ώρες πριν, imitheos είπε

sscanf έχετε μάθει;


#include <stdio.h>                                                              
                                                                                
int main(void)                                                                  
{                                                                               
        char number[100];                                                       
        int isNumberValid = 1;                                                  
        float f = 0;                                                            
                                                                                
        do {                                                                    
                scanf("%s", number);                                            
                isNumberValid = sscanf(number, "%f", &f);                       
                if (!isNumberValid)                                             
                        printf("Den edoses swsto arithmo\n");                   
        } while (!isNumberValid);                                               
                                                                                
        printf("Number = %f", f);                                               
                                                                                
        return 0;                                                               
}                                            

Σίγουρα η άσκηση εννοεί να υλοποιήσεις εσύ τον έλεγχο όπως σου έδειξε ο Kercyn αλλά εναλλακτικά θα μπορούσε να γίνει μέσω της sscanf (και πολλών άλλων συναρτήσεων) όπως φαίνεται παραπάνω.

Η sscanf κάνει ό,τι και η scanf αλλά αντί να δέχεται είσοδο από τον χρήστη, χρησιμοποιεί ένα "string". Οπότε η παραπάνω εντολή λέει πάρε την συμβολοσειρά number και δες αν μπορείς να την ερμηνεύσεις σαν float (οπότε καλύπτονται με την μία το πρόσημο, η τελεία, το αν το υπόλοιπο είναι αριθμός, κτλ). Αν είναι αριθμός, το αποτέλεσμα αποθηκεύεται στην μεταβλητή f. Στην μεταβλητή isNumberValid επιστρέφεται το σε πόσες μεταβλητές τέθηκε σωστά τιμή δηλαδή στην περίπτωση μας ή 1 ή 0. Αν δεν έχει δωθεί αριθμός, τότε θα ξανατρέξει το σώμα του do.

Αυτό ή απλά int isvalidnumber = scanf("%f", &number), γιατί όπως είπα παραπάνω η άσκηση δεν λέει πουθενά για string και μάλλον πρόκειται για επιννόηση του ερωτώντα. 

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

Δημοσ. (επεξεργασμένο)
1 ώρα πριν, k33theod είπε

Αυτό ή απλά int isvalidnumber = scanf("%f", &number), γιατί όπως είπα παραπάνω η άσκηση δεν λέει πουθενά για string και μάλλον πρόκειται για επιννόηση του ερωτώντα. 

Σωστά. Η εκφώνηση δεν λέει string. Ο Kercyn ήταν αυτός που ανέφερε string και μου τυπώθηκε και εμένα στο μυαλό ότι θέλει string.

Πάντως νομίζω πως 99% εννοεί την λύση του Kercyn δηλαδή να υλοποιήσουν τον έλεγχο οι ίδιοι. Δεν μου φαίνεται να εννοεί αυτό που είπαμε εμείς, αφενός γιατί τότε δεν είναι άσκηση αλλά 4 γραμμές, αφετέρου γιατί αναφέρει κανόνες τύπου "επιτρέπεται μόνο το πρόσημο". Η συμπεριφορά των *scanf, strto*, κτλ είναι φιξ οπότε δεν θα χρειαζόταν να αναφέρει τι επιτρέπεται και τι όχι.

20 ώρες πριν, Kercyn είπε

Αυτό που σου ζητάει δε γίνεται χωρίς pointers. Πρώτα πρέπει να διαβάσεις ένα string, το οποίο στη C είναι ένας πίνακας από χαρακτήρες με το χαρακτήρα \0 στο τέλος.

Τυπικά, λύνεται μια χαρά χωρίς δείκτες και πίνακες αν παίξεις με ένα-ένα χαρακτήρα με συναρτήσεις τύπου getc, fgetc, κτλ αλλά είναι λίγο πιο μανούρα από το να δεχτείς ολόκληρο το string με scanf, fgets, κτλ.

20 ώρες πριν, Kercyn είπε

Με κάθε επιφύλαξη (γιατί δεν ξέρω C)

Προτείνω στους mods 10μερο ban από το φόρουμ 😛 Γιατί ρε να μην ξέρεις C; Τώρα ειδικά με την καραντίνα να κάτσεις να μάθεις 😛 και να ποστάρεις εδώ να συζητάμε να περνάει η ώρα. Πάνε αιώνες από τότε που είχαμε το νήμα της C.

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

To string αναφέρεται στον τίτλο του post και είναι πιθανόν ο ερωτών να  είναι σε κεφάλαιο με strings να ερμήνευσε λάθος την άσκηση. 

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

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

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

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

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

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

Σύνδεση

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

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