Driving nuts problem!!!

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Driving nuts problem!!!

Δημοσίευσηαπό pc_magas » 24 Δεκ 2009, 23:00

Παίδες έκανα έναν κώδικα για μια άσκηση:
Κώδικας: Επιλογή όλων
#include<stdio.h>
void locate(int data[10],int element);/*Function anazitisis. Dehetai san dedomena to pinaka kai to stoiheio pros anazitisi*/
void arhikopoihsi(int [10]);//Function arhikopoiisis
void arhikopoihsi(int table[10]){
int *i;
for(i=table;i<table+10;i++){*i=0;}
}
void locate(int data[10],int element){
int *prospelasi;//Pointer se akaireo gia prospelash tou pinaka
for(prospelasi=data;prospelasi<data+10;prospelasi++)
{
if(*prospelasi==element){break;}/*Me thn entoli break otan vrethei to stoixeio vgainei apo to loop*/
}
if(prospelasi==data+9 && *prospelasi!=element){printf("Slide for uknown element\n");}
/*A iphone-look error message for element whitch not found in table*/
else{printf("The element found!!!!!\0");//Mynhma euresis stoiheiou.
}
}
int main(){
int dedomena[10],search,*i;
char opt,opt2;
arhikopoihsi(dedomena);
do{
//A menu like-made ncurses (http://en.wikipedia.org/wiki/Ncurses)
printf("What do u want to do?\n");
printf("I)nsect\n");
printf("S)earch\n");
printf("You should enter the letter whitch is before ')' for each function\n");
scanf("%c",&opt);
if(opt=='I'){
for(i=dedomena;i<dedomena+10;i++)
{
printf("Enter an interger\n");
scanf("%d",dedomena);}
}
else if(opt=='S')
{
printf("Enter an interger to search\n");
scanf("%d",&search);
locate(dedomena,search);
}
fflush(stdin);
printf("Press y to continue the program or press anything else to exit\n");
opt2=getchar();
}while(opt2=='y'||opt2=='Y');
return 0;
}

Και πήρα αυτήν την εκτέλεση:
Κώδικας: Επιλογή όλων
pc_magas@pcmagas:~$ ~/askisi3
What do u want to do?
I)nsect
S)earch
You should enter the letter whitch is before ')' for each function
I
Enter an interger
1
Enter an interger
2
Enter an interger
1
Enter an interger
2
Enter an interger
3
Enter an interger
1
Enter an interger
2
Enter an interger
1
Enter an interger
2
Enter an interger
9
Press y to continue the program or press anything else to exit

Γιατί? δεν διαβάζει την:
Κώδικας: Επιλογή όλων
opt2=getchar();


Δοκίμασα και *χωρίς* την fflush(stdin);

My blog|Κυπριακή Κοινότητα Ελευθέρου Λογισμικού Λογισμικού ανοικτού Κώδικα
Γνώσεις Linux:Ποτέ αρκετές|Προγραμματισμός: Php, javascript, nodejs, python, bash |Aγγλικά:Καλά
Οι υπολογιστές μου:
Spoiler: show
Ubuntu 16.04 64 bit σεIntel(R) Pentium(R) CPU G4400 @ 3.30GHz, 16Gib Ram, 500Gib Hard Disk, και κάρτα γραφικών Nvidia Geforce GT610
Lubuntu 14.04 σε Dell Inspiron mini 10(1010) intel Atom Z500 1Gb ram και gma500 (εδώθη σε άλλον)
Kubuntu 16.04 Lenovo G70 Intel i5 Nvidia Grapgics Card, Intel Graphics card (έχει 2) με Nouveau, 16Gb RAM, 126GB SSD Σκληρό Δίσκο
Άβαταρ μέλους
pc_magas
powerTUX
powerTUX
 
Δημοσιεύσεις: 2599
Εγγραφή: 12 Απρ 2009, 18:55
Τοποθεσία: Αχαρναί Αττικής
Launchpad: pc_magas
IRC: pc_magas
Εκτύπωση

Re: Driving nuts problem!!!

Δημοσίευσηαπό gyros » 14 Φεβ 2010, 17:03

Προφανώς δεν έχει επί της ουσίας νόημα η απαντησή μου σε μια τέτοια χρονική περίοδο μιας και σίγουρα έχεις παραδώσει την άσκηση όπως και πολύ πιθανόν να έχεις βρει και την λύση. Αλλά για λόγους πληρώτητας θα απαντήσω. Όταν λοιπόν διαβάζουμε με την scanf ή με την getchar έναν μόνο χαρακτήρα ( char ) πχ scanf( "%c", &c) ή c = getchar(); ή οποιονδήποτε άλλο τύπο δεδομένων και όχι string, ο χαρακτήρας αλλαγής γραμμής (\n) μένει στον buffer, οπότε την επόμενη φορά που θα ζητηθεί να διαβαστεί απλος χαρακτήρας με μιά getchar(), θα διαβάσει τον χαρακτήρα αλλαγής γραμμής και θα συνεχίσει στην επόμενη εντολή, αυτό είναι που συμβαίνει και σε εσένα. Ένας απλός τρόπος για να το λύσεις αυτό το πρόβλημα είναι να βάζεις μαζί δύο getchar() ή scanf. Η πρώτη θα είναι για τον χαρακτήρα που θα θέλεις να κρατήσεις και η δεύτερη για να διαβάζει τον χαρακτήρα αλλαγής γραμμής. Φυσικά η δεύτερη μεταβλητή πρέπει να είναι κάποια άκυρη και όχι από αυτές που θα χρειαστείς παρακάτω. Όπότε έλυσα το πρόβλημα σου με τον τρόπο που περιέγραψα παραπάνω. Έβαλα λοιπόν μετά την scanf( "%c", &opt ) μια opt2 = getchar() για να διαβάσει τον χαρακτήρα αλλάγης γραμμής. Το ίδιο έκανα και σε οποιαδήποτε ακολουθούμενη scanf ή getchar(). Αυτό χρειάζεται να γίνει και στις scanf μέσα στις for, γιατί κάθε φορά που θα τρέξει μια από τις εσωτερικές αυτές scanf θα αποθηκευτεί και ένας χαρακτήρας αλλάγης γραμμής στον buffer οπότε πρέπει και κάθε φορά να τον βγάζουμε από τον buffer. Ο διορθώμένος κώδικας δίνεται παρακάτω.

Υ.Γ.
Επίσης ο κώδικας είχε και δύο λογικά λάθη για να τρέξει σωστά( τουλάχιστον για να φαίνεται ότι τρέχει σωστά ). Το πρώτο είναι στην συνάρτηση locate. Στον έλεγχο που κάνεις στο τέλος για να δεις αν τελικά βρέθηκε το στοιχείο μέσα στον πίνακα. Ο έλεγχος που κάνεις για το αν η αναζήτηση έχει φτάσει μέχρι το τέλος του πίνακα prospelasi==data+9, δεν είναι απαραίτητη αλλά από την άλλη όμως είναι πληρέστερος σαν έλεγχος. Αλλά όμως για κάποιο λόγο δεν λειτουργούσε σωστά, δεν τον έψαξα να τον βρω, και έτσι πάντα εμφάνιζε ότι βρέθηκε κάποιο στοιχείο μέσα στον πίνακα ακόμα και αν δεν υπήρχε. Όποτε εξαιτίας του ότι δεν ήταν αναγκαία συνθήκη την έβγαλα και τρέχει μια χαρά. Το δεύτερο είναι εκεί που διαβάζεις τους ακέραιους από τον χρήστη με την scnaf( "%d", dedomena ). Με αυτό που γράφεις ουσιαστηκά αυτό που κάνεις είναι να αποθηκεύεις τον ακέραιο που δίνει ο χρήστης στο πρώτο στοιχείο του πίνακα dedomena συνέχεια, αυτό γιατί το dedomena σκέτο είναι αντίστοιχο του dedomena[0]. Από την στιγμή όμως που τις διευθήνσεις των στοιχείων του πίνακα dedomena τις έχεις περάσει στο i μπορείς αντί για dedomena να βάλεις το i που σε κάθε επανάληψη περιέχει την σωστή διεύθηνση του πίνακα dedomena.

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

Ελπίζω να σε βοηθίσει έστω και λίγο καθηστεριμένα :D .

Κώδικας: Επιλογή όλων
#include<stdio.h>

void locate(int data[10],int element);/*Function anazitisis. Dehetai san dedomena to pinaka kai to stoiheio pros anazitisi*/
void arhikopoihsi(int [10]);//Function arhikopoiisis

void arhikopoihsi(int table[10])
{
int *i;
for(i=table;i<table+10;i++){*i=0;}
}

void locate(int data[10],int element)
{
int *prospelasi;//Pointer se akaireo gia prospelash tou pinaka

for(prospelasi=data;prospelasi<data+10;prospelasi++)
if(*prospelasi==element)
break;/*Me thn entoli break otan vrethei to stoixeio vgainei apo to loop*/

if(*prospelasi!=element)
printf("Slide for uknown element\n");
/*A iphone-look error message for element whitch not found in table*/
else
printf("The element found!!!!!\0");//Mynhma euresis stoiheiou.
}

int main()
{
int dedomena[10],search,*i;
char opt,opt2;

arhikopoihsi(dedomena);

do{
//A menu like-made ncurses (http://en.wikipedia.org/wiki/Ncurses)
printf("What do u want to do?\n");
printf("I)nsect\n");
printf("S)earch\n");
printf("You should enter the letter whitch is before ')' for each function\n");

opt = getchar();
opt2 = getchar();

if(opt=='I')
{
for(i=dedomena;i<dedomena+10;i++)
{
printf("Enter an interger\n");

scanf("%d", i);
opt = getchar();
}
}
else if(opt=='S')
{
printf("Enter an interger to search\n");

scanf("%d",&search);
opt = getchar();

locate(dedomena,search);
}

printf("Press y to continue the program or press anything else to exit\n");

opt2 = getchar();
opt = getchar();

}while(opt2=='y'||opt2=='Y');

return 0;
}
gyros
babeTUX
babeTUX
 
Δημοσιεύσεις: 12
Εγγραφή: 10 Δεκ 2008, 19:44
Εκτύπωση


Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι