Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 25 Φεβ 2012, 01:06

5o programming project σελ.50 στο βιβλίο του King:
έγραψε:Write a program that asks the user to enter the numbers from 1 to 16 (in any order) and then displays the numbers in a 4 by 4 arrangement, followed by the sums of the rows, columns, diagonals:

Μορφοποιημένος Κώδικας: Επιλογή όλων
Enter the numbers from 1 to 16 in any order:
16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1

16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1

Row sums: 34 34 34 34
Column sums: 34 34 34 34
Diagonal sums: 34 34

Η λύση μου:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
int n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16,\
row_1_sum, row_2_sum, row_3_sum, row_4_sum, column_1_sum, column_2_sum,\
column_3_sum, column_4_sum, diagonal_1_sum, diagonal_2_sum;

printf("Enter the numbers from 1 to 16 in any order:\n");
scanf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", \
&n1, &n2, &n3, &n4, &n5, &n6, &n7, &n8, &n9, &n10, &n11, &n12, &n13, &n14, &n15, &n16);

printf("\n%2d %2d %2d %2d\n", n1, n2, n3, n4);
printf("%2d %2d %2d %2d\n", n5, n6, n7, n8);
printf("%2d %2d %2d %2d\n", n9, n10, n11, n12);
printf("%2d %2d %2d %2d\n\n", n13, n14, n15, n16);

row_1_sum = n1 + n2 + n3 + n4;
row_2_sum = n5 + n6 + n7 + n8;
row_3_sum = n9 + n10 + n11 + n12;
row_4_sum = n13 + n14 + n15 + n16;
column_1_sum = n1 + n5 + n9 + n13;
column_2_sum = n2 + n6 + n10 + n14;
column_3_sum = n3 + n7 + n11 + n15;
column_4_sum = n4 + n8 + n12 + n16;
diagonal_1_sum = n1 + n6 + n11 + n16;
diagonal_2_sum = n4 + n7 + n10 + n13;

printf("Row sums: %d %d %d %d\n", row_1_sum, row_2_sum, row_3_sum, row_4_sum);
printf("Column sums: %d %d %d %d\n", column_1_sum, column_2_sum, column_3_sum, column_4_sum);
printf("Diagonal sums: %d %d\n", diagonal_1_sum, diagonal_2_sum);

return 0;
}

Το αποτέλεσμα που παίρνω είναι το επιθυμητό, αλλά η υλοποίηση δεν μου αρέσει καθόλου.
Υπάρχει κάποιος καλύτερος τρόπος να κάνω το παραπάνω; (Δεδομένου ότι δεν ξέρω πολλά περισσότερα προς το παρών απ' το να χρησιμοποιώ τις printf() και scanf().)
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 25 Φεβ 2012, 01:37

Μπορείς να χρησιμοποιήσεις έναν πίνακα ο οποίος αποθηκεύει τις μεταβλητές ίδιου τύπου αντι να ορίσεις 16 διαφορετικές μεταβλητές.
Ειναι λιγο too much οπως και να το κανεις. Στα πολυ γρηγορα εγραψα αυτο ->

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

#include<stdio.h>
#define N 16
int main(void)

{
int array[N];
int i=0;

printf(" Give the values : ");

for(i=0; i<N; i++)
scanf("%d", &array[i]);

for(i=0; i<N; i++)
printf("%d" , array[i]);


return 0;
}
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 25 Φεβ 2012, 01:43

@Star_Light
Ilias95 έγραψε:(Δεδομένου ότι δεν ξέρω πολλά περισσότερα προς το παρών απ' το να χρησιμοποιώ τις printf() και scanf().)

Μόλις τελείωσα το τρίτο κεφάλαιο οπότε υποτίθεται ότι δεν έχω ιδέα από loops και πίνακες. :D
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 25 Φεβ 2012, 01:46

Μαλιστα.

Στην Python δεν ειχατε καθολου πίνακες και loops?

Eκτος και αν εννοεις πως το βιβλιο σου βαζει αυτη την δεσμευση και καλα :lol: :lol:
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 25 Φεβ 2012, 01:49

Star_Light έγραψε:Στην Python δεν ειχατε καθολου πίνακες και loops?

Φυσικά και έχει. Αυτό όμως δεν σημαίνει ότι ξέρω και την αντίστοιχη σύνταξη στην C.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 25 Φεβ 2012, 02:07

Για την υλοποίηση της άσκησης δεν έχω φτάσει ως εκείνο το σημείο που λες.

ΣΤην C έχεις 3 loops while / for / do-while.

Η for ξεκινάει απο ένα αρχικο σημείο και μέχρι να φτάσει σε ένα άλλο κάνει κάποια πράγματα
τα οποια έχεις γραψει εσυ μεσα στο σώμα της. Για να μπορει να δουλέψει η for
χρειάζεται να αυξάνει και εναν μετρητή καθε φορα (αλλιως τι σοι επανάληψη θα ηταν). Πολυ γενικό ολο αυτο που σου έγραψα το ειδικο είναι ->

Κώδικας: Επιλογή όλων
for ( i=0; i<16; i++)
ΣΩΜΑ με μια εντολή.

ή

for( i=0; i<16; i++)
{
ΣΩΜΑ με περισσοτερες της μιάς εντολής
}



Το αρχικό σημείο απο το οποίο ξεκινά ειναι το i=0; μέχρι να φτάσει στο i<16 δηλαδη μεχρι να φτάσεις στο σημειο i=15 (ενω εχεις ξεκινήσει απο i=0; κάνε αυτα που έχουν οριστεί μεσα στο σώμα . Το οποιο σώμα ειναι χωρις αγκυλες οταν η εντολή ειναι 1 ενω με αγκύλες οταν έχεις περισσοτερες απο μια εντολες και αρα έχεις ενα block εντολων.

Κώδικας: Επιλογή όλων
for(i=0; i<16; i++)
printf(" 16 φορές θα εκτυπώσω αυτο ");

ή

for( i=0; i<16; i++)
{
printf(" 16 φορες θα εκτυπωσω αυτο ");
printf(" Ενταξει το εμπεδώσαμε");
}


Tα arrays τωρα στην C δηλώνονται πολυ απλά έτσι ->

Κώδικας: Επιλογή όλων
<τυπος δεδομένων> πινακας[πλήθος_στοιχειων] ;


Άν θέλω να δηλώσω έναν πίνακα 5 στοιχείων που ολα τους ειναι ακέραιοι μπορώ να το κάνω έτσι ->

Κώδικας: Επιλογή όλων
int array[5];


Ο πίνακας έχει 5 στοιχεία αλλα η αρίθμηση ξεκινά απο το 0... συνεπώς
τα επιμέρους στοιχεία του πινακά σου θα ειναι τα :


array[0]
array[1]
array[2]
array[3]
array[4]

ΚΑΙ ΟΧΙ ΤΑ ->

array[1]
array[2]
array[3]
array[4]
array[5]


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

Πάμε

Κώδικας: Επιλογή όλων
for(i=0; i<5; i++)
array[i]= i + 1;


H for ξεκινάει απο το 0 και μέχρι να φτάσει και στο σημείο i=4 έχει κάνει 5 βήματα. Στο σημείο i=5 η παράσταση i<5 δίνει FALSE και έτσι τελειώνει εκει το πανηγύρι.
Ο παραπάνω πίνακας αρχικοποιείται κάθε φορα με την τρέχουσα τιμή του i + 1 ακόμη . Συνεπώς

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

array[0] = 0 + 1 =1
array[1]= 1 + 1 = 2
array[2]= 2 + 1 = 3
array[3] = 3 + 1 =4
array[4] = 4 + 1 = 5
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 25 Φεβ 2012, 02:18

Ρε συ. Το πρόβλημα μου δεν είναι να μάθω από βρόχους και πίνακες.
Θα τους μάθω όταν φτάσω στο αντίστοιχο κεφάλαιο.
Απλά ρώτησα, δεδομένων όσων διδάσκει στα 3 πρώτα του κεφάλαια ο King αν μπορεί να αλλάξει οτιδήποτε προς το καλύτερο στον κώδικα που πόσταρα παραπάνω.
Το ξέρω ότι με έναν πίνακα θα γλιτώσω τη δήλωση όλων των μεταβλητών.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 25 Φεβ 2012, 02:24

Προσωπικα δεν νομιζω πως μπορει να αλλαξει κατι προς το καλυτερο αμα δεν χρησιμοποιησεις πινακες.
Κατα 95%+ ειμαι σιγουρος για αυτο. Αλλα ας περιμένουμε και την άποψη του migf1 :D
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Φεβ 2012, 03:44

Star_Light έγραψε:Writing a new line character terminates the current output line ; subsequent output goes onto the next line

Σελίδα 39 για την printf.... βασικα αυτο το onto δεν μπορω να μεταφρασω ακριβως τι σημαινει...

Γραφοντας εναν \n τερματιζει την τρέχουσα γραμμη εξοδου και κατα συνεπεια η εξοδος παει σε επομενη γραμμη????

Ναι! Ουσιαστικά σου λέει πως τυπώνοντας το \n αλλάζεις γραμμή.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 25 Φεβ 2012, 03:51

Ilias95 έγραψε:5o programming project σελ.50 στο βιβλίο του King:
έγραψε:Write a program that asks the user to enter the numbers from 1 to 16 (in any order) and then displays the numbers in a 4 by 4 arrangement, followed by the sums of the rows, columns, diagonals:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
Enter the numbers from 1 to 16 in any order:
16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1

16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1

Row sums: 34 34 34 34
Column sums: 34 34 34 34
Diagonal sums: 34 34

Η λύση μου:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
int n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16,\
row_1_sum, row_2_sum, row_3_sum, row_4_sum, column_1_sum, column_2_sum,\
column_3_sum, column_4_sum, diagonal_1_sum, diagonal_2_sum;

printf("Enter the numbers from 1 to 16 in any order:\n");
scanf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", \
&n1, &n2, &n3, &n4, &n5, &n6, &n7, &n8, &n9, &n10, &n11, &n12, &n13, &n14, &n15, &n16);

printf("\n%2d %2d %2d %2d\n", n1, n2, n3, n4);
printf("%2d %2d %2d %2d\n", n5, n6, n7, n8);
printf("%2d %2d %2d %2d\n", n9, n10, n11, n12);
printf("%2d %2d %2d %2d\n\n", n13, n14, n15, n16);

row_1_sum = n1 + n2 + n3 + n4;
row_2_sum = n5 + n6 + n7 + n8;
row_3_sum = n9 + n10 + n11 + n12;
row_4_sum = n13 + n14 + n15 + n16;
column_1_sum = n1 + n5 + n9 + n13;
column_2_sum = n2 + n6 + n10 + n14;
column_3_sum = n3 + n7 + n11 + n15;
column_4_sum = n4 + n8 + n12 + n16;
diagonal_1_sum = n1 + n6 + n11 + n16;
diagonal_2_sum = n4 + n7 + n10 + n13;

printf("Row sums: %d %d %d %d\n", row_1_sum, row_2_sum, row_3_sum, row_4_sum);
printf("Column sums: %d %d %d %d\n", column_1_sum, column_2_sum, column_3_sum, column_4_sum);
printf("Diagonal sums: %d %d\n", diagonal_1_sum, diagonal_2_sum);

return 0;
}

Το αποτέλεσμα που παίρνω είναι το επιθυμητό, αλλά η υλοποίηση δεν μου αρέσει καθόλου.
Υπάρχει κάποιος καλύτερος τρόπος να κάνω το παραπάνω; (Δεδομένου ότι δεν ξέρω πολλά περισσότερα προς το παρών απ' το να χρησιμοποιώ τις printf() και scanf().)

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

Μορφοποιημένος Κώδικας: Επιλογή όλων
...
int n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14, n15, n16;
int row1sum, row2sum, row3sum, row4sum;
int col1sum, col2sum, col3sum, col4sum;
int diag1sum, diag2sum;
...
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι