ασκηση C με πινακες

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
kousanos
Δημοσιεύσεις: 3
Εγγραφή: 24 Ιουν 2009 07:17

ασκηση C με πινακες

Δημοσίευση από kousanos » 02 Δεκ 2009 15:53

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

Κώδικας: Επιλογή όλων

#include<stdio.h>
#include<stdlib.h>
char x&#91;128&#93;;
char isupper&#40;char&#91;&#93;,int k&#41;;
char iscon&#40;char x&#91;&#93;,int pos_psifia&#41;;
char isvowels&#40;char x&#91;&#93;,int pos_psifia&#41;;
int pos_psifia,k,i,j,timi;
 main&#40;&#41;
&#123;
  printf&#40;"dose sim"&#41;;
  gets&#40;x&#41;;
  	while&#40;x&#91;i&#93;&#41;		                                          // find the length of the sting
		&#123;
			i++;
		&#125;
			pos_psifia=i;
			printf&#40;"pos_psifia"&#41;;
			printf&#40;"%d",pos_psifia&#41;;
	if&#40;pos_psifia>128&#41;
	&#123;
		printf&#40;"dosate parapano xaraktires sto string"&#41;;    //elegxos megethos sumvoloseiras
		exit&#40;0&#41;;
	&#125;

	isupper&#40;x,pos_psifia&#41;;
    system&#40;"pause"&#41;;
&#125;




/********************************SINARTISEIS*****************************/
char isupper&#40;char x&#91;&#93;,int k&#41;
&#123;	
void isvowels&#40;char x&#91;&#93;,int c&#41;;
char tiposi&#91;128&#93;;
char kef&#91;&#93;="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char sim&#91;&#93;="BCDFGHGKLMNPQRSTVWXYZ";
int i,v=0;
char fon&#91;&#93;="AEOIU";
char sum&#91;&#93;="BCDFGHJKLMNPQRSTVWXYZ";
for&#40;i=0;i<=pos_psifia;i++&#41;
&#123;	timi=0;
	for&#40;k=0;k<=26;k++&#41;
	&#123;
		if&#40;x&#91;i&#93;==kef&#91;k&#93;&#41;
			&#123;
				tiposi&#91;i&#93;=kef&#91;k&#93;;
				timi=1;
			
			&#125;
	&#125;
		
	if &#40;timi==0&#41;
	&#123;
		printf&#40;"oxi"&#41;;
		exit&#40;0&#41;;
	&#125;

&#125;
	puts&#40;tiposi&#41;;
	isvowels&#40;x,pos_psifia&#41;;
	iscon&#40;x,pos_psifia&#41;;
    return&#40;0&#41;;
&#125;





	char isvowels&#40;char x&#91;&#93;,int pos_psifia&#41;
	&#123;
		char kef&#91;&#93;="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char sim&#91;&#93;="BCDFGHGKLMNPQRSTVWXYZ";
int i,f,b,fo&#91;128&#93;,thesi&#91;128&#93;,j,orio,temp_1,m,z,pos_fo,v=0;
char fon&#91;&#93;="AEOIU";
char sum&#91;&#93;="BCDFGHJKLMNPQRSTVWXYZ";
char kai&#91;128&#93;;
void iscon&#40;char x&#91;&#93;,int pos_psifia&#41;;
	 j=0;
	 f=0;
	for&#40;i=0;i<=pos_psifia;i++&#41;
	&#123;
		for&#40;k=0;k<=4;k++&#41;
		&#123;
			if&#40;x&#91;i&#93;==fon&#91;k&#93;&#41;
			&#123;
				fo&#91;j&#93;=i;
				j++;
			
			
			&#125;
		
		&#125;
	&#125;
		//EDO THA BEI IS CONSO
	iscon&#40;x,pos_psifia&#41;;
	
	
	pos_fo=j;
	
	
	

	for&#40;i=0;i<pos_fo;i++&#41;
	&#123;
		thesi&#91;i&#93;=fo&#91;i&#93;;
	&#125;


	if&#40;&#40;pos_fo%2&#41;==0&#41;
	&#123;
		orio=pos_fo/2;
		for&#40;i=0;i<orio;i++&#41;
		&#123;
			temp_1=fo&#91;i&#93;;
			fo&#91;i&#93;=fo&#91;pos_fo-i-1&#93;;
			fo&#91;pos_fo-i-1&#93;=temp_1;
		&#125;
		for&#40;b=0;b<pos_fo;b++&#41;
		&#123;
			z=thesi&#91;b&#93;;
			m=fo&#91;b&#93;;
			kai&#91;z&#93;=x&#91;m&#93;;
		&#125;
	&#125;
	else if&#40;&#40;pos_fo%2&#41;!=0&#41;
	&#123;
		orio=pos_fo%2;
			for&#40;i=0;i<orio;i++&#41;
		&#123;
			temp_1=fo&#91;i&#93;;
			fo&#91;i&#93;=fo&#91;pos_fo-i-1&#93;;
			fo&#91;pos_fo-i-1&#93;=temp_1;
		&#125;
		for&#40;b=0;b<pos_fo;b++&#41;
		&#123;
			z=thesi&#91;b&#93;;
			m=fo&#91;b&#93;;
			kai&#91;z&#93;=x&#91;m&#93;;
		&#125;
	&#125;


	for &#40;b=0;b<pos_fo;b++&#41;
		printf&#40;"%c",kai&#91;b&#93;&#41;;
	

&#125;




	char iscon&#40;char x&#91;&#93;,int pos_psifia&#41;
	&#123;
char kef&#91;&#93;="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char sim&#91;&#93;="BCDFGHGKLMNPQRSTVWXYZ";
int i,f,s,b,thesi1&#91;128&#93;,su&#91;128&#93;,orio,temp_1,m,z,pos_su,v=0;
char fon&#91;&#93;="AEOIU";
char sum&#91;&#93;="BCDFGHJKLMNPQRSTVWXYZ";
char kai&#91;128&#93;;
f=0;
	for&#40;i=0;i<=pos_psifia;i++&#41;
	&#123;
		
			for&#40;s=0;s<=20;s++&#41;
		&#123;
			if&#40;x&#91;i&#93;==sum&#91;s&#93;&#41;
			&#123;
				su&#91;f&#93;=i;
				f++;
			&#125;
		&#125;
	&#125;
pos_su=f;

	

	for&#40;i=0;i<pos_su;i++&#41;
	&#123;
		thesi1&#91;i&#93;=su&#91;i&#93;;
	&#125;

	if&#40;&#40;pos_su%2&#41;==0&#41;
	&#123;
		orio=pos_su/2;
		for&#40;i=0;i<orio;i++&#41;
		&#123;
			temp_1=su&#91;i&#93;;
			su&#91;i&#93;=su&#91;pos_su-i-1&#93;;
			su&#91;pos_su-i-1&#93;=temp_1;
		&#125;
		for&#40;b=0;b<pos_su;b++&#41;
		&#123;
			z=thesi1&#91;b&#93;;
			m=su&#91;b&#93;;
			kai&#91;z&#93;=x&#91;m&#93;;
		&#125;
	&#125;
	else if&#40;&#40;pos_su%2&#41;!=0&#41;
	&#123;
		orio=pos_su%2;
			for&#40;i=0;i<orio;i++&#41;
		&#123;
			temp_1=su&#91;i&#93;;
			su&#91;i&#93;=su&#91;pos_su-i-1&#93;;
			su&#91;pos_su-i-1&#93;=temp_1;
		&#125;
		for&#40;b=0;b<pos_su;b++&#41;
		&#123;
			z=thesi1&#91;b&#93;;
			m=su&#91;b&#93;;
			kai&#91;z&#93;=x&#91;m&#93;;
		&#125;
	
    
    &#125;

	for &#40;b=0;b<pos_su;b++&#41;
		printf&#40;"%c",kai&#91;b&#93;&#41;;

	&#125;

nkast
Δημοσιεύσεις: 137
Εγγραφή: 15 Νοέμ 2009 20:31
Επικοινωνία:

ασκηση C με πινακες

Δημοσίευση από nkast » 31 Δεκ 2009 09:01

Δεν κατάλαβα!
Η αντιστροφή θα γίνει στον πίνακα με τα κεφαλαία; Η στον αρχικό πίνακα;
Τί θα γίνει αν δώσω και μικρά;

Εστω οτι δίνουμε 'KOUSANOS'.
Θα πρέπει να επιστρέψει
1) 'OAUO' & 'SNSK'
ή
2) 'SOANUSOK' ;

Για το 2 θα πρεπει να δουλεψεις επάνω στον ίδιο πινακα και οχι να μεταφερεις τους χαρακτήρες σε δευτερο.
Αν πάλι είναι το 1 , τι ενοεις δεν δουλευει; δεν παιρνεις το αναμενομενο αποτελεσμα ή σου 'βαραει';

Οπως και αν έχει, τα εχεις κάνει μπάχαλο! :hammer: Προσπάθησε να σπάσεις το προγραμμα σε ποιο κατανοητες λογικες οντότητες.
Οταν βλέπω συνάρτηση isupper καταλαβαίνω οτι κανει κατι πολυ συγκεκριμένο. Αλλα εσυ πας και καλεις τις isvowels(...) & iscon(...) εκει μέσα! Λογικά αυτές θα επρεπε να είναι στο main.

Ξεκίνα απο χαμηλά φτίαχνοντας 3 απλές συναρτήσεις
bool isUpper(char ch);
bool isVowel(char ch);
bool isUpper(char ch);
Αυτές θα παίρνουν ενα χαρακτήρα και θα επιστρέφουν TRUE/FALSE αναλόγος. Μην μπείς στο πειρασμό να βάλεις τίποτα αλλο εκει μεσα πέρα απο αυτο που λέει το ονομα τους.
Συνέχεισε απο εκει και χτίσε σιγα σιγα το πρόγραμμα σου.

Το ποιο σωστό είναι να ξεκινίσεις απο ψηλά προς τα κάτω αλλα δεν μπορω να βοηθείσω γιατι δεν εχω καταλάβει τι ακριβως ζητάει η ασκηση. :-?

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

ασκηση C με πινακες

Δημοσίευση από alex599 » 31 Δεκ 2009 11:22

Κατ'αρχήν μάθε να γράφεις πιο καθαρά και αν το πρόγραμμα γίνεται σπαγγέτι στην κυριολεξία έστω και αν χρησιμοποιεις συναρτήσεις, γράφε ΣΧΟΛΙΑ! Να καταλαβαίνουμε τι κάνει κάθε συνάρτηση ή τι δείχνει μια μεταβλητή. Έτσι όπως το βλέπω έχει αρκετά λάθη. Ακόμη τα printf() σου να έχουν πιο καθαρά μηνύματα το printf("oxi") δεν μ λέει τίποτα για το τι ήταν λάθος.

Οι συναρτήσεις δεν χρειάζεται να είναι char αν δεν επιστρέφουν τίποτα! Βάλτες καλύτερα void.
Μετά, με την exit(0) τερματίζει άμεσα το πρόγραμμα και δεν προλαβαίνεις να δεις που έκανε λάθος αν έκανε.

Μετά έχεις έναν πίνακα tiposi στον οποίο πας και βάζεις γράμματα αν είναι κεφαλαία (στην πρώτη συνάρτηση) σε σημεία "άκυρα" δηλαδή (επειδή αρχικά αυτός έχει σκουπίδια) μπορεί να σου βγει αυτό: ΑL@$#%$&L ενώ εσύ έδωσες ALL μόνο και μόνο επειδή το for έτρεχε!

Βάλε έναν counter που αρχίζει από -1 και πάει μέχρι εκεί που βρίσκει κεφαλαία, δηλαδή θα τον αυξάνεις μέσα στο if και θα κάνεις tiposi[counter]=kef[k]. Ακόμη το ίδιο το if πρέπει να βγει έξω από το πρώτο for που έχεις αλλιώς έτσι και το τελευταίο σου γράμμα είναι μικρό το timi γίνεται 0 και μένει έτσι και άρα εκτυπώνεις λάθος μήνυμα. Βάλτο έτσι:

for(i=0;i<=pos_psifia;i++)
{
timi=0;
for(k=0;k<=26;k++)
{
if(x==kef[k])
{
++counter;
tiposi[counter]=kef[k];
timi=1;
}
}
}
if (timi==0)
{
printf("Katholou kefalaia\n");
return ;
}
printf("%s\n",tiposi);

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

ΥΓ: Η C δεν υποστηρίζει bool τύπο.
while(!dead()) ++knowledge;

mariosal
Honorary Member
Δημοσιεύσεις: 1473
Εγγραφή: 09 Νοέμ 2007 23:55

ασκηση C με πινακες

Δημοσίευση από mariosal » 02 Ιαν 2010 23:58

Πάρε χαρτί και μολύβι και γράψε αναλυτικά τι πρέπει να κάνει το πρόγραμμά σου ώστε να το καταλάβεις εσύ ο ίδιος, έπειτα θα ορίσεις ποιες συναρτήσεις θέλεις και θα βρεις τους καλύτερους αλγόριθμους και τέλος θα φτιάξεις το πρόγραμμα.

Το πρώτο που πρέπει να κάνεις είναι να διορθώσεις το Coding Style σου. Σου προτείνω αυτό το coding style http://www.dionyziz.com/Style

Οι συναρτήσεις isUpper, isLower υπάρχουν στη ctype.h

http://www.cplusplus.com/reference/clib ... e/isupper/

Να δίνεις αγγλικές ονομασίες στο πρόγραμμά σου.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης