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

Διατάξεις αλφαριθμητικών στη C


capoelo

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

1.

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

 

char words[][2][40]={

"dog","hund",

"no","nein",

"year","jahr",

"child","kind",

"",""

};

 

int main(void)

{

char english[80];

int i;

 

printf("Enter english word: ");

gets(english);

 

i=0;

while(strcmp(words[0],"")){

if(!strcmp(english,words[0])){

printf("German translation:%s\n",words[1]);

break;

}

i++;

}

if(!strcmp(words[0],""))

printf("Not in dictionary\n");

 

system("Pause");

 

return 0;

}

 

Αυτό το πρόγραμμα δέχεται μια αγγλική λέξη από τον χρήστη και επιστρέφει την αντίστοιχη γερμανική.Το θέμα μου είναι το εξής:στη while,το βιβλίο μου αναφέρει ότι η αναζήτηση συνεχίζεται μέχρι να βρεθεί κενό αλφαριθμητικό.Εγώ όμως έχω την εντύπωση ότι διαβάζεται ως "όσο το words[0] είναι ίσο με κενό,αν το english δεν είναι ίσο με το words[0],printf"κλπ.Έτσι όπως το ερμηνεύω εγώ όμως δεν στέκει.Τι λάθος κάνω;

2.

Μια άσκηση σε αυτό το κεφάλαιο ζητάει ένα πρόγραμμα που θα ορίζει μια διάταξη με τα αλφαριθμητικά των 0-9 στα αγγλικά(one,two κλπ.)Δέχεται έναν αριθμό σε μορφή χαρακτήρα απο τον χρήστη και εμφανίζει το αντίστοιχο string.Για να βρει τον σωστό δείκτη,αφαιρεί απο τον αριθμό που εισάγει ο χρήστης το '0'.Πως ακριβώς λειτουργεί αυτό;

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

  • Απαντ. 63
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Όχι, αν το words[0] είναι κενό τότε η συνάρτηση strcmp() που είναι στο condition της while επιστρέφει μηδέν, βγαίνει απ τη while. Πρόσεξε, συγκρίνει το words[0] με το κενό κι όχι με το english!!

Αυτό που λες εσύ γίνετε στην if που βρίσκετε στο body της while.

 

Όσο για το 2, ψάξε στο google για ASCII table. Στην ουσία είναι ένας πίνακας που έχει τον "αριθμό" που αντιστοιχεί σε κάθε γράμμα. Για να μη σε μπλέξω σκέψου το κάπως έτσι: επειδή ο υπολογιστής μπορεί και αποθηκεύει μόνο αριθμούς, εμείς τα γράμματα τα αποθηκεύουμε στη μνήμη με μορφή αριθμού και μετά επειδή ξέρουμε ότι αυτό ήταν γράμμα "ξαναμετατρέπουμε" τον αριθμό στο αντίστοιχο γράμμα.

(για να το δοκιμάσεις γράψε αυτό τον κώδικα και δες τι κάνει)

>printf("read as integer: %d \nread as character: %c\n", 'a', 'a');

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

  • 2 εβδομάδες αργότερα...

Μπορεί κάποιος να μου πει τι λάθος έχω σε αυτό το πρόγραμμα;Κοντεύω να τρελαθώ!!!Μου βγάζει λάθος λόγω υπερχείλισης στη διάταξη.

 

#include<stdio.h>

#include<stdlib.h>

 

char a[][2]={

"nikos","2651022545",

"dimitris","2651048576",

"giorgos","2651045322"};

 

int main(void)

{

char name[80];

 

printf("Give a name: ");

gets(name);

 

for(int i=0;a[0][0];i++)

{

if(name==a[0])printf("The number is:%c\n",a[1]);

else printf("Unregistered name\n");

}

 

system("Pause");

 

return 0;

}

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

Μπορεί κάποιος να μου πει τι λάθος έχω σε αυτό το πρόγραμμα;Κοντεύω να τρελαθώ!!!Μου βγάζει λάθος λόγω υπερχείλισης στη διάταξη.

 

#include<stdio.h>

#include<stdlib.h>

 

char a[][2]={

"nikos","2651022545",

"dimitris","2651048576",

"giorgos","2651045322"};

 

int main(void)

{

char name[80];

 

printf("Give a name: ");

gets(name);

 

for(int i=0;a[0][0];i++)

{

if(name==a[0])printf("The number is:%c\n",a[1]);

else printf("Unregistered name\n");

}

 

system("Pause");

 

return 0;

}

Φϊλε capoelo θα σε παρακαλέσω (νομίζω για 2η ή για 3η φορά, αν κάνω λάθος απολογούμαι εκ των προτέρων) να περιστοιχίζεις τους κώδικες που γράφεις μέσα στα tags:

[ code] ... [/ code] (χωρίς κενά μέσα στις αγκύλες)...

 

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

char a[][2]={
	"nikos","2651022545",
	"dimitris","2651048576",
	"giorgos","2651045322"};

int main(void)
{	
char name[80];

       printf("Give a name: ");
gets(name);

       for(int i=0;a[i][0][0];i++)
{	
      	if(name==a[i][0])printf("The number is:%c\n",a[i][1]);
      	else printf("Unregistered name\n");
}

system("Pause");

return 0;
}

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

"όσο το words[0] είναι ίσο με κενό,αν το english δεν είναι ίσο με το words[0],printf"κλπ.Έτσι όπως το ερμηνεύω εγώ όμως δεν στέκει.Τι λάθος κάνω;

 

Η ερμηνεία που έχεις κάνει δεν είναι σωστή. Η σωστή ερμηνεία θα ήταν:

>
   i=0;
   while(strcmp(words[i][0],"")){    // Όσο (words[i][0] δεν είναι ίσο με "")
       if(!strcmp(english,words[i][0])){    // Αν (words[i][0] είναι ίσο με english)
           printf("German translation:%s\n",words[i][1]);
           break;
       }
       i++;
   }

Όπως βλέπεις κι εδώ η strcmp επιστρέφει 0 αν τα αλφαριθμητικά είναι ίδια, κάτι >0 αν ο πρώτος χαρακτήρας που δεν ταιριάζει είναι "μεγαλύτερος"( σε αξία γραμμάτων-->αυτό θα το καταλάβεις από τον πίνακα ASCII, όπως σου υπέδειξε ο nilosgr) από αυτόν του 2ου και κάτι <0 αν ο πρώτος χαρακτήρας που δεν ταιριάζει είναι "μικρότερος" απ'αυτόν του 2ου.

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

Μπορεί κάποιος να μου πει τι λάθος έχω σε αυτό το πρόγραμμα;Κοντεύω να τρελαθώ!!!Μου βγάζει λάθος λόγω υπερχείλισης στη διάταξη.

...

Διάφορα προβλήματα.

 

Καταρχήν, ο compiler πρέπει να σου βγάζει τουλάχιστον 1 warning που να αφορά το γεγονός πως το a το δηλώνεις ως πίνακα από strings μέγιστου μήκους 2 χαρακτήρων (συμπεριλαμβανομένου του μηδενικού στο τέλος) αλλά τα strings τα αρχικοποιείς με πολύ περισσότερους χαρακτήρες το καθένα. Π.χ. το "nikos" έχει 6, το "2651022545" έχει 11, κλπ, κλπ.

 

Έπειτα, το a είναι δηλωμένο ως 2Δ-πίνακας χαρακτήρων, αλλά στη γραμμή...

 

>
...
for(int i=0;a[i][0][0];i++)
...

προσπαθείς να το διαχειριστείς ως 3Δ.

 

Ακόμα στη γραμμή...

 

>
...
if(name==a[i][0])
...

προσπαθείς να συγκρίνεις το string εισόδου με τον 1ο χαρακτήρα του i-οστού string στον πίνακα a.

 

Κοντολογίς, απορώ ποιος compiler τα πέρασε αυτά και έβγαλε εκτελέσιμο αρχείο. :P

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

 

:devil: Κανένας deafult του dev C++ :devil:

 

 

:lol:

 

Βασικά ο default του dev c++ είναι ο mingw32 gcc, που είναι αξιοπρεπέστατο port του gcc, αλλά με τη διαφορά πως ο συγκεκριμένος του dev c++ είναι έκδοσης 7 ετών πίσω!

 

Πάντως για όποιον ενδιαφέρεται, υπάρχει σύγχρονο και λίαν ενημερωμένο fork του dev c++: http://orwellengine.blogspot.gr/

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

Όσο για το 2, ψάξε στο google για ASCII table. Στην ουσία είναι ένας πίνακας που έχει τον "αριθμό" που αντιστοιχεί σε κάθε γράμμα. Για να μη σε μπλέξω σκέψου το κάπως έτσι: επειδή ο υπολογιστής μπορεί και αποθηκεύει μόνο αριθμούς, εμείς τα γράμματα τα αποθηκεύουμε στη μνήμη με μορφή αριθμού και μετά επειδή ξέρουμε ότι αυτό ήταν γράμμα "ξαναμετατρέπουμε" τον αριθμό στο αντίστοιχο γράμμα.

(για να το δοκιμάσεις γράψε αυτό τον κώδικα και δες τι κάνει)

>printf("read as integer: %d \nread as character: %c\n", 'a', 'a');

 

Έχει σχέση με το null που τερματίζει τα strings,σωστά;Το γιατί όμως χρειάζεται δεν μπορώ να καταλάβω.

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

Περίπου... Βασικά, σκέψου αυτό που σου έχω πει πιο πάνω, ότι ο υπολογιστής μπορεί να αποθηκεύει μόνο αριθμούς.

Αν δηλαδή εσύ θες να αποθηκεύσεις σε ένα

string την φράση "ABC" ο υπολογιστής θα το αποθηκεύσει στη μνήμη ως "979899" (κανονικά θα έπρεπε να είναι στο δυαδικό, αλλά για απλότητα δες το έτσι). Όπου 97 είναι ο αριθμός που αντιστοιχεί στο Α, 98 στο B και 99 στο C. Οκ αυτό το κατάλαβες; Αν όχι πες να προσπαθήσω να στο εξηγήσω αλλιώς ή να προσπαθήσει κάποιος άλλος ;-)

 

Τώρα, σχετικά με τους πίνακες. Στη C όταν δηλώνεις έναν πίνακα, στην ουσία δεσμεύεις συνεχόμενες θέσεις μνήμης. Πχ όταν δηλώνεις ένα char str[5], λες ότι η μεταβλητή str θα "πιάνει" πέντε συνεχόμενες θέσεις μνήμης. Κι απ πούμε ότι η μεταβλητή str αποθηκεύετε στις θέσεις 0x20 ως 0x24. Αν εσύ σας και καλέσεις μετά

>printf("%s", str);

Δηλαδή ζητάς να σου εμφανίσει τους χαρακτήρες του πίνακα str. Ο υπολογιστής θα αρχίσει απ τη θέση μνήμης 0x20 (την αρχή του str) και θα διαβάζει κάθε θέση μνήμης και θα εμφανίζει τον χαρακτήρα που αντιστοιχεί στην τιμή της κάθε θέσης. (πχ αν η θέση 0x20 έχει τιμή 98 θα εμφανίσει B, μετά θα πάει στη θέση 0x21 κοκ). Κι έτσι θα εμφανίζει χαρακτήρες μέχρι να βρει null, δηλαδή το χαρακτήρα '\0'.

Τώρα θα αναρωτηθείς γιατί; Αφού εσύ δήλωσες πίνακα πέντε θέσεων, γιατί δεν εκτυπώνει και τα πέντε και να σταματάει εκεί...;!

Η ιδέα είναι ότι μπορεί εσύ να έχεις δηλώσει ένα πίνακα από char με πενήντα θέσεις αλλά να θες να εκτυπώσεις /χρησιμοποιείς μόνο τις δέκα, άρα θα σας στην ενδέκατη θέση και θα βάλεις null ώστε να δείξεις ότι από κει και πέρα είναι "σκουπίδια", οπότε να σταματήσει εκεί.

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

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

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

 

>
int main( void )
{
for (int i=97; i <= (97+25); i++)
       	printf( "i: %d, (char) i: %c\n", i, i );

return 0;
}

Ξεκινάει από i ίσο με 97 και τυπώνει το κάθε επόμενο i (μέχρι και το 122) καθώς και τον χαρακτήρα που του αντιστοιχεί σύμφωνα με το ASCII table.

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

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

int main(void)
{
char *p[]={
	"Yes","No","Maybe.Rephrase the question"
};
	int i;
	char q[80];

	printf("rwta me: ");
	gets_s(q);

               label1:printf(": ");
	gets_s(q);
	
	if(p[strlen(q)%3]!=p[2])
		{
	        printf("%s\n",p[strlen(q)%3]);
	        }
	else  
	{
		printf("%s\n",p[strlen(q)%3]);
		goto label1;
	}

system("Pause");

return 0;
}

 

Αυτό το πρόγραμμα δέχεται ερωτήσεις απο τον χρήστη και απαντά βάσει του τύπου που βρίσκεται μέσα στην if,yes,no,maybe.Το ερώτημα μου είναι:στην περίπτωση που η απάντηση είναι "maybe..."έχω βάλει να εμφανίζει την απάντηση και μετά να πηγαίνει στο label1 αλλά για κάποιο λόγο παραλείπει το printf και εμφανίζει απευθείας το label.Porque;

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

Βασικά αυτή η χρήση του goto σε C είναι παράδειγμα προς αποφυγή. Ελπίζω να μην άσκηση σε σχολή, αλλιώς θέλει "σκότωμα" ο καθηγητής σας :lol:

Όταν ο κώδικας μπορεί να υλοποιηθεί με loop τότε τον υλοποιούμε με loop και όχι με goto.

 

Ανεξάρτητα από το παραπάνω, αυτό που ρωτάς μπορείς να το βρεις σε λιγότερο από 5 λεπτά στον debugger του compiler σου ;)

 

EDIT:

 

Hint: δες τι κάνει η συνθήκη if που χρησιμοποιείς.

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

Δεν ξέρω αν φταίνε οι γνώσεις μου πάνω στη C(που δεν είναι ακόμα σε πολύ υψηλό επίπεδο)αλλά δεν μπορώ να βρω κανένα λάθος.

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

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα

  • Δημιουργία νέου...