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

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

Δημοσ.
#include <stdio.h>

#include <stdlib.h>

 

int main(void)

{      

int i,j;

  float ma,kma,f,fo,kmao;

  char onoma[40];          

  fo=0;

  kmao=0;

  for(i=1;i<=3;i++)

                 {

  printf("dwse to onomateponimo tou upalilou\n");

          scanf("%s",onoma);    

  do    

  {

                 printf("dwse to miniaio poso apodoxwn tou upalilou pliktrologontas apo 0 ews 3000 euro\n");

                 scanf("%f",&ma);

                 }while(ma>=3000);

                 if(ma<=700)

                 {

                            f=0*ma;

                            kma=ma-f;

                 printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma);

                 

                 }

                 else if(ma<=1000)

                 {

                 f=0.15*ma;

                 kma=ma-f;

                 printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma);

                 }

                 else if(ma>1000)

                 {

                 f=0.03*ma;

                 kma=ma-f;

                 printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma);

                 }

                 fo=fo+f;

                 kmao=kmao+kma;

                 j=j=1;

                 

                 }

                 printf("to sunoliko poso twn forwn olwn einai %.2f kai to sunoliko poso twn katharwn miniaiwn apodoxwn olwn einai %.2f\n",fo,kmao);

  system("PAUSE");

  return 0;

}

 

Δημοσ.

Βάζεις διπλή μεταβλητή εντός του scanf

 

Δες και τρεξε το παρακατω. Επισης οταν βαζεις κωδικα στο forum, βαζε το σε code tag

 

 

int main()
{      
int i,j;
  float ma,kma,f,fo,kmao;
  char onoma[40],eponimo[40];          
  fo=0;
  kmao=0;
  for(i=1;i<=3;i++)
                 {
  printf("dwse to onomateponimo tou upalilou %d : ",i);
          scanf("%s%s",&onoma,&eponimo);    
  do    
  {
                 printf("\ndwse to miniaio poso apodoxwn tou upalilou (0-3000) : ");
                 scanf("%f",&ma);
                 }while(ma>=3000);
                 if(ma<=700)
                 {
                            f=0*ma;
                            kma=ma-f;
                 printf("\no %s %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,eponimo,ma,f,kma);
                 
                 }
                 else if(ma<=1000)
                 {
                 f=0.15*ma;
                 kma=ma-f;
                 printf("\no %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma);
                 }
                 else if(ma>1000)
                 {
                 f=0.03*ma;
                 kma=ma-f;
                 printf("\no %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma);
                 }
                 fo=fo+f;
                 kmao=kmao+kma;
                 j=j=1;
                 printf("\n=================================================\n");
                 }
                 printf("to sunoliko poso twn forwn olwn einai %.2f \nkai to sunoliko poso twn katharwn miniaiwn apodoxwn olwn einai %.2f\n",fo,kmao);
  system("PAUSE");
  return 0;
}
 
  • Like 1
Δημοσ.

int main()
{
int i,j;
float ma,kma,f,fo,kmao;
char onoma[40],eponimo[40];
fo=0;
kmao=0;
for(i=1;i<=3;i++)
{
printf("dwse to onomateponimo tou upalilou %d : ",i);
scanf("%s%s",&onoma,&eponimo);
do
{
printf("\ndwse to miniaio poso apodoxwn tou upalilou (0-3000) : ");
scanf("%f",&ma);
}while(ma>=3000);
if(ma<=700)
{
f=0*ma;
kma=ma-f;
printf("\no %s %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,eponimo,ma,f,kma);

}
else if(ma<=1000)
{
f=0.15*ma;
kma=ma-f;
printf("\no %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma);
}
else if(ma>1000)
{
f=0.03*ma;
kma=ma-f;
printf("\no %s exei miniaies apodoxes %.2f, foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma);
}
fo=fo+f;
kmao=kmao+kma;
j=j=1;
printf("\n=================================================\n");
}
printf("to sunoliko poso twn forwn olwn einai %.2f \nkai to sunoliko poso twn katharwn miniaiwn apodoxwn olwn einai %.2f\n",fo,kmao);
system("PAUSE");
return 0;
}

Δημοσ.

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

 

s Matches a sequence of non-white-space characters; the next

pointer must be a pointer to character array that is long enough

to hold the input sequence and the terminating null byte ('\0'),

which is added automatically. The input string stops at white

space or at the maximum field width, whichever occurs first

Δηλαδή όταν χρησιμοποιείς το format %s του λες να διαβάζει μέχρι το πρώτο κενό. Η βοήθεια επίσης περιέχει παρακάτω

[ Matches a nonempty sequence of characters from the specified set

of accepted characters; ..... The string is to be made up

of characters in (or not in) a particular set; the set is

defined by the characters between the open bracket [ character

and a close bracket ] character. The set excludes those charac‐

ters if the first character after the open bracket is a circum‐

flex (^).

Δηλαδή με την αγκύλη ορίζουμε ένα σετ χαρακτήρων που θέλουμε να διαβάζει η scanf οπότε αν χρησιμοποιήσουμε για παράδειγμα "%[^\n]" (ή κάποια από τις πολλές παραλλαγές που δίνει το google στην ερώτηση "scanf string spaces" το οποίο προφανώς δεν έκανες) θα διαβάζει τα πάντα εκτός από τον "χαρακτήρα" αλλαγής γραμμής οπότε θα διαβάζει ολόκληρο το string που έχει δώσει ο χρήστης μαζί με τα κενά, tabs, οτιδήποτε. Σημειωτέον πως, όπως και το %s, αυτό που έγραψα δεν λαμβάνει μέτρα για να μην ξεπεράσει το μέγεθος 40 του πίνακα.

  • Like 1
Δημοσ.

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

Δημοσ.

....

Δηλαδή με την αγκύλη ορίζουμε ένα σετ χαρακτήρων που θέλουμε να διαβάζει η scanf οπότε αν χρησιμοποιήσουμε για παράδειγμα "%[^\n]" (ή κάποια από τις πολλές παραλλαγές που δίνει το google στην ερώτηση "scanf string spaces" το οποίο προφανώς δεν έκανες) θα διαβάζει τα πάντα εκτός από τον "χαρακτήρα" αλλαγής γραμμής οπότε θα διαβάζει ολόκληρο το string που έχει δώσει ο χρήστης μαζί με τα κενά, tabs, οτιδήποτε. Σημειωτέον πως, όπως και το %s, αυτό που έγραψα δεν λαμβάνει μέτρα για να μην ξεπεράσει το μέγεθος 40 του πίνακα.

 

 

Δεν έχω ασχοληθεί με Regex στην C/C++, οπότε αυτό που δείχνεις μπορούμε να πούμε ότι είναι κάτι σαν Expression.

 

Γενικά η scanf(...) βλέπω ότι έχει μεγάλη δύναμη σε αντίθεση με την Console.Read() στην C#

 

εκτός αν και η Console.Read() έχει κάτι αντίστοιχο (δεν το έχω ψάξει)...

Δημοσ.

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

 

 

Τι εννοείς δεν δουλεύει με αυτό τον τρόπο; Με τον τρόπο που λέει η function ότι δουλεύει (και παραθέτει ο imetheos) τελικά δεν δουλεύει; Μας κοροϊδεύει η function και το help της; Και το ανακάλυψες εσύ, πού ούτε την σύνταξή δεν παλεύεις καλά καλά, ένα βράδυ στο insomnia; 

 

Δημοσ.

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

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

 

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

 

Δεν έχω ασχοληθεί με Regex στην C/C++, οπότε αυτό που δείχνεις μπορούμε να πούμε ότι είναι κάτι σαν Expression.

 

Γενικά η scanf(...) βλέπω ότι έχει μεγάλη δύναμη σε αντίθεση με την Console.Read() στην C#

 

εκτός αν και η Console.Read() έχει κάτι αντίστοιχο (δεν το έχω ψάξει)...

Βλέποντας το από μακρυά, ίσως και αυτό να μπορούμε να το πούμε regular expression αλλά είναι το βασικό σύνολο που υποστηρίζουν οι *scanf συναρτήσεις. Αν θέλεις να κάνεις κάτι σοβαρό με regular expressions υπάρχουν άλλες συναρτήσεις. Όπως και στο shell και παντού χρησιμοποιούμε τις αγκύλες για να δηλώσουμε ένα σύνολο πχ [a-z] έτσι χρησιμοποιείται και εδώ απλά με το ^ στην αρχή για να αντιστρέψουμε το σύνολο. Το %[^\n] σημαίνει διάβασε όσους χαρακτήρες βρίσκονται στο παραπάνω σύνολο δηλαδή όλους εκτός από την newline οπότε θα διαβάσει ολόκληρη την γραμμή. Θα μπορούσαμε μπακάλικα να πούμε ότι το %s είναι συντομογραφία για το %[^ ] δηλαδή διάβασε τα πάντα μέχρι την space.

 

Δεν έχω ασχοληθεί με C# οπότε δεν ξέρω την Console.Read αλλά εφόσον υπάρχει τέτοια υποδομή στην C του 1920 σίγουρα θα υπάρχει κάτι αντίστοιχο (και ίσως απείρως πιο δυνατό) στην C#

  • Like 1
Δημοσ.

ευχαριστώ και πάλι το πρόβλημα τελικά λύθηκε απλά ήθελε και μια fflush(stdin) πριν την scanf() το παραθέτω παρακάτω:

 

#include <stdio.h>
#include <stdlib.h>
 
 
int main(void)
{      
int i,j;
  float ma,kma,f,fo,kmao;
  char onoma[40];          
  fo=0;
  kmao=0;
  for(i=1;i<=3;i++)
                 {
  printf("dwse to onomateponimo tou upalilou\n");
         fflush(stdin);
          scanf("%[^\n]",onoma);    
  do    
  {
                 printf("dwse to miniaio poso apodoxwn tou upalilou pliktrologontas apo 0 ews 3000 euro\n");
                 scanf("%f",&ma);
                 }while(ma>=3000);
                 if(ma<=700)
                 {
                            f=0*ma;
                            kma=ma-f;
                 printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma);
                 
                 }
                 else if(ma<=1000)
                 {
                 f=0.15*ma;
                 kma=ma-f;
                 printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma);
                 }
                 else if(ma>1000)
                 {
                 f=0.03*ma;
                 kma=ma-f;
                 printf("o %s exei miniaies apodoxes %.2f,foro %.2f kai kathares miniaies apodoxes %.2f\n",onoma,ma,f,kma);
                 }
                 fo=fo+f;
                 kmao=kmao+kma;
                 j=j=1;
                 
                 }
                 printf("to sunoliko poso twn forwn olwn einai %.2f kai to sunoliko poso twn katharwn miniaiwn apodoxwn olwn einai %.2f\n",fo,kmao);
  system("PAUSE");
  return 0;
}

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

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

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

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

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

Σύνδεση

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

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