virxen75 Δημοσ. 1 Απριλίου 2010 Δημοσ. 1 Απριλίου 2010 βάλε τον κώδικα σου σε code blocks ----->(πάτα την # πάνω από εκεί που γράφεις το μήνυμα) για να διαβάζεται ο κώδικας σου
alexandro_89 Δημοσ. 1 Απριλίου 2010 Μέλος Δημοσ. 1 Απριλίου 2010 >#include <stdio.h> int main () { char a[10]; int i,num,k; char c; printf("dose ari8mo oste na topo8etun ta stoixeia tou se pinaka\n"); c=getchar(); i=0; while ((c=='\n')&&(a[i]>='0')&&(a[i]<='9')) { a[i]= c; i++; c=getchar(); k=i; } for (i=0; i<=k; i++); printf("%c",a[i]); return 0; } ---------- Προσθήκη στις 22:36 ---------- Προηγούμενο μήνυμα στις 22:35 ---------- Kαι τα παίζει με το μήνυμα: Process terminated with status -1073741510 (0 minutes, 6 seconds)
virxen75 Δημοσ. 1 Απριλίου 2010 Δημοσ. 1 Απριλίου 2010 τα πράγματα είναι πολύ απλά.Δες τον κώδικα και θα καταλάβεις > #include <stdio.h> int isNumber(char *);//αν βρει χαρακτηρα που δεν ειναι ψηφιο τότε επιστρέφει false int isNumber(char *number){ for (int i=0;number[i];i++){ if (number[i]<'0' || number[i]>'9'){ return 0; } } return 1; } int main(){ char number[100]; int correct=0; while(!correct){//μέχρι να εισαχθει ένας αριθμός χωρίς χαρακτήρες κάνε printf("\ndose akeraio:"); scanf("%s",&number); getchar();//για τα "σκουπίδια" correct=isNumber(number); if (!correct) printf("\nError.please enter an integer!"); } //τύπωσε τον πίνακα for (int i=0;number[i];i++) printf("\nA[%d]=%c",i,number[i]); getchar(); return 0; } βέβαια πρέπει να λάβεις υπόψιν σου την περίπτωση ο χρήστης να δώσει σαν αριθμό π.χ. 0000123456 για να "κόψεις" τα 0 από την αρχή της συμβολοσειράς χρησιμοποίησε την συνάρτηση trimLeft που έχω φτιάξει > void trimLeft(char string[],char what){ int i=0,len=0,len1=0,size=0; len=strlen(string); while (string[len1]==what){ len1++; } size=len-len1; char * rest=NULL; if (len1>0){ rest=(char *)malloc((size+1)*sizeof(char)); for (i=len1;i<len;i++){ rest[i-len1]=string[i]; } rest[size]='\0'; strcpy(string,rest); } } χρήση ---------- trimLeft(number,'0'); ---------- Προσθήκη στις 23:08 ---------- Προηγούμενο μήνυμα στις 22:54 ---------- και αν το θες καθαρά με ακεραίους χωρίς chars μπορείς να κάνεις το πιο κάτω. > #include <stdio.h> int main(){ int numberArray1[100]; int numberArray[100]; int lastDigit=0; long number; printf("\ndose akeraio:"); scanf("%ld",&number); getchar(); while(number!=0){//store in array in reverse order numberArray1[lastDigit++]=number%10; number/=10; } //reverse array for (int i=0;i<lastDigit;i++) numberArray[i]=numberArray1[lastDigit-i-1]; //print array for (int i=0;i<lastDigit;i++) printf("\nA[%d]=%d",i,numberArray[i]); getchar(); return 0; } η επιλογή δική σου.
^LeoNine^ Δημοσ. 23 Απριλίου 2010 Δημοσ. 23 Απριλίου 2010 tips που εκτιμούν συνήθως οι καθηγητές και σε βοηθούν να γράψεις σωστότερο κώδικα: εφόσον ξέρεις τις διαστάσεις του πίνακα γράψε μια define #define N 10 και χρησιμοποίησε το N στον ορισμό των πινάκων. Ότι ορίζεται με define παραμένει σταθερό σε όλο το πρόγραμμα και αλλάζει εύκολα χωρίς να χρειάζεται να ψάχνεις και να διορθώνεις πολλές γραμμές κώδικα. Επίσης οι μεταβλητές έχουν κάποια εμβέλεια. Όσες είναι έξω από τη main είναι καθολικές και τις βλέπουν όλες οι συναρτήσεις. Όσες είναι μέσα στη main τις βλέπει μόνο η main, και όσες είναι μέσα σε άλλες συναρτήσεις τις βλέπουν μόνο εκείνες οι συναρτήσεις και παύουν να υπάρχουν με το που τελειώσει η συνάρτηση την εκτέλεσή της. Οπότε μπορείς να βάλεις ίδια ονόματα στα i,j, και στους πίνακες μέσα στις συναρτήσεις σου. Στοίχιζε τον κώδικά σου ανάλογα με τα blocks κώδικα. Στο devc++ θα σε βοηθήσει αν απενεργοποιήσεις το smart tab από τα options. Τα blocks κώδικα που έχουν 1 γραμμή δεν χρειάζονται αγκύλες. Επίσης μια for που έχει από κάτω ακριβώς μια ακόμα for και τίποτα άλλο, θεωρείται 1 γραμμή και δεν χρειάζεται αγκύλες, άσχετα αν ο κώδικας της δεύτερης for έχει πολλές γραμμές. Στη δεύτερη for βάζεις αγκύλες. Τέλος, return 1 σημαίνει αποτυχία. Όχι ότι έχει ιδιαίτερη σημασία αλλά το πιο τυπικό είναι return 0 (0=επιτυχία). Θα μπορούσε η main να είναι τύπου void και να μην επιστρέφει και τίποτα. ΥΓ: το scanf όταν έχει - σημαίνει ότι η είσοδος δεν καταχωρείται πουθενά. Είναι εναλλακτική μέθοδος του pause μόνο που δουλεύει και στα unix όχι μόνο στα dos. Πάρε τον κώδικα όπως στον προτείνω. Ελπίζω να σε βοήθησα για επόμενες εργασίες σου. >#include <stdio.h> #define N 10 void alfavito(int pinax[N][N]); void ekt_alf(int pinax[N][N]); int main () { int pin[N][N]; alfavito(pin); ekt_alf(pin); scanf("%-d"); return 0; } void alfavito (int pinax[N][N]) { int i,j; for (i=0; i<N; i++) for (j=0; j<N; j++) pinax[i][j]=(i+j)%10; } void ekt_alf (int pinax[N][N]) { int i,j; for (i=0; i<N; i++) { for (j=0; j<N; j++) printf("%3d",pinax[i][j]); printf("\n"); } } Φιλικά για να λειτουργήσει αυτό πρεπει 1. το int main () να γίνει main () 2. το scanf("%-d"); να γίνει scanf("%*d"); ωραία γραμμένο πάντως. μπράβο
C6WGMN Δημοσ. 25 Απριλίου 2010 Δημοσ. 25 Απριλίου 2010 για να λειτουργήσει αυτό πρεπει 1. το int main () να γίνει main () 2. το scanf("%-d"); να γίνει scanf("%*d"); ωραία γραμμένο πάντως. μπράβο Τι εννοείς για την main? Το σωστό είναι int main. Όσο για την scanf, έχεις δίκιο, προφανός κάποιος καθηγητής τους το μαθαίνει έτσι διότι δεν το έχω ξαναδεί το λάθος αυτό παρά μόνο μια φορά πάλι σε αυτό το φόρουμ, νομίζω από διαφορετικό χρήστη που μου είπε ότι έτσι του το μάθανε.
nplatis Δημοσ. 25 Απριλίου 2010 Δημοσ. 25 Απριλίου 2010 tips που εκτιμούν συνήθως οι καθηγητές και σε βοηθούν να γράψεις σωστότερο κώδικα: ... Τα blocks κώδικα που έχουν 1 γραμμή δεν χρειάζονται αγκύλες. Επίσης μια for που έχει από κάτω ακριβώς μια ακόμα for και τίποτα άλλο, θεωρείται 1 γραμμή και δεν χρειάζεται αγκύλες, άσχετα αν ο κώδικας της δεύτερης for έχει πολλές γραμμές. Στη δεύτερη for βάζεις αγκύλες. Με αυτή τη συμβουλή διαφωνώ (και όχι μόνο εγώ αλλά και αρκετά βιβλία). Αν και είναι σωστό και δείχνει ότι «προσέχω πότε το block έχει μία εντολή και δεν βάζω αγκύλες», στην πράξη τα πράγματα είναι λίγο διαφορετικά: α) Είναι πιο εύκολο να ψάχνω το τέλος της αγκύλης για να βρω πού τελειώνει το block παρά να πρέπει να σκεφτώ αν έχει μία ή περισσότερες εντολές. Το μάτι πάει πιο εύκολα και είναι παντού το ίδιο. Η στοίχιση μπορεί να είναι παραπλανητική (εκτός και αν γράφεις Python!) β) Αν αργότερα χρειαστεί να προσθέσω δεύτερη εντολή στο block, πρέπει να θυμηθώ να προσθέσω και τις αγκύλες (που μάλλον δεν θα το θυμηθώ!) Αντιγράφω από προηγούμενο μήνυμα κώδικα που δείχνει παραπλανητική στοίχιση: > //τύπωσε τον πίνακα for (int i=0;number[i];i++) printf("\nA[%d]=%c",i,number[i]); getchar();
Evgenios1 Δημοσ. 25 Απριλίου 2010 Δημοσ. 25 Απριλίου 2010 για να λειτουργήσει αυτό πρεπει 1. το int main () να γίνει main () 2. το scanf("%-d"); να γίνει scanf("%*d"); ωραία γραμμένο πάντως. μπράβο Γιατι? Το entery point δεν ειναι μια συναρτηση?
^LeoNine^ Δημοσ. 25 Απριλίου 2010 Δημοσ. 25 Απριλίου 2010 παιδιά εγώ απλώς έκανα δοκιμές να δω πως θα μου δουλέψει..(σε χcode στα mac) δεν είμαι τόσο καλώς σε c(τώρα μαθαίνω)
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.