Jump to content

Μετατροπή από μικρά σε κεφαλαία στην C


johnykim
 Share

Recommended Posts

Παιδιά καλησπέρα.:)

Θα ήθελα να με βοηθήσετε λίγο σχετικά με ένα πρόγραμμα στην C.Είμαι πολύ αρχάριος(ένα μάθημα έχω κάνει στη σχολή).

Θέλω να φτιάξω ένα πρόγραμμα το οποίο να διαβάζει μικρά γράμματα και να τα μετατρέπει σε κεφαλαία.Επίσης το αποτέλεσμα να εμφανίζεται σε αντίστοιχο κώδικα ASCII.

Έχω φτάσει κάπως έτσι:


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

main()
{
char a;
printf("dwse mikra grammata\n");


a=getchar();
//scanf("%s",&a);

if (islower(a))
putchar(toupper(a));
else
printf("den exeis dwsei mikro gramma...\n");

printf("\n");

system("PAUSE");
return 0;
}

Δεν διαβάζει όμως όλους τους χαρακτήρες που δίνω,αλλά μόνο τον πρώτο.

Link to comment
Share on other sites

Αν θες να κάνεις μετατροπή μόνο ένα γράμμα κάθε φορά θα πρέπει να βάλεις έναν while/do while που θα τσεκάρει κάποια συνθήκη αν θα πρέπει να επαναλαμβάνετε το η μετατροπή ή όχι.

Link to comment
Share on other sites

Αν θες να κάνεις μετατροπή μόνο ένα γράμμα κάθε φορά θα πρέπει να βάλεις έναν while/do while που θα τσεκάρει κάποια συνθήκη αν θα πρέπει να επαναλαμβάνετε το η μετατροπή ή όχι.

Θα ήθελα να γίνονται όλα τα γράμματα κάθε φορά..

Εχω κάνει κάτι τέτοιο:


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

main()
{
char a;
printf("dwse mikra grammata\n");
if (islower(a))
{
do
{
a=getchar();
//scanf("%s",&a);
putchar(toupper(a));
}
while(a!='exit');
}
else
{
printf("den exeis dwsei mikro gramma...\n");
}

printf("\n");



system("PAUSE");
return 0;
}

Αλλά δεν βγάζει το "else".

Link to comment
Share on other sites

Θες να σε ρωτάει και να του δίνεις ένα ένα τον χαρακτήρα ή να γράφεις κάτι και να το μετατρέπει?

Αν θες το πρώτο τότε χρησιμοποιείς το επανάληψη

Αλλιώς πρέπει να δηλώσεις string (όπως λέγεται στις άλλες γλώσσες)

Στη δεύτερη περίπτωση το string δηλώνεται σαν πίνακας χαρακτήρων.

παράδειγμα

char a[200];

ο πίνακας a είναι πίνακας που περιέχει char και έχει μέγεθος 200.

Μετά πρέπει να κάνεις το ίδιο με το κάθε στοιχείο του πίνακα.

ΥΓ: μπορείς να αποθηκεύεις τον κάθε χαρακτήρα και σε int αλλά εκεί κάνει μετατροπή τον κάθε χαρακτήρα στον αντίστοιχο ASCII code. Αν προσέξεις όμως τον ASCII code τότε παρατηρείς ότι ο ASCII κωδικός του "a" παράδειγμα είναι 97 και του "Α" είναι 41

Αντίστοιχα για το b 98 και 42

και ούτω καθεξής

Παρατηρείς λοιπόν ότι έχουν διαφορά 56.

Αν λοιπόν αποθηκεύεις αυτό που σου δίνει ο χρήστης σε int πίνακα μετά για μετατροπή κάνεις μία απλή αφαίρεση 56 από κάθε στοιχείου του πίνακα.

(ο compiler παίζει να σε φωνάξει αν προσπαθήσεις να περάσεις χαρακτήρες σε integer αλλά νομίζω είναι απλό warning.)

happy coding

Link to comment
Share on other sites

Επειδή τέτοια ώρα τέτοια λόγια,θα ήθελα αν γίνεται στον κώδικα που έχω γράψει να κάνω μετατροπή του αποτελέσματος που βρίσκω σε ACSSI.Μήπως γνωρίζει κανείς πως να χρησιμοποιήσω την συνάρτηση toascii;Ή αν γίνεται φυσικά κ με άλλον τρόπο, πέρα της συνάρτησης αυτής.

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

Link to comment
Share on other sites

Όχι σωστά κατάλαβες όμως ανέφερες μικρά και κεφαλαία οπότε υπέθεσα ότι έχεις μόνο a-z ascii codes. Και το παραπάνω trick ισχύει μόνο στη C.

Link to comment
Share on other sites

δήλωσε την string.h στην αρχή

το char a; κάντο char a[20]; (ή οποιοδήποτε άλλο μέγεθος θέλεις να έχει)

σβήσε το a=getchar(); και βάλε στη θέση του scanf("%s", &a);

Με όλα αυτά έχεις καταφέρει να αποθηκεύσεις το string σε έναν πίνακα 20 χαρακτήρων.

Για να μετατρέψεις σε κεφαλαία και να τυπωθεί το string, δοκίμασε τον παρακάτω κώδικα. Δεν ξέρω αν δουλεύει.

int i;

for (i=0;i<20;i++) {

a = toupper(a);

printf("%c", a);

}

νομίζω για την εκτύπωση σε ascii αρκεί μόνο ένα printf("%d", a)

(μέσα σε μια δομή επανάληψης όπως παραπάνω φυσικά)

Link to comment
Share on other sites

Εντάξει, χθες είπαμε περισσότερα για την for, οπότε θα πειραματιστώ με τις επόμενες περισσότερο.

Ο τελικός κώδικας που χρησιμοποιήθηκε τελικά:

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

main()
{
char a;
printf("dwse mikra grammata kai '?'gia telos\n");


do
{
a=getchar();
putchar(toupper(a));
printf("\nXarakthras:%c ASCII Code:%d\n",a,a);
//printf("\nXarakthras:%c Dekaexadikh morfh:%x\n",a,a);
}
while(a!='?');


printf("\n");



system("PAUSE");
return 0;
}

Ευχαριστώ για τις απαντήσεις!:-)

Link to comment
Share on other sites

  • 1 month later...

Γεια!

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

Έχω κάνει κάποιες μικρές προεργασίες στην αρχή αλλά δεν επαρκούν καθόλου!

Η άσκηση που έχω είναι η εξής....

Το κρυπτόλεξο είναι ένα παιχνίδι στο οποίο ο παίκτης ψάχνει για κρυμμένες λέξεις σε

ένα 2 πίνακα χαρακτήρων. Οι λέξεις μπορεί να εμφανίζονται στον πίνακα αυτό

οριζόντια, κάθετα, και διαγώνια. Επίσης μπορεί να εμφανίζονται με κανονική φορά ή

ανάστροφη, σε όλες τις παραπάνω κατευθύνσεις (βλ. παράδειγμα παρακάτω). Το

κρυπτόλεξο περιέχει μόνο λατινικούς χαρακτήρες.

Ζητείται να δημιουργήσετε ένα πρόγραμμα (cryptwords.c) το οποίο, θα διαβάζει ένα

κρυπτόλεξο καθώς και ένα κατάλογο από λέξεις που είναι κρυμμένες σε αυτό. Το

κρυπτόλεξο είναι γραμμένο με μικρά γράμματα. Στη συνέχεια το πρόγραμμα σας θα

πρέπει να τυπώνει το κρυπτόλεξο στην κύρια έξοδο, στην ίδια μορφή (2 πίνακας) αλλά

με τις κρυμμένες λέξεις γραμμένες με κεφαλαία.

Η είσοδος των παραπάνω δεδομένων στο πρόγραμμα σας θα πρέπει να γίνεται ως εξής.

Το πρόγραμμα θα διαβάζει ένα αρχείο το οποίο θα περιέχει το 2 πίνακα του

κρυπτόλεξου. Μια γραμμή του αρχείου θα αντιστοιχεί σε μια γραμμή του πίνακα. Οι

κρυμμένες λέξεις θα δίδονται σε ένα δεύτερο αρχείο. Κάθε γραμμή του αρχείου θα

περιέχει μια κρυμμένη λέξη. Το πρόγραμμα σας θα πρέπει να ζητά από το χρήστη τα

ονόματα των 2 παραπάνω αρχείων.

Για τη λύση της άσκησης μπορείτε, εάν θέλετε, να υποθέσετε πως οι διαστάσεις του

πίνακα του κρυπτόλεξου δεν είναι μεγαλύτερες από 100 × 100. Επίσης μπορείτε, εάν

θέλετε, να υποθέσετε πως δίδεται ο μέγιστος αριθμός των κρυμμένων λέξεων είναι 100

και πως η κάθε λέξη δεν έχει παραπάνω από 100 χαρακτήρες.

Το πρόγραμμα σας θα πρέπει να εμφανίζει σχετικά μηνύματα όταν προκύψει κάποιο

σφάλμα, όπως π.χ. δεν βρεθεί κάποιο αρχείο, ή όταν δε βρεθεί μια λέξη μέσα στο

κρυπτόλεξο, ή εάν το αρχείο με το κρυπτόλεξο παρουσιάζει ασυνέπειες (π.χ. μια γραμμή

έχει λιγότερους χαρακτήρες από τις υπόλοιπες, ή περιέχει κεφαλαίους χαρακτήρες).

Θα χαιρόμουν πολύ αν με βοηθούσατε.... :o:weep:

Και σόρυ αν το γράφω το μήνυμα σε χώρο άσχετο αλλά σήμερα μπήκα στην ιστοσελίδα αυτή και δεν ξέρω πολλά πράγματα! :o

Link to comment
Share on other sites

loooool α ρε csd καταραμενο.

1. Μην περιμενεις κανενα να σου λυσει την ασκηση( δεν εχει και νοημα αλλωστε) προσπαθησε μονη σου και ρωτα ποιο συγκεκριμενα πραγματα.

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

3.Θα σου προτεινα να ξεκινησεις καπως ετσι

#include <stdio.h>

char seira[6]={'c','s','c','s','d','c'},leksh[3]={'c','s','d'};

.

. kai προσπαθησε να συγρινεις χαρακτηρα χαρακτηρα τουσ πινακες.

.

οριστε αν 8ες να κανεις εκχωρηση απο αρχεια κατευ8ειαν για εστω

text1.txt asdtsioyhfj kai text2.txt tsioy

FILE *crypt;

crypt = fopen("text3.txt","r");

if (crypt == NULL)

{

printf("File does not exist\n");

return 1;

}

while ((c1=getc(seira)) != EOF )

{

seira=c1;

i++;

if (char1=='\n') linechars=i; //gia na ksereis posa grammata

//exei h grammh soy

}

fclose(crypt);

FILE *word;

word = fopen("text2.txt","r");

if (word == NULL)

{

printf("File does not exist\n");

return 1;

}

while ((c2=getc(word)) !=EOF )

{

le3h[j]=c2;

letters++; //ari8mosgrammatwnle3hs

if (c2 == '\n')

//ka8e fora pou allazei seira to arxeio me tis le3eis kanei compare meta3u

// seiras kai le3hs

καλη τυχη πειραματισου μονη σου καλη υπομονη και γω απο πικρα σε πικρα ειμαι με την κωλοασκηση.

Link to comment
Share on other sites

ευχαριστω !

Αλλα το προβλημα μου ειναι στην αναζητηση!

δες τι εχω κανει μεχρι στιγμης εγω....

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define CRYPT_X 17

#define CRYPT_Y 15

#define WORDS_MAX 54

int words_count = 0;

char *words[WORDS_MAX];

char crypt[CRYPT_X][CRYPT_Y];

void read_words(void);

void read_crypt(void);

int main(void)

{

int i,j;

read_words();

read_crypt();

// test gia na doume oti exoume se pinaka tis lexeis

for (i = 0; i < words_count; ++i)

printf("%s\n", words);

// test gia na doume oti apothikeusame to kryptolexo ston disdiastato

printf("KRYPTOLEXO:\n");

for (i = 0; i < CRYPT_X; ++i)

{

for (j = 0; j < CRYPT_Y; ++j)

{

printf("%c", crypt[j]);

}

printf("\n");

}

return 0;

}

void read_crypt(void)

{

int c, x = 0, y = 0;

FILE *f = fopen("crypt.txt", "r");

if (!f)

{

printf("cannot open file crypt.txt\n");

exit(EXIT_FAILURE);

}

while ((c = fgetc(f)) != EOF)

{

if (c == '\n')

{

++x;

y = 0;

}

else

{

crypt[x][y++] = c;

}

}

fclose(f);

}

void read_words(void)

{

int c;

int pos = 0;

int line = 0;

char buffer[512];

FILE *f = fopen("words.txt", "r");

if (!f)

{

printf("cannot open file words.txt\n");

exit(EXIT_FAILURE);

}

while (1)

{

c = fgetc(f);

if (c != '\n' && c != EOF)

{

if (c != '\r')

buffer[pos++] = c;

}

else

{

++words_count;

buffer[pos] = '\0';

words[line++] = strdup(buffer);

pos = 0;

}

if (c == EOF)

break;

}

fclose(f);

}

Link to comment
Share on other sites

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

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

μηπως ξερεις να απαντησεις στο αλλο τοπικ(δευτερο) γιατι εχω πεθανει στα error?

Link to comment
Share on other sites

@aria_pra, Akyriak Όταν παραθέτεται κώδικα καλό είναι να γράφεται μέσα σε CODE tag. Δηλαδή:

this is code

this is NOT code.

Η διαφορά είναι στο ότι σε ότι θέλω να είναι σε code το βάζω μέσα σε [ code] [ /code] (χωρίς το κενό)

Αυτό βοηθάει στο να φαίνεται το κείμενο όπως το έγραψες και να διατηρεί τα κενά. (monospace font)

Link to comment
Share on other sites

  • 4 years later...

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

 

Έχω κάνει κάτι αλλά μου βγάζει ότι έχω κάνει κάτι λάθος...

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char lower (char str[100],char small_text,int j)
 
int main ()
{
char ptr[100],lower_text;
int i;
 
lower_text= lower(ptr[100],lower_text,i);
printf("The text to lower case is: %s\n",ptr,lower_text);
 
return 0;
}
 
char lower (char str[100],char small_text,int j)
{
while(1)
{
printf("Enter text to upper case:");
gets(str);
 
j=small_text=0;
while(str[j] !='\0')
{
if(str[j]>='A' && str[j]<='Z')
{
str[j]+=32;
small_text++;
}
j++;
}
}
return 1;
}
 
Link to comment
Share on other sites

#include<stdio.h>

int tolower(int c)

{

return (c >= 'A' && c <= 'Z') ? (c+32) : (c);

}

int main()

{

int counter=0;

char mychar;

char str[100];

gets(str);

while (str[counter])

{

mychar=str[counter];

putchar (tolower(mychar));

counter++;

}

return 0;

}

  • Like 1
Link to comment
Share on other sites

#include<stdio.h>int tolower(int c){    return (c >= 'A' && c <= 'Z') ? (c+32) : (c);}int main(){	int counter=0;	char mychar;	char str[100];		gets(str);	while (str[counter])	{		mychar=str[counter];		putchar (tolower(mychar));		counter++;	}	return 0;}

As clean as it gets!

Παρόλα αυτά, για πραγματική χρήση δεν προτείνεται αυτός ο κώδικας για 2 λόγους:

  1. The most recent revision of the C standard (2011) has definitively removed this function from its specification.

    The function is deprecated in C++ (as of 2011 standard, which follows C99+TC3).

  2. Αν ξεπεράσεις τα 100 στοιχεία του πίνακα παίρνεις segmentation fault

Προφανώς το βέλτιστο είναι να κάνεις δυναμική διαχείριση της μνήμης ώστε να μην έχεις προβλήματα, και να μην χρησιμοποιήσεις την συνάρτηση gets καθώς, όπως λέει και ο gcc "warning: the `gets' function is dangerous and should not be used."

  • Like 1
Link to comment
Share on other sites

Εεεε, τότε... Αντί για gets τότε να είχε την παραδοσιακή scanf;

Και αντί για καρφωτή μεταβλήτη να βάζαμε pointer και αντικατάσταση του while με loop μέχρι να βρει null, δηλαδή for (i=0; str = 0; i++).

(ή full αριστοποίηση με malloc και free? :p :P )

  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...