alan2 Δημοσ. 16 Φεβρουαρίου 2012 Δημοσ. 16 Φεβρουαρίου 2012 Για να εισαγω γραμμές κειμενου σε δισδιαστατο πινακα εγραψα #include<stdio.h> #define M 5 #define N 5 void initialize (char document_table[][M],int size ); int size=5; char document_table[N][M]; main(){ } void initialize (char document_table[][M],int size ) { int x,k; for(x=1;x<=N;x++) gets(document_table[x]); } alla gia na xrhsimopoih8ei h synartish initialize(), prepei na klh8ei apo to main().Ekei Grafw main(){ initialize ( document_table[][M], size );//και μου βγαζει λάθος σε αυτη τη γραμμη. }
imitheos Δημοσ. 16 Φεβρουαρίου 2012 Δημοσ. 16 Φεβρουαρίου 2012 Για να εισαγω γραμμές κειμενου σε δισδιαστατο πινακα εγραψα > #include<stdio.h> #define M 5 #define N 5 void initialize (char document_table[][M],int size ); int size=5; char document_table[N][M]; Ως εδώ είσαι οκ. Με τη παρούσα μορφή του κώδικα, το size μπορείς να το παραλείψεις πιστεύω. > main(){ } Γιατί ορίζεις 2 φορές την main ? Αυτή η κενή main δεν χρειάζεται. > void initialize (char document_table[][M],int size ) { int x,k; for(x=1;x<=N;x++) gets(document_table[x]); } Καλό φαίνεται και αυτό για την ώρα. Αφού το κάνεις και παίξει, να διώξεις την gets και να χρησιμοποιήσεις πχ fgets ή κάποια άλλη. Να μην χρησιμοποιείς gets. > main(){ initialize ( document_table[][M], size );//και μου βγαζει λάθος σε αυτη τη γραμμη. } Η δήλωση της main σου είναι λάθος. Η main πρέπει να δηλώνεται ως int main(void). Όσον αφορά την γραμμή που σου βγάζει λάθος, φυσικά και το κάνει. Στη δήλωση μιας συνάρτησης, επειδή οι πίνακες μετατρέπονται σε δείκτες στο αντίστοιχο στοιχείο, μπορείς να παραλείψεις την πρώτη διάσταση. Έτσι η δήλωση σου "void initialize (char document_table[][M],int size );" είναι σωστή. Όταν καλείς όμως την συνάρτηση δεν μπορείς να έχεις τα ορίσματα έτσι. Ακόμα όμως και να την καλέσεις στην main με "document_table[N][M]" πάλι θα σου βγάλει λάθος. Σκέψου τι είναι το document_table[N][M] που του λες ? Είναι ένας χαρακτήρας ενώ η συνάρτηση περιμένει ένα πίνακα οπότε το σωστό θα είναι να την καλέσεις απλά με σκέτο document_table. Κάνε αυτές τις αλλαγές και κάνε επικόλληση για να το συζητήσουμε περαιτέρω.
alan2 Δημοσ. 16 Φεβρουαρίου 2012 Μέλος Δημοσ. 16 Φεβρουαρίου 2012 πραγματι δεν χτυπαει λάθος το #include<stdio.h> #define M 5 #define N 5 void initialize (char document_table[][M],int size ); int size=5; char document_table[N][M]; int main(void){ initialize ( document_table, size ); } void initialize (char document_table[][M],int size ) { int x,k; for(x=1;x<=N;x++) gets(document_table[x]); } τώρα μπορώ να ελεγξω το πινακα document_table αν είναι κείμενο?δηλαδή να δω αν αποτελείται απο αλφαβητικούς χαρακτήρες και κενά.
nilosgr Δημοσ. 16 Φεβρουαρίου 2012 Δημοσ. 16 Φεβρουαρίου 2012 [ code]Ο κωδικας ΜΠΑΙΝΕΙ ΜΕΣΑ ΣΕ ΑΥΤΟ για να φενεται σωστα η συνταξη![ /code] παραδειγμα: [ code] printf("Hi!");[ /code] για να φενεται ως: > printf("Hi!");
migf1 Δημοσ. 17 Φεβρουαρίου 2012 Δημοσ. 17 Φεβρουαρίου 2012 Να συμπληρώσω στα όσα είπαν τα παιδιά παραπάνω, πως γίνεται πολύ πιο εύκολο και για σένα αλλά και για τους άλλους να διαβάζουν τους κώδικές σου, αν φροντίζεις να χρησιμοποιείς σχόλια και κυρίως εύστοχα ονόματα μεταβλητών, συναρτήσεων, κλπ. Βοηθάει επίσης στο να εντοπίζεις πολύ πιο γρήγορα ενδεχόμενα λάθη του κώδικα. Ξανάγραψα τον κώδικά σου με ονομασίες που πιστεύω τον κάνουν πολύ πιο ευανάγνωστο... > #include <stdio.h> #include <stdlib.h> #define NLINES 5 /* πλήθος γραμμών */ #define MAXLNLEN (80+1) /* μέγιστο μήκος γραμμής */ /* ---------------------------------------------------- */ void read_document( char doc[][MAXLNLEN] ) { int i = 0; /* μετρητής γραμμών */ for (i=0; i < NLINES; i++) fgets( doc[i], MAXLNLEN, stdin ); /* αντί για gets( doc[i] ); */ return; } /* ---------------------------------------------------- */ void print_document( char doc[][MAXLNLEN] ) { int i = 0; /* μετρητής γραμμών */ for (i=0; i < NLINES; i++) printf( "%s", doc[i] ); return; } /* ---------------------------------------------------- */ int main( void ) { char document[NLINES][MAXLNLEN] = {{'\0'}}; /* ξεκίνα με κενές γραμμές */ printf( "Type %d lines of text...\n\n", NLINES ); read_document( document ); puts( "\nYou typed the following lines...\n" ); print_document( document ); exit( EXIT_SUCCESS ); } Όπως παρατήρησε και ο φίλος imitheos η gets() είναι άκρως επικίνδυνη συνάρτηση και πρέπει να αποφεύγεται πάση θυσία, διότι δεν σου επιτρέπει κανέναν έλεγχο στο μέγιστο μήκος της συμβολοσειράς που διαβάζεις από την κύρια είσοδο. Στη δική σου περίπτωση, αν σου πληκτρολογήσει ο χρήστης περισσότερους από 4 χαρακτήρες σε οποιαδήποτε γραμμή του document, το πρόγραμμά σου θα κρασάρει με segmentation-fault. Αντίθετα, η fgets() που σου προτάθηκε και χρησιμοποιώ κι εγώ στον παραπάνω κώδικα, σου επιτρέπει να ορίσεις το μέγιστο πλήθος χαρακτήρων που θα διαβαστεί από τον χρήστη και θα μπει στην συμβολοσειρά σου (το έχω ορίσει σε 80+1 αντί για 5 που το είχες εσύ... το +1 είναι για τον μηδενικό χαρακτήρα τερματισμού της συμβολοσειράς). Το μικρό "τίμημα" της fgets() είναι πως για πλήθος χαρακτήρων μικρότερο αυτού που ορίζεις, κρατάει και τον χαρακτήρα αλλαγής γραμμής στο τέλος της συμβολοσειράς, και πρέπει να τον σβήσεις αν δεν τον θέλεις (δεν το κάνω στον παραπάνω κώδικα).
alan2 Δημοσ. 17 Φεβρουαρίου 2012 Μέλος Δημοσ. 17 Φεβρουαρίου 2012 migf1, πως μπορώ να ελέγξω ξεχωριστά κάθε χαρακτήρα του doc[]? θελω να δώ αν είναι αλφαβητικοί χαρακτήρες.
migf1 Δημοσ. 17 Φεβρουαρίου 2012 Δημοσ. 17 Φεβρουαρίου 2012 Θα φτιάξεις 2 nested loops, στο εξωτερικό θα διατρέχεις το πλήθος των γραμμών και στο εσωτερικό θα διατρέχεις τους χαρακτήρες της κάθε γραμμής (μέχρι να βρεις τον χαρακτήρα '\0' που σηματοδοτεί το τέλος της γραμμής). Για να ελέγξεις αν ένας χαρακτήρας c είναι γράμμα, μπορείς να χρησιμοποιήσεις την έτοιμη συνάρτηση: isalpha() ... πρέπει να κάνεις #include <ctype.h>
alan2 Δημοσ. 20 Φεβρουαρίου 2012 Μέλος Δημοσ. 20 Φεβρουαρίου 2012 Θελω να δω αν το κείμενο συνολικά είναι έγκυρο. Μεχρι τώρα έχω γράψει >#include<stdio.h> #define M 5 //μεγιστο μήκος #define N 5 #include <string.h> #include <ctype.h> using namespace std; void initialize (char document_table[][M],int size ); int StringLength(char buf[ ]); int size=5; char document_table[N][M]; int legal; int main(void){ do{legal=false; initialize ( document_table, size ); }while(legal==false); scanf("%d"); } void initialize (char document_table[][M],int size ) { int x,k; //const char *ptr[N]; for(x=1;x<=N;x++){ gets(document_table[x]); printf("%d", StringLength(document_table[x])); } for(x=1;x<=StringLength(document_table[x]);x++){ for(k=1;x<=N;k++){ if (isalpha(document_table[x][M])){legal=true;} }} } int StringLength(char buf[ ]) { int i; int length; length=0; for ( i = 0 ; buf [ i ] != 0 ; i=i+1 ) { length=length + 1; } return length; }
migf1 Δημοσ. 20 Φεβρουαρίου 2012 Δημοσ. 20 Φεβρουαρίου 2012 Συγνώμη αλλά δεν νομίζεις πως είναι τουλάχιστον άκομψο το να γράφεις στα παλιότερα των υποδημάτων σου ότι σου έχουμε πει μέχρι τώρα στο νήμα και παρόλα αυτά να συνεχίζεις να μας ρωτάς και για άλλα;
alan2 Δημοσ. 20 Φεβρουαρίου 2012 Μέλος Δημοσ. 20 Φεβρουαρίου 2012 Συγνωμη εχεις δικιο, ευχαριστώ για τη βοηθεια ( ηδη χρησιμοποίησα το isalpha()στο ιδιο πρόγραμμα που ξεκίνησα απο την αρχή).
imitheos Δημοσ. 20 Φεβρουαρίου 2012 Δημοσ. 20 Φεβρουαρίου 2012 > int size=5; char document_table[N][M]; int legal; int main(void){ do{legal=false; initialize ( document_table, size ); }while(legal==false); } Τα code tags που σου πρότεινε ο nilosgr χρησιμοποιούν monospaced γραμματοσειρά, χρωμματίζουν κάποιες εκφράσεις ανάλογα με την σύνταξη και γενικά εμφανίζουν πιο όμορφα τον κώδικα. Πρέπει όμως να τα βοηθήσεις και εσύ. Για παράδειγμα δες το παραπάνω τμήμα από τον κώδικά σου. Η indentation του είναι χάλια. Μπορείς και διαβάζεις ολόκληρο τον κώδικα του προηγούμενου μηνύματός σου χωρίς να πονάνε τα μάτια σου ? > #include<stdio.h> #define M 5 //μεγιστο μήκος #define N 5 #include <string.h> #include <ctype.h> using namespace std; void initialize(char document_table[][M], int size); int StringLength(char buf[]); int size = 5; char document_table[N][M]; int legal; int main(void) { do { legal = false; initialize(document_table, size); } while (legal == false); scanf("%d"); } void initialize(char document_table[][M], int size) { int x, k; //const char *ptr[N]; for (x = 1; x <= N; x++) { gets(document_table[x]); printf("%d", StringLength(document_table[x])); } for (x = 1; x <= StringLength(document_table[x]); x++) { for (k = 1; x <= N; k++) { if (isalpha(document_table[x][M])) { legal = true; } } } } int StringLength(char buf[]) { int i; int length; length = 0; for (i = 0; buf[i] != 0; i = i + 1) { length = length + 1; } return length; } Δες τώρα τον κώδικα περασμένο μέσα από το πρόγραμμα "gnu indent" πόσο πιο όμορφος είναι. Παραβλέπω τα υπόλοιπα λάθη του κώδικα και το μόνο που θα σχολιάσω είναι το "using namespace std". Που το βρήκες αυτό ? Στον τίτλο αναφέρεις C οπότε δεν έχει δουλειά να υπάρχει εκτός αν γράφεις C++ οπότε πρέπει να αλλάξεις άλλα τμήματα του κώδικα. Δεν προσπαθώ να στην πω. Καλά κάνεις και γράφεις κώδικα αλλά αγόρασε ένα καλό βιβλίο για την γλώσσα που σε ενδιαφέρει, ώστε να σε διδάξει σωστά και μεθοδικά.
alan2 Δημοσ. 21 Φεβρουαρίου 2012 Μέλος Δημοσ. 21 Φεβρουαρίου 2012 Ευχαριστώ. απλως προσπαθούσα να λύσω ενα ζητούμενο μιας ασκησης.
nilosgr Δημοσ. 21 Φεβρουαρίου 2012 Δημοσ. 21 Φεβρουαρίου 2012 Τι έλεγε η εκφώνηση; Θες να σκωτωσεις κανα τεταρτακι λυνωντας την; :Ρ
migf1 Δημοσ. 21 Φεβρουαρίου 2012 Δημοσ. 21 Φεβρουαρίου 2012 Θες να σκωτωσεις κανα τεταρτακι λυνωντας την; :Ρ Όχι, ήθελα να δω αν του απαγόρευε να υλοποιήσει αυτά που του προτείναμε στο νήμα
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα