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

άσκηση στη C


alexandro_89

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

Δημοσ.

γεια σας παιδιά...Έχω να παραδώσω μια άσκηση και ως βάση αυτής είναι να δημιουργώ πινακα(vegere)

0 1 2 3 4 5 6 7 8 9

1 2 3 4 5 6 7 8 9 0

2 3 4 5 6 7 8 9 0 1

3 4 5 6 7 8 9 0 1 2

4 5 6 7 8 9 0 1 2 3

5 6 7 8 9 0 1 2 3 4

6 7 8 9 0 1 2 3 4 5

7 8 9 0 1 2 3 4 5 6

8 9 0 1 2 3 4 5 6 7

9 0 1 2 3 4 5 6 7 8

εκτελώ τον κωδικά μου αλλά βγάζει λάθος την τελευταία στήλη..αυτός είναι ο κώδικας μου:

#include <stdio.h>

 

void alfavito (int pinax[][]);

void ekt_alf (int pinaxx[][]);

int main ()

{

int pin[9][9];

 

alfavito(pin);

ekt_alf(pin);

system("pause");

return 1;

 

}

 

 

void alfavito (int pinax[9][9])

{

int i,j;

 

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

{

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

pinax[j]=(i+j)%10;

}

 

}

 

 

void ekt_alf (int pinaxx[9][9])

{

int i1,j1;

for (i1=0; i1<=9; i1++)

{

for (j1=0; j1<=9; j1++)

printf("%3d",pinaxx[i1][j1]);

 

printf("\n");

}

}

καμμιά ιδέα για το τι πάει στραβά?

Δημοσ.

Βάλε τους πίνακες 10 θέσεων και είσαι οκ(10 θεσεις από 0 έως 9)

 

edit : ποιον compiler χρησιμοποιείς? Γιατί οταν εχεις δισδιάστατους πίνακες ως ορίσματα πρεπει να βάζεις την 2η διάσταση στον ορισμό, δηλαδη void alfavito (int pinax[][9]); και μου κάνει εντύπωση που δεν σου βγάζει σφάλμα.

Δημοσ.
Βάλε τους πίνακες 10 θέσεων και είσαι οκ(10 θεσεις από 0 έως 9)

 

edit : ποιον compiler χρησιμοποιείς? Γιατί οταν εχεις δισδιάστατους πίνακες ως ορίσματα πρεπει να βάζεις την 2η διάσταση στον ορισμό, δηλαδη void alfavito (int pinax[][9]); και μου κάνει εντύπωση που δεν σου βγάζει σφάλμα.

 

φιλε μου σευχαριστώ πάρα πολύ να σαι καλά..μια απροσεξία και σπαζουν τα νευρα σου μετα....χρησιμοποιώ dev++ γιατί μ'αυτό εξεταζόμαστε στη σχολή...Αν και προτιμώ code blocks

Δημοσ.

αν παρατηρούσες την εξοδο οταν ηταν λαθος θα εβλεπες στο τελος(λογικά) να σου λεει Segmentation Fault... Αυτο συνήθως σημαίνει οτι βγαινεις απο τα όρια του πίνακα ;)

Δημοσ.

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");
}
}

 

Φιλικά

Δημοσ.
ΥΓ: το scanf όταν έχει - σημαίνει ότι η είσοδος δεν καταχωρείται πουθενά. Είναι εναλλακτική μέθοδος του pause μόνο που δουλεύει και στα unix όχι μόνο στα dos.

 

Δεν είναι σωστή η παύλα εκεί, δεν έχει νόημα στην C. Το σωστό ειναι ο αστερίσκος για αυτό το σκοπό (%*d).

Δημοσ.

Θα μπορούσε η main να είναι τύπου void και να μην επιστρέφει και τίποτα. ΥΓ: το scanf όταν έχει - σημαίνει ότι η είσοδος δεν καταχωρείται πουθενά. Είναι εναλλακτική μέθοδος του pause μόνο που δουλεύει και στα unix όχι μόνο στα dos.

 

1) η main() γράφεται πάντα int main(){...} και ποτέ μα ποτέ void!

2) για τον σκοπό αυτό ,του pause δηλαδή, υπάρχει η getchar();

Δημοσ.

Την παύλα στη σχολή μας την έχουν πει, ευχαριστώ και για τον εναλλακτικό τρόπο δεν τον ήξερα. Η getchar επίσης μια χαρά λύση είναι.

 

Όσο για το void main με σκέτο return δουλεύει κανονικότατα και δεν δίνει κανένα πρόβλημα ο compiler του .net, απλά το ορθό προφανώς θα είναι να επιστρέφει μια τιμή int στο λειτουργικό σύστημα για να ενημερώσει σε περίπτωση αποτυχίας.

Δημοσ.

Επανέρχομαι πάλι!:devil: το παρακάτω πρόγραμμα δεν είναι υλοποιημένο απλά ελέγχω αν διαβάζονται οι αριθμοί που θέλω αλλά μου βγάζει πρόβλημα μάλλον με την διασταση του πίνακα σαν να υπερχειλίζει δεν καταλαμβαίνω....Οι στήλες εν έχουν αρχική τιμή πχ ο αρι8μός μπορεί να αποτελείται απο 8 ψηφία είτε από 20 πχ..Τι κάνω λάθος?

#include <stdio.h>

 

 

 

int main ()

{

int num_key[2][100];

int i,n,x,k;

char choice;

 

 

 

printf("epelekse 1 gia kriptografisi, 2 gia apokriptografisi kai 0 gia na stamatisei to programma\n");

scanf("%c",&choice);

 

while(choice!='0')

{

if (choice=='1')

{

printf("dose ton akereo ari8mo:");

scanf("%d",x);

i=0;

while (x>=0&&x<=9)

{

 

scanf("%d",&x);

num_key[0]=x;

i++;

}

printf("\n");

 

 

 

}

printf("epelekse 1 gia kriptografisi, 2 gia apokriptografisi kai 0 gia na stamatisei to programma\n");

scanf("%d",&choice);

 

 

 

}

 

 

 

 

 

 

 

system("pause");

return 0;

}

 

---------- Προσθήκη στις 19:38 ---------- Προηγούμενο μήνυμα στις 18:24 ----------

 

μάλλον αλλού ειναι το πρόβλημα...κανενας καμιά ιδέα πως μπορω να διαβάζω εναν αριθμό πχ το 13124 και κάθε στοιχείο του να το βάζω σε πίνακα δηλ το 1 στη 0 το 3 στην 1το 1 στην 2 κτλπ?

Δημοσ.

........

if (choice=='1')

{

printf("dose ton akereo ari8mo:");

scanf("%d",&x);

........

 

 

μην ξεχνάς τα & στην scanf

 

 

 

.................

scanf("%c",&choice);

getchar();//για τα υπολείμματα

..........

 

όσον αφορά το τελευταίο

>
char number[100];
printf("\nenter number:");
scanf("%s",&number);

π.χ. 678 --->number[0]='6' ,number[1]='7',number[2]='8',number[3]='\0'

Δημοσ.

Πως γινεται να βαζω στοιχεια σ'εναν πινακα χωρις <enter> και να σταματαει με το <enter>; πχ δινω τον 1256 και θελω να βαλω το 1 στην θεση 0,το 2 στην 1 το 5 στην 2 και το 6 στην 3?εχεις καμιά ιδέα?επδ για να κάνω την εργασια αυτή είναι η βάση...τα άλλα θα καταφέρω να τα βγάλω αν ξεκινήσω απο εδώ

 

---------- Προσθήκη στις 21:46 ---------- Προηγούμενο μήνυμα στις 21:43 ----------

 

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

Δημοσ.

ο κώδικας που σου έδειξα πιο πάνω είναι μεταβλητού μήκους.

το 100 είναι οι μέγιστοι χαρακτήρες που μπορεί να δεχθει (π.χ. 678 έχει 3 ψηφία και όχι 100)

αν θες πολλούς αριθμούς μπορείς να το δηλώσεις έτσι

 

char numbers[N][maxDigits];

Δημοσ.

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

#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>='0')&&(a<='9'))

{

a= c;

i++;

c=getchar();

k=i;

 

}

 

 

printf("o pinakas ine:\n");

 

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

num=a-'0';

printf("%d",num);

}

 

system("pause");

return 0;

}

 

---------- Προσθήκη στις 22:22 ---------- Προηγούμενο μήνυμα στις 22:21 ----------

 

εννοώ a=c; και c=getchar();

 

---------- Προσθήκη στις 22:23 ---------- Προηγούμενο μήνυμα στις 22:22 ----------

 

το ίσον δεν το εμφανιζει

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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