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

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

Δημοσ.

...

Όχι βέβαια ότι ο OP θα χρησιμοποιήσει κάποιο σύστημα που δεν θα έχει ASCII αλλά δεν χάνει κάτι (ίσα ίσα κερδίζει ότι δεν χρειάζεται να θυμάται τα ascii codes) να χρησιμοποιεί input >= '0', input <= '9', input - '0' αντίστοιχα.

Κι αν τον ενδιαφέρει και η εντοπιότητα (locale) των γραμμάτων της αλφαβήτου, καλύτερα να χρησιμοποιεί την isalpha()

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

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

Δημοφιλείς Ημέρες

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

Δημοσ.

directx

 

 

Αφού indexing παίρνεις από την τιμή του char... γιατί να κάνεις extra indexing; :P

 

Από συνήθεια καθώς αυτό το πρόγραμμα θα το έλυνα αλλού με κάποιο map οπότε εκ πρώτης όψεως πας σε αυτό που έχεις πρόχειρο στο μυαλό σου ('a' => "Alpha" κλπ).

 

Τώρα συμφωνώ απόλυτα πως μπορεί να γίνει πολύ πιο compact σε C ως εξής:

 

 

 

>
/* NATO phonetic alphabet utility v2 */

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

int main(void)
{
char *Word[26] = { "Alpha" , "Bravo"   , "Charlie",
		   "Delta" , "Echo"    , "Foxtrot",
		   "Golf"  , "Hotel"   , "India"  ,
		   "Juliet", "Kilo"    , "Lima"   ,
		   "Mike"  , "November", "Oscar"  ,
		   "Papa"  , "Quebek"  , "Romeo"  ,
		   "Sierra", "Tango"   , "Uniform",
		   "Victor", "Whiskey" , "Xray"   ,
		   "Yankee", "Zulu"
	};

int Chr;

unsigned char KnownChr;

/* On '.' quit */
while((Chr = getchar()) != '.')
{
	/* Process 0 to 9 digits (chrs) */
	if(isdigit(Chr))
	{
		int Number = Chr - '0';

		putchar(' ');

		while(Number--)
			putchar('*');

		putchar(' ');
	}
	else
	{
		/* Process a to z letters (chrs) */
		const int LChr = Chr - 'a';

		const unsigned char UnknownChr = LChr < 0 || LChr > 25;

		if(UnknownChr)
			printf(" %c", Chr);
		else
			printf(" %s", Word[LChr]);
	}
}

return 0;
}

ΕΙΣΟΔΟΣ:

>
Insomnia 9

ΕΞΟΔΟΣ:

>
I November Sierra Oscar Mike November India Alpha   *********

Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες

 

 

Δημοσ.

Ακουστε.

 

αρχιζω απο αυτο που μου εξηγησε ο haldol,για τους ASCII αριθμους.Καταλαβα τα οσα μου ειπε,ομως πρεπει να τα μελετησω και λιγο μονος μου προκειμενου να τα κατανοησω σωστα..ως υλοποιηση παντως φαινεταιι ευκολος τροπος,στην πραξη τωρα μενει να δουμε..

 

για τους πινακες που ειπατε,ακομα δεν τους εχω συνηθισει και πολυ και το e-book που ακολουθω,δεν εχει αναφερει ακομα τιποτα για πινακες.

 

παπι εσυ εννοεις οτι το switch αυτο ειναι μεγαλο?ή υπαρχει καποιο αλλο θεμα γενικοτερα με τα switch?πχ δεν ειναι ευελικτα σε πιο συνθετα προγραμματα?φανταζομαι πιο πολυ το τελευταιο θα εννοεις,λογω μεγαλου μηκους που προκυπτει..

 

directx την λυση που εβαλες εσυ την καταλαβαινω ως κωδικα,αλλα μονος μου δεν θα τα καταφερνα να την φτιαξω..ακομα το παω πιο απλα:D

 

μεχρι τωρα εχω κανει αυτο:

 

 

>
#include <stdio.h>

main()
{
int i,c;

while ((c = getchar()) != '.')
   	switch(c){
       	case 'a':
           	printf("Alpha");
           	break;
       	case 'b':
           	printf("Bravo");
           	break;
       	case 'c':
           	printf("Charlie");
           	break;
       	case 'd':
           	printf("Delta");
           	break;
       	case 'e':
           	printf("Echo");
           	break;
       	case 'f':
           	printf("Foxtrot");
           	break;
       	case 'g':
           	printf("Golf");
           	break;
       	case 'h':
           	printf("Hotel");
           	break;
       	case 'i':
           	printf("India");
           	break;
       	case 'j':
           	printf("Juliet");
           	break;
       	case 'k':
           	printf("Kilo");
           	break;
       	case 'l':
           	printf("Lima");
           	break;
       	case 'm':
           	printf("Mike");
           	break;
       	case 'n':
           	printf("November");
           	break;
       	case 'o':
           	printf("Oscar");
           	break;
       	case 'p':
           	printf("Papa");
           	break;
       	case 'q':
           	printf("Quebek");
           	break;
       	case 'r':
           	printf("Romeo");
           	break;
       	case 's':
           	printf("Sierra");
           	break;
       	case 't':
           	printf("Tango");
           	break;
       	case 'u':
           	printf("Uniform");
           	break;
       	case 'v': 
           	printf("Victor");
           	break;
       	case 'w':
           	printf("Whiskey");
           	break;
       	case 'x':   
           	printf("Xray");
           	break;
       	case 'y':   
           	printf("Yankee");
           	break;
       	case 'z':
           	printf("Zulu");
           	break; 
       	case '1':
           	for(i=0;i<1;i++){
               	printf("*");
           	}
           	break;
       	case '2':
           	for(i=0;i<2;i++){
               	printf("*");
           	}
           	break;
			case '3':
           	for(i=0;i<3;i++){
               	printf("*");
           	}
           	break;
			case '4':
           	for(i=0;i<4;i++){
               	printf("*");
           	}
           	break;
			case '5':
           	for(i=0;i<5;i++){
               	printf("*");
           	}
           	break;
			case '6':
           	for(i=0;i<6;i++){
               	printf("*");
           	}
           	break;
			case '7':
           	for(i=0;i<7;i++){
               	printf("*");
           	}
           	break; 
			case '8':
           	for(i=0;i<8;i++){
               	printf("*");
           	}
           	break;
			case '9':
           	for(i=0;i<9;i++){
               	printf("*");
           	}
           	break;   			
       	default:
           	putchar(c);
           	break;
   	}

}

 

 

Δημοσ.

Ακουστε.

 

αρχιζω απο αυτο που μου εξηγησε ο haldol,για τους ASCII αριθμους.Καταλαβα τα οσα μου ειπε,ομως πρεπει να τα μελετησω και λιγο μονος μου προκειμενου να τα κατανοησω σωστα..ως υλοποιηση παντως φαινεταιι ευκολος τροπος,στην πραξη τωρα μενει να δουμε..

 

για τους πινακες που ειπατε,ακομα δεν τους εχω συνηθισει και πολυ και το e-book που ακολουθω,δεν εχει αναφερει ακομα τιποτα για πινακες.

 

παπι εσυ εννοεις οτι το switch αυτο ειναι μεγαλο?ή υπαρχει καποιο αλλο θεμα γενικοτερα με τα switch?πχ δεν ειναι ευελικτα σε πιο συνθετα προγραμματα?φανταζομαι πιο πολυ το τελευταιο θα εννοεις,λογω μεγαλου μηκους που προκυπτει..

 

directx την λυση που εβαλες εσυ την καταλαβαινω ως κωδικα,αλλα μονος μου δεν θα τα καταφερνα να την φτιαξω..ακομα το παω πιο απλα:D

 

μεχρι τωρα εχω κανει αυτο:

 

 

>
#include <stdio.h>

main()
{
int i,c;

while ((c = getchar()) != '.')
   	switch(c){
       	case 'a':
           	printf("Alpha");
           	break;
       	case 'b':
           	printf("Bravo");
           	break;
       	case 'c':
           	printf("Charlie");
           	break;
       	case 'd':
           	printf("Delta");
           	break;
       	case 'e':
           	printf("Echo");
           	break;
       	case 'f':
           	printf("Foxtrot");
           	break;
       	case 'g':
           	printf("Golf");
           	break;
       	case 'h':
           	printf("Hotel");
           	break;
       	case 'i':
           	printf("India");
           	break;
       	case 'j':
           	printf("Juliet");
           	break;
       	case 'k':
           	printf("Kilo");
           	break;
       	case 'l':
           	printf("Lima");
           	break;
       	case 'm':
           	printf("Mike");
           	break;
       	case 'n':
           	printf("November");
           	break;
       	case 'o':
           	printf("Oscar");
           	break;
       	case 'p':
           	printf("Papa");
           	break;
       	case 'q':
           	printf("Quebek");
           	break;
       	case 'r':
           	printf("Romeo");
           	break;
       	case 's':
           	printf("Sierra");
           	break;
       	case 't':
           	printf("Tango");
           	break;
       	case 'u':
           	printf("Uniform");
           	break;
       	case 'v': 
           	printf("Victor");
           	break;
       	case 'w':
           	printf("Whiskey");
           	break;
       	case 'x':   
           	printf("Xray");
           	break;
       	case 'y':   
           	printf("Yankee");
           	break;
       	case 'z':
           	printf("Zulu");
           	break; 
       	case '1':
           	for(i=0;i<1;i++){
               	printf("*");
           	}
           	break;
       	case '2':
           	for(i=0;i<2;i++){
               	printf("*");
           	}
           	break;
			case '3':
           	for(i=0;i<3;i++){
               	printf("*");
           	}
           	break;
			case '4':
           	for(i=0;i<4;i++){
               	printf("*");
           	}
           	break;
			case '5':
           	for(i=0;i<5;i++){
               	printf("*");
           	}
           	break;
			case '6':
           	for(i=0;i<6;i++){
               	printf("*");
           	}
           	break;
			case '7':
           	for(i=0;i<7;i++){
               	printf("*");
           	}
           	break; 
			case '8':
           	for(i=0;i<8;i++){
               	printf("*");
           	}
           	break;
			case '9':
           	for(i=0;i<9;i++){
               	printf("*");
           	}
           	break;   			
       	default:
           	putchar(c);
           	break;
   	}

}

 

 

Α, οπότε είσαι ακόμα στην πολύ αρχή.

 

Οκ, στη C ο char (χαρακτήρας) υλοποιείται εσωτερικά ως int, σύμφωνα με το ASCII table: http://www.asciitable.com/... άρα ο αγγλικός χαρακτήρας 'A' είναι ο ακέραιος 65, ο χαρακτήρας '0' είναι ο ακέραιος 48, και πάει λέγοντας σύμφωνα με τον πίνακα ASCII.

 

Εφόσον δεν έχεις φτάσει ακόμα σε πίνακες, κράτα το switch όπως το έχεις για τα γράμματα, αλλά μετά το z μπορείς να εκμεταλλευτείς το ASCII table ως εξής...

 

>
...
switch (c)
{
...
case 'z':
       	puts( "Zulu" );
       	break;

   default:
   	if ( isdigit(c) )
       	for (int i=0; i < c - '0'; i++)
  				putchar( '*' );
   	break;
}

(ένας άλλος τρόπος είναι να ελέγχεις το isdigit( c ) έξω από το switch κι αν είναι false τότε να μπαίνεις στο switch).

 

Βασικά αυτό που κάνει η συνθήκη του for είναι να αφαιρεί τον ASCII κωδικό του c από τον ASCII κωδικό του '0', οπότε εφόσον έχουμε σιγουρέψει πως είναι όντως digit το c (με την isdigit()) χρειαζόμαστε μονάχα ένα for για όποιο ψηφίο κι αν μας έδωσε.

Δημοσ.

Ακουστε.

 

αρχιζω απο αυτο που μου εξηγησε ο haldol,για τους ASCII αριθμους.Καταλαβα τα οσα μου ειπε,ομως πρεπει να τα μελετησω και λιγο μονος μου προκειμενου να τα κατανοησω σωστα..ως υλοποιηση παντως φαινεταιι ευκολος τροπος,στην πραξη τωρα μενει να δουμε..

 

για τους πινακες που ειπατε,ακομα δεν τους εχω συνηθισει και πολυ και το e-book που ακολουθω,δεν εχει αναφερει ακομα τιποτα για πινακες.

 

παπι εσυ εννοεις οτι το switch αυτο ειναι μεγαλο?ή υπαρχει καποιο αλλο θεμα γενικοτερα με τα switch?πχ δεν ειναι ευελικτα σε πιο συνθετα προγραμματα?φανταζομαι πιο πολυ το τελευταιο θα εννοεις,λογω μεγαλου μηκους που προκυπτει..

 

directx την λυση που εβαλες εσυ την καταλαβαινω ως κωδικα,αλλα μονος μου δεν θα τα καταφερνα να την φτιαξω..ακομα το παω πιο απλα:D

 

μεχρι τωρα εχω κανει αυτο:

 

 

>
#include <stdio.h>

main()
{
int i,c;

while ((c = getchar()) != '.')
   	switch(c){
       	case 'a':
           	printf("Alpha");
           	break;
       	case 'b':
           	printf("Bravo");
           	break;
       	case 'c':
           	printf("Charlie");
           	break;
       	case 'd':
           	printf("Delta");
           	break;
       	case 'e':
           	printf("Echo");
           	break;
       	case 'f':
           	printf("Foxtrot");
           	break;
       	case 'g':
           	printf("Golf");
           	break;
       	case 'h':
           	printf("Hotel");
           	break;
       	case 'i':
           	printf("India");
           	break;
       	case 'j':
           	printf("Juliet");
           	break;
       	case 'k':
           	printf("Kilo");
           	break;
       	case 'l':
           	printf("Lima");
           	break;
       	case 'm':
           	printf("Mike");
           	break;
       	case 'n':
           	printf("November");
           	break;
       	case 'o':
           	printf("Oscar");
           	break;
       	case 'p':
           	printf("Papa");
           	break;
       	case 'q':
           	printf("Quebek");
           	break;
       	case 'r':
           	printf("Romeo");
           	break;
       	case 's':
           	printf("Sierra");
           	break;
       	case 't':
           	printf("Tango");
           	break;
       	case 'u':
           	printf("Uniform");
           	break;
       	case 'v': 
           	printf("Victor");
           	break;
       	case 'w':
           	printf("Whiskey");
           	break;
       	case 'x':   
           	printf("Xray");
           	break;
       	case 'y':   
           	printf("Yankee");
           	break;
       	case 'z':
           	printf("Zulu");
           	break; 
       	case '1':
           	for(i=0;i<1;i++){
               	printf("*");
           	}
           	break;
       	case '2':
           	for(i=0;i<2;i++){
               	printf("*");
           	}
           	break;
			case '3':
           	for(i=0;i<3;i++){
               	printf("*");
           	}
           	break;
			case '4':
           	for(i=0;i<4;i++){
               	printf("*");
           	}
           	break;
			case '5':
           	for(i=0;i<5;i++){
               	printf("*");
           	}
           	break;
			case '6':
           	for(i=0;i<6;i++){
               	printf("*");
           	}
           	break;
			case '7':
           	for(i=0;i<7;i++){
               	printf("*");
           	}
           	break; 
			case '8':
           	for(i=0;i<8;i++){
               	printf("*");
           	}
           	break;
			case '9':
           	for(i=0;i<9;i++){
               	printf("*");
           	}
           	break;   			
       	default:
           	putchar(c);
           	break;
   	}

}

 

 

 

 

Δες τον κώδικα και συμπλήρωσε τα υπόλοιπα :)

 

 

 

>
/* 
* File:   main.c
* Author: timonkaipumpa
*
* Created on July 12, 2012, 12:06 PM
*/

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

/*
* 
*/
int main(int argc, char** argv) {

   int c;

   char pStr1[] = "Alpha\0";
   char pStr2[] = "Bravo\0";
   char pStr3[] = "Charlie\0";

   char* pStrArr[] = {pStr1, pStr2, pStr3};

   while ( (c = getchar()) != '.' )
   {
       if ( (c >= 65 && c <= 90) || (c >= 97 && c <= 122) )
       {
           if ( c <= 90 )
           {
               c = c - 65;
           } else {
               c = c - 97;
           }

           printf("%s\n", pStrArr[c]);
       } else {
           if ( c >= 48 && c <= 57 )
           {
               for ( c = c - 48; c > 0; c--)
               {
                   printf("*");
               }
               printf("\n");
           }
       }
   }

   return (EXIT_SUCCESS);
}

 

Tested with GNU MAC tool collection

 

 

 

edit: Μικρή αλλαγή στο for.

Δημοσ.

Δες τον κώδικα και συμπλήρωσε τα υπόλοιπα :)

 

 

 

>
/* 
* File:   main.c
* Author: timonkaipumpa
*
* Created on July 12, 2012, 12:06 PM
*/

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

/*
* 
*/
int main(int argc, char** argv) {

   int c;

   char pStr1[] = "Alpha\0";
   char pStr2[] = "Bravo\0";
   char pStr3[] = "Charlie\0";

   char* pStrArr[] = {pStr1, pStr2, pStr3};

   while ( (c = getchar()) != '.' )
   {
       if ( (c >= 65 && c <= 90) || (c >= 97 && c <= 122) )
       {
           if ( c <= 90 )
           {
               c = c - 65;
           } else {
               c = c - 97;
           }

           printf("%s\n", pStrArr[c]);
       } else {
           if ( c >= 48 && c <= 57 )
           {
               for ( c = c - 48; c > 0; c--)
               {
                   printf("*");
               }
               printf("\n");
           }
       }
   }

   return (EXIT_SUCCESS);
}

 

Tested with GNU MAC tool collection

 

 

 

edit: Μικρή αλλαγή στο for.

περιμενε..

εσυ το κανεις με πινακα απ'οτι βλεπω,ετσι δεν ειναι?

 

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

 

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

Δημοσ.

όχι με πίνακα...

 

Αλλά με πίνακα από πίνακες...

 

 

Μιας και είναι όλα για αρχή... θα πρότεινα να τα δεις μαζεμένα. Νομίζω θα κερδίσεις χρόνο... (at least, εμένα θα με βόλευε).. αλλά πάλι, είναι όπως βολεύει τον καθένα :)

Δημοσ.

όχι με πίνακα...

 

Αλλά με πίνακα από πίνακες...

 

 

Μιας και είναι όλα για αρχή... θα πρότεινα να τα δεις μαζεμένα. Νομίζω θα κερδίσεις χρόνο... (at least, εμένα θα με βόλευε).. αλλά πάλι, είναι όπως βολεύει τον καθένα :)

με πινακα απο πινακες?ακομη χειροτερα δηλαδη:P

 

κοιταξε,ειχα ξαναδιαβασει C παλιοτερα,σκορπια ομως και καθολου μαζεμενα ή συγκεντρωμενα..οποτε τωρα θελω να παρω καποιες βασεις,οτι μαθω να το μαθω σιγουρα και καλα..ωστε να προσωρησω μετα σε μεγαλυτερο βαθος..

 

εσυ τι προτινεις ακριβως?να τα μαθω ολα μαζι (πινακες,συναρτησεις,επαναληψεις κτλπ)και οχι σταδιακα,με ασκησεις στο καθενα?

Δημοσ.

Άμα μπλέξεις με 2D πίνακες αυτή τη στιγμή μάλλον θα χάσεις τη μπάλα. Όντως είναι πιο καλή υλοποίηση από τα switch αλλά δε θα το καταφέρεις.

 

Ένας πίνακας structs που να έχει μέσα τα strings και τους χαρακτήρες ίσως να ήταν πιο εύκολος.

Δημοσ.

 

 

>
char *Word[26] = { "Alpha" , "Bravo"   , "Charlie",
		   "Delta" , "Echo"    , "Foxtrot",
		   "Golf"  , "Hotel"   , "India"  ,
		   "Juliet", "Kilo"    , "Lima"   ,
		   "Mike"  , "November", "Oscar"  ,
		   "Papa"  , "Quebek"  , "Romeo"  ,
		   "Sierra", "Tango"   , "Uniform",
		   "Victor", "Whiskey" , "Xray"   ,
		   "Yankee", "Zulu"
	};

 

 

 

Δες τον κώδικα και συμπλήρωσε τα υπόλοιπα :)

 

>
   char pStr1[] = "Alpha\0";
   char pStr2[] = "Bravo\0";
   char pStr3[] = "Charlie\0";

   char* pStrArr[] = {pStr1, pStr2, pStr3};

Ο παραπάνω τρόπος του DirectX δεν είναι πιο όμορφος (και πιο scalable) από τους δύο πίνακες ?

 

>
   while ( (c = getchar()) != '.' )
   {
       if ( (c >= 65 && c <= 90) || (c >= 97 && c <= 122) )
       {
           if ( c <= 90 )
           {
               c = c - 65;
           } else {
               c = c - 97;
           }

           printf("%s\n", pStrArr[c]);
       } else {
           if ( c >= 48 && c <= 57 )
           {
               for ( c = c - 48; c > 0; c--)
               {
                   printf("*");
               }
               printf("\n");
           }
       }
   }

   return (EXIT_SUCCESS);
}

 

Εδώ δεν θα είναι πιο όμορφο και λιγότερο μπερδευτικό αν χρησιμοποιήσει τις is* συναρτήσεις του ctype.h ? Έτσι δεν θα χρειάζεται να βλέπει 97,122 και γενικά μαγικούς αριθμούς. πχ:

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

int main(int argc, char** argv) {

   int c;

   char pStr1[] = "Alpha\0";
   char pStr2[] = "Bravo\0";
   char pStr3[] = "Charlie\0";

   char* pStrArr[] = {pStr1, pStr2, pStr3};

   while ( (c = getchar()) != '.' )
   {
       if (isalpha(c))
       {
           if (isupper(c))
               c = c - 'A';
           else
               c = c - 'a';

           printf("%s\n", pStrArr[c]);
       } else {
           if (isdigit(c))
           {
               for ( c = c - '0'; c > 0; c--)
                   printf("*");
               printf("\n");
           }
       }
   }

   return (EXIT_SUCCESS);
}

 

Εκτός από ομορφιά, οι is* συναρτήσεις έχουν 2 πλεονεκτήματα τα οποία όμως δεν μας ενδιαφέρουν στη παρούσα περίπτωση:

1) Υποστηρίζουν locales οπότε θα παίξουν σωστά και με γράμματα εκτός του παραπάνω εύρους όπως πχ αυτά που έχουν umlaut και τέτοια.

2) Παίζουν σωστά παντού. Το πρότυπο της C εγγυάται ότι οι αριθμοί θα είναι συνεχόμενοι αλλά όχι και τα γράμματα. Έτσι ακόμη και όταν χρησιμοποιούμε literals (πχ c > 'a' && c < 'z') και όχι ascii κωδικούς δεν είναι εγγυημένο ότι θα παίξει σωστά. Πρακτικά βέβαια δεν νομίζω να χρησιμοποιεί κανείς EBCDIC ή κάτι παρόμοιο.

Δημοσ.

imitheos έχεις δίκιο... αλλά δεν ήθελα να χρησιμοποιήσω έτοιμες συναρτήσεις (νομίζω, ζήτησε κάτι τέτοιο στην αρχή ο ts) συν ότι ήθελα να φανεί η ανάθεση του δείκτη σε δείκτη (που κάνει ακριβώς το ίδιο ο direct).

Δημοσ.

+1 στον imitheo.

 

Στη χειρότερη περίπτωση ακόμα και χωρίς τις char classification functions θα έπρεπε τουλάχιστον να λέει c > 'a' αντί για ascii codes.

Δημοσ.

imitheos έχεις δίκιο... αλλά δεν ήθελα να χρησιμοποιήσω έτοιμες συναρτήσεις (νομίζω, ζήτησε κάτι τέτοιο στην αρχή ο ts) συν ότι ήθελα να φανεί η ανάθεση του δείκτη σε δείκτη (που κάνει ακριβώς το ίδιο ο direct).

Α, λάθος μου τότε. [shame]Δεν διάβασα το νήμα από την αρχή :P[/shame]. Με literals πάντως κατά τη γνώμη μου είναι πιο εύκολο για ένα αρχάριο που (δυστυχώς) μπορεί να μην έχει ακούσει καν το ascii.

Δημοσ.

Το ASCII πάντως πρέπει να το μάθει έτσι κι αλλιώς IMHO, όσο νωρίτερα τόσο καλύτερα.

 

Όπως και να 'χει, επειδή βαριόμουν, έγραψα στα γρήγορα ένα μικρό προγραμματάκι που κάνει ότι ζητάει ο φίλος μας, με fixed-size 2d πίνακα για το λεξικό, που το διαβάζει είτε από την stdin είτε από text αρχείο, με επιλογή του κατάλληλου pre-processor στην αρχή του κώδικα.

 

Μπορεί να χει bugs γιατί δεν το τεστάρισα και πολύ.

 

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

 

 

 

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

#define MAXLEN_WORD		255+1				// max letter per word
#define MAX_LETTSLOTS		26				// letter slots

#define ISVALID(c)		( isdigit(c) || isalpha(c) )	// input validation
#define HASH(c)			( tolower(c) - 'a' )		// hash "function"
#define CHR2DIG(c)		( isdigit(c) ? (c) - '0' : -1 )	// map char to digit value

/*
* uncomment the last 2 lines to read dict words from stdin instead of the "a3.txt" file
*/
#define FP_DICT			( fopen("a3.txt", "r") )	// dict file to be read
//#undef FP_DICT
//#define FP_DICT		stdin				// reads from stdin instead

#define FCLOSE(fp)			\
if ( (fp) && (fp) != stdin )	\
	fclose(fp);

//-----------------------------------------------
// populate dictionary with words from fp (one word per starting letter)
//
bool dict_populate( char dict[MAX_LETTSLOTS][MAXLEN_WORD], FILE **fp )
{
char word[MAXLEN_WORD] = {'\0'};
short int i = 0;

if ( !fp || !*fp)
	return false;

// clear dict (just in case)
memset( dict, '\0', MAX_LETTSLOTS * MAXLEN_WORD * sizeof(char) );

// do the population
puts( "POPULATING THE DICTIONARY..." );
for ( ;; )
{
	// read a word from fp
	if ( stdin == (*fp) )
		printf( "type a word (or a non-letter to stop): " );
	if ( !fgets(word, MAXLEN_WORD, *fp)    // read line
	|| NULL == strtok( word, "\n\t ") )	// keep only 1st word
		break;
 
	// terminate on non-letter input
	if ( !isalpha( *word ) )
		break;

	// hash word to dict (overwrite anything already in that slot)
	if ( '\0' != *dict[ (i=HASH(*word)) ] )
		printf( "\t*** old word: %s replaced by %s\n", dict[i], word );
	strcpy( dict[i], word );
}

// premature end of reading?
if ( ferror(*fp) ) {
	puts("\t*** file error!");
	goto ret_false;
}

FCLOSE( *fp );
return true;

ret_false:
FCLOSE( *fp );
return false;
}

//-----------------------------------------------
// print dictionary (skip blank slots)
//
void dict_print( char dict[MAX_LETTSLOTS][MAXLEN_WORD] )
{
for (int i=0; i < MAX_LETTSLOTS; i++)
	if ( *(dict[i]) )
		puts( dict[i] );

return;
}

//-----------------------------------------------
// handle alphabet characters ('a' to 'z')
//
bool do_alpha( char dict[MAX_LETTSLOTS][MAXLEN_WORD], const char c )
{
char *cp = NULL;

if ( !isalpha(c) )
	return false;

cp = dict[ HASH(c) ];
puts( '\0' != *cp ? cp : "\t*** dict contains NO word starting with that letter" );

return true;
}

//-----------------------------------------------
// handle digit characters (0 to 9)
//
bool do_digit( const char c )
{
int n = CHR2DIG(c);

if ( -1 == n )
	return false;

for (int i=0; i < n; i++)
	putchar( '*' );

putchar( '\n' );

return true;
}

//-----------------------------------------------
int main( void )
{
char dict[MAX_LETTSLOTS][MAXLEN_WORD] = {"\0"};		// near initialization
char c = '\0';
FILE *fp = FP_DICT;					// file handle of dict

// validation check for the dictionary file
if ( !fp ) {
	puts( "\t*** unable to open requested file!" );
	goto exit_failure;
}
// populate the dictionary in memory at runtime
if ( !dict_populate( dict, &fp ) ) {
	puts( "\t*** dictionary population failed!" );
	goto exit_failure;
}
// print populated dictionary
dict_print( dict );

// interact with the user
puts( "Type a letter or a digit (type . to exit)" );
for (;
{
	if ( '\n' != c )
		printf( "> " );
	if ( '.' == (c = getchar()) )
		break;

	if ( !do_alpha(dict, c) )
		do_digit( c );
}

exit(0);

exit_failure:
system( "pause" );
exit(1);

}

 

 

 

EDIT:

 

Α και ένα πρόχειρο a3.txt αρχείο δοκιμής, με περισσότερες της 1ας λέξεις από 'a', 'p' και 'z' (κρατιέται μόνο η τελευταία)

 

>
arch
antilope
pierce
zoo
clone
zone
party

Δημοσ.

καλα,σε πολλα σημεια την εχασα την μπαλα εκει μεσα migf1 :P

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

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

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

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

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

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

Σύνδεση

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

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

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