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

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

Δημοσ.

Όσον αφορά τους χαρακτήρες υπάρχει ένα κολπάκι για να μη συμβαίνει αυτό (να μην τρώει χαρακτήρα το enter) με το scanf(" %c", &ch);.

 

Υπάρχει κάτι αντίστοιχο στα στρινγκς;

Δημοσ.

Μήπως αν δεν έχεις space πριν το %c;

Το ανέφερα απλά ως παράδειγμα στον τύπο char.

Δώσε ένα παράδειγμα του προβλήματος.

Ουσιαστικά η εξωτερική do-while, σε κάθε της πέρασμα, τρώει και από μια επανάληψη του scanf("%s", pin), του scanf("%s", safepin) και του scanf("%s", newpin). Το θέμα είναι ότι πρέπει να κάνει την ίδια διαδικασία (3 φορές να ρωτάει για passsword, 2 για ερωτηση ασφαλειας εφοσον δεν ξερεις το πασγουορντ) και στις πεντε επαναλήψεις.

 

int main()

{

 

int i=0, p=0, k=0;  

do{

    do{

        printf("DOSE PASSWORD:\n");

        scanf("%s", pin);

        i++;

       } while (i<3 && strcmp (pin, CODE) != 0);

           

    if (strcmp(pin, CODE) == 0)

       printf("W E L C O M E !\n");

    else

    {

          do{

            printf("Poio einai to agaphmeno soy xrwma?\n");

            scanf("%s", safepin);

            p++;

             } while (p<2 && strcmp (safepin, "kanena") != 0);

          

       if (strcmp(safepin, "kanena") == 0)

          {

              printf("Dose neo kwdiko:\n");

              scanf("%s", newpin);

              strcpy(temp, newpin);

              strcpy(CODE, temp);

              main();

          }

       else  

          printf("O logariasmos kleidw8hke.\n");       

 

}

    printf("***************\n\n");

    k++;

}while(k<5);

Δημοσ.

Αν βαλεις κενο πριν το στρινγκ στη scanf δε λειτουργει με τον ιδιο τροπο οπως το κολπακι που ανεφερες?

Δηλ να το κανεις " %s"? Εκτος αν βαλεις getchar() μετα τη scanf για να "φαει" το εντερ που πατας μετα το 

ινπουτ που δινεις για να αναγνωρισει η scanf.

Δημοσ.

Αν βαλεις κενο πριν το στρινγκ στη scanf δε λειτουργει με τον ιδιο τροπο οπως το κολπακι που ανεφερες?

Δηλ να το κανεις " %s"? Εκτος αν βαλεις getchar() μετα τη scanf για να "φαει" το εντερ που πατας μετα το 

ινπουτ που δινεις για να αναγνωρισει η scanf.

Το δοκίμασα μόλις αυτό που είπες με το getchar(), αλλά δεν είδα διαφορά. Νομίζω έχω κάνει κάποιο λάθος στις επαναλήψεις ή στον τύπο επανάληψης.

 

Any ideas?

Δημοσ.

Καλησπέρα φίλε !

 

Δεν έχω καταλάβει ποιό είναι το πρόβλημα σου. Έτρεξα το κώδικα σου και λειτουργεί σωστά. Μήπως το πρόβλημα σου είναι στα strings που κάνεις compare. Μήπως δεν τα έχεις δηλώσει σωστά στην αρχή , επειδή στο κώδικα που πόσταρες δεν έχεις κάνει τις αρχικοποιήσεις και δεν μπορώ να σου πω σίγουρα. 

 

Εγώ το έτρεξα με τις αρχικοποιήσεις αυτές , έτρεχε κομπλέ και έκανε τις επαναλήψεις που θές να κάνει για λάθος κωδικούς.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char pin[12];
    char code[12];
    char safepin[12];
    char newpin[12];
    char CODE[12] = "password";
    char temp[12];
    int i=0, p=0, k=0;

    do{
        do{
            printf("DOSE PASSWORD:\n");
            scanf("%s", pin);
            i++;
        } while (i<3 && strcmp (pin, CODE) != 0);

        if (strcmp(pin, CODE) == 0)
            printf("W E L C O M E !\n");
        else
        {
            do{
                printf("Poio einai to agaphmeno soy xrwma?\n");
                scanf("%s", safepin);
                p++;
            } while (p<2 && strcmp (safepin, "kanena") != 0);

            if (strcmp(safepin, "kanena") == 0)
            {
              printf("Dose neo kwdiko:\n");
              scanf("%s", newpin);
              strcpy(temp, newpin);
              strcpy(CODE, temp);
              main();
            }
            else
            {
                printf("O logariasmos kleidw8hke.\n");
            }


        }
        printf("***************\n\n");
        k++;
    }while(k<5);
}
Δημοσ.

 

Καλησπέρα φίλε !

 

Δεν έχω καταλάβει ποιό είναι το πρόβλημα σου. Έτρεξα το κώδικα σου και λειτουργεί σωστά. Μήπως το πρόβλημα σου είναι στα strings που κάνεις compare. Μήπως δεν τα έχεις δηλώσει σωστά στην αρχή , επειδή στο κώδικα που πόσταρες δεν έχεις κάνει τις αρχικοποιήσεις και δεν μπορώ να σου πω σίγουρα. 

 

Εγώ το έτρεξα με τις αρχικοποιήσεις αυτές , έτρεχε κομπλέ και έκανε τις επαναλήψεις που θές να κάνει για λάθος κωδικούς.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char pin[12];
    char code[12];
    char safepin[12];
    char newpin[12];
    char CODE[12] = "password";
    char temp[12];
    int i=0, p=0, k=0;

    do{
        do{
            printf("DOSE PASSWORD:\n");
            scanf("%s", pin);
            i++;
        } while (i<3 && strcmp (pin, CODE) != 0);

        if (strcmp(pin, CODE) == 0)
            printf("W E L C O M E !\n");
        else
        {
            do{
                printf("Poio einai to agaphmeno soy xrwma?\n");
                scanf("%s", safepin);
                p++;
            } while (p<2 && strcmp (safepin, "kanena") != 0);

            if (strcmp(safepin, "kanena") == 0)
            {
              printf("Dose neo kwdiko:\n");
              scanf("%s", newpin);
              strcpy(temp, newpin);
              strcpy(CODE, temp);
              main();
            }
            else
            {
                printf("O logariasmos kleidw8hke.\n");
            }


        }
        printf("***************\n\n");
        k++;
    }while(k<5);
}

Σε αυτόν τον κώδικα, δίνοντας τον καινούριο κωδικό, δεν τον παίρνει για έγκυρο αργότερα στην επάνάληψη:

 

2emicxs.png

 

Η άσκηση λέει:

rbl2xj.png

UPDATE:

 

Έκανα μερικές τροποποιήσεις (έβγαλα και τα γκρικλις γιατί μου την σπάνε), έβαλα τις μεταβλητές μέσα στην main και με ένα goto παρακάμπτω την αρχικοποίηση του CODE ως abc123 σε ό,τι είχε γράψει ο χρήστης για νέο κωδικό. Το θέμα είναι πως ακόμα τρώει επαναλήψεις των μηνυματων.

#include <stdio.h>          
#include <stdlib.h>
#include <string.h> 
int main()
{
char temp[7];
char CODE[7] = "abc123"; 
char pin[7];
char safepin[7];
char newpin[7];
int i=0, p=0, k=0;  
int verified = 0;
CHECKPOINT:
do{
    do{
        printf("GIVE PASSWORD:\n");
        scanf("%s", pin);
        i++;
       } while (i<3 && strcmp (pin, CODE) != 0);
           
    if (strcmp(pin, CODE) == 0){
       printf("W E L C O M E !\n");
       verified = 1;
       }
    else
    {
          do{
            printf("What's your favourite colour?\n");
            scanf("%s", safepin);
            p++;
             } while (p<2 && strcmp (safepin, "none") != 0);
          
       if (strcmp(safepin, "none") == 0)
          {
              printf("Type a new password:\n");
              scanf("%s", newpin);
              strcpy(temp, newpin);
              strcpy(CODE, temp);
              strcpy(pin, CODE);
              goto CHECKPOINT;
          }
       else  
          printf("Account locked.\n");       

}
    printf("***************\n\n");
    k++;
}while(!verified && k<5);

system("pause");
return 0; 
    
}

  • Moderators
Δημοσ.

Αφήνοντας στην άκρη το goto (που είμαι πολύ περίεργος να μάθω ποιος σας το είπε), ο κώδικάς σου είναι λάθος. Κάνεις κάτι τελείως διαφορετικό απ' αυτό που σου ζητάει η άσκηση. Δε σου ζητάει να διαβάζεις τον κωδικό 3 φορές, σου ζητάει να διαβάζεις τον κωδικό μέχρι να δωθεί ο σωστός και το πολύ 3 φορές. Αν δε δώσεις το σωστό κωδικό, σου ζητάει να πεις το αγαπημένο σου χρώμα το πολύ μέχρι 2 φορές. Αν κάνεις κι εκεί λάθος, τότε ο λογαριασμός κλειδώνει.

 

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

Δημοσ.

Αφήνοντας στην άκρη το goto (που είμαι πολύ περίεργος να μάθω ποιος σας το είπε), ο κώδικάς σου είναι λάθος. Κάνεις κάτι τελείως διαφορετικό απ' αυτό που σου ζητάει η άσκηση. Δε σου ζητάει να διαβάζεις τον κωδικό 3 φορές, σου ζητάει να διαβάζεις τον κωδικό μέχρι να δωθεί ο σωστός και το πολύ 3 φορές. Αν δε δώσεις το σωστό κωδικό, σου ζητάει να πεις το αγαπημένο σου χρώμα το πολύ μέχρι 2 φορές. Αν κάνεις κι εκεί λάθος, τότε ο λογαριασμός κλειδώνει.

 

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

Μα σε οποιαδήποτε φορά και να γράψω το σωστό, δουλεύει:

 

21l4mzd.png

 

Ο λόγος που μου έτρωγε τελικά τις επαναλήψεις, είναι γιατί δεν έκανα reset τους μετρητές.

 

(το goto το έμαθα πάνω κάτω μόνος μου. δεν ειμαι περήφανος για αυτό, αλλά δεν με ξέρεις, για αυτό δεν μπορείς να με κρίνεις, δεν ξέρεις τι εχω περασει, ρε ξερεις ποιος ειμαι γω ρε; )

 

αυτό ήταν πάνω κάτω. :D

Δημοσ.

Εμάς έλεγε ότι άμα βρει goto δεν περνάς το μάθημα :D με ένα flag έχεις τελειώσει..

Μωρέ ναι απλά έκανα τη βλακεία στην αρχή να τις κάνω όλες καθολικές μεταβλητές. Μετά όταν τις έκανα τοπικές είπα να βάλω ένα goto για να παρακάμψω τις δηλώσεις γιατί βαριόμουν. Έτσι είναι τώρα.

#include <stdio.h>          
#include <stdlib.h>
#include <string.h> 
int main()
{
char temp[7];
char CODE[7] = "abc123"; 
char pin[7];
char safepin[7];
char newpin[7];
int i=0, p=0, k=0;  
int verified = 0;
i = 0;
k = 0;

CHECKPOINT:

do{       
    do{ 
        printf("GIVE PASSWORD:\n");
        scanf("%s", pin);
        i++;
       } while (i<3 && strcmp (pin, CODE) != 0);
           
    if (strcmp(pin, CODE) == 0){
       printf("W E L C O M E !\n");
       verified = 1;
       goto CHECKPOINT;
       }
    else
    {             
          p = 0;
          do{
            printf("What's your favourite colour?\n");
            scanf("%s", safepin);
            p++;
             } while (p<2 && strcmp (safepin, "none") != 0);
          
          if (strcmp(safepin, "none") == 0)
          {
                printf("Type a new password:\n");
                scanf("%s", newpin);
                strcpy(temp, newpin);
                strcpy(CODE, temp);
                strcpy(pin, CODE);
                goto CHECKPOINT;
          }
          else  
                {
                printf("Account locked.\n");       
                verified = 1;
                }
    }
printf("***************\n\n");
k++;
}while(k<5 && !verified);

system("pause");
return 0;    
}
Δημοσ.

Γουστάρω τα goto.Δεν υπάρχει κακός και καλός προγραμματισμός..μόνο καλός και κακός προγραμματιστής..Και κακός είναι αυτός που δεν παραδίδει το πρόγραμμα με το αποτέλεσμα που ζητάνε.

Εφόσον όμως πρέπει να πας με τα νερά του άλλου ...(που δεν θέλει άμεση εξαγωγή)...δεν βάζεις και goto αλλά όπως αναφέρθηκε ένα flag, μια δηλαδή μεταβλητή που όσο είναι αληθές θα παίζει η ερώτηση, όσο ψευδές θα το προσπερνάει.

Δημοσ.

@Μ2000 Διαφωνώ. Ας σου παραδώσει κάποιος προγραμματιστής κώδικα χωρίς εντολές επιλογής κι επανάληψης, παρά μόνο goto. Εκεί να δω κατά πόσο θα τον λατρέψεις. Η goto πολύ χρήσιμη εντολή, αλλά μόνο όταν τη χρησιμοποιείς για πράγματα όπου οι εντολές επιλογής κι επανάληψης δε φαίνεται να λύνουν κάποιο πρόβλημα, παρά μόνο δυσκολεύουν την ανάγνωση και την πολυπλοκότητα.

  • Like 2

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

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

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

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

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

Σύνδεση

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

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