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

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

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

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

Δημοσίευσηαπό migf1 » 03 Μαρ 2012, 21:38

Ilias95 έγραψε:
Δηλαδή για 7 cases θα επαναληφθεί 7 φορές η παραπάνω γραμμή.

Ναι, δεν υπάρχει κάτι το επιλήψιμο σε αυτή την πρακτική ;)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 04 Μαρ 2012, 02:48

Πολύ ωραίο το programming project 9 στη σελίδα 179. :)

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

#define NUM_CHARS (int) sizeof(alphabeta) / sizeof(alphabeta[0])

#define NUM_ROWS 10
#define NUM_COLUMNS 10

int main(void)
{
int move, row = 0, col = 0;
const char alphabeta[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
char table[NUM_ROWS][NUM_COLUMNS] = {{alphabeta[0]}};

srand((unsigned) time(NULL));

for (int i = 1; i < NUM_CHARS; i++) {
if (table[row+1][col] && table[row-1][col] && table[row][col+1] && table[row][col-1])
break;

while (1) {
move = rand() % 4;
if (move == 0) {
if ((! table[row-1][col]) && row - 1 >= 0) {
row--;
break;
}
}
else if (move == 1) {
if ((! table[row][col+1]) && col + 1 < NUM_COLUMNS) {
col++;
break;
}
}
else if (move == 2) {
if ((! table[row+1][col]) && row + 1 < NUM_ROWS) {
row++;
break;
}
}
else if (move == 3) {
if ((! table[row][col-1]) && col - 1 >= 0) {
col--;
break;
}
}
}
table[row][col] = alphabeta[i];
}

for (row = 0 ; row < NUM_ROWS; row++) {
for (col = 0; col < NUM_COLUMNS; col++)
table[row][col] ? printf("%c ", table[row][col]) : printf(". ");
printf("\n");
}

return 0;
}


Υπάρχει ένα πρόβλημα όμως.
Ο αλγόριθμος δουλεύει σωστά και συνήθως παίρνω το επιθυμητό αποτέλεσμα.
Μερικές φορές όμως όταν τρέχω το πρόγραμμα τερματίζει αμέσως χωρίς να δώσει κάποια έξοδο ή άλλες φορές δεν τερματίζει ποτέ σαν να είναι σε infinite loop.
Μήπως υπάρχει κάποιο πρόβλημα με τις συναρτήσεις srand() και rand() της <stdlib.h>;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 04 Μαρ 2012, 02:52

Όχι δεν υπάρχει πρόβλημα με αυτές τις 2 συναρτήσεις. θα τελειώσω κάτι που κάνω στο HexView και θα το κοιτάξω ;)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 04 Μαρ 2012, 02:59

Α, btw, το macro...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#define NUM_CHARS (int) sizeof(alphabeta) / sizeof(alphabeta[0])

μπορείς να το κάνεις να δέχεται όρισμα έναν πίνακα, έτσι ώστε να δουλεύει με οποιονδήποτε πίνακα (και να το προσθέσεις προαιρετικά στο "myextras.h" :) )

Μορφοποιημένος Κώδικας: Επιλογή όλων
#define ARR_NELEMS(arr) ( sizeof( (arr) ) / sizeof( (arr)[0] ) )

ΥΓ. Όταν υλοποιείς macros με ορίσματα, τα ορίσματα πρέπει να τα περικλείνεις σε παρένθεση και στο κυρίως σώμα του macro.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 04 Μαρ 2012, 03:08

migf1 έγραψε:Όταν υλοποιείς macros με ορίσματα, τα ορίσματα πρέπει να τα περικλείνεις σε παρένθεση και στο κυρίως σώμα του macro.

Οπότε το NUM_CHARS θα έπρεπε να γίνει;
Κώδικας: Επιλογή όλων
#define NUM_CHARS ((int) (sizeof(alpha_beta) / sizeof(alpha_beta[0])))
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 04 Μαρ 2012, 03:09

Παιδια να ρωτήσω κατι?

Η αρχικοποίηση (initialization) και η εκχώρηση (assignment) ειναι δυο διαφορετικά ή ιδια πράγματα στην C?
Γνώσεις ⇛ 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 » 04 Μαρ 2012, 03:13

@Ilias: Το NUM_CHARS δεν έχει ορίσματα ;)
@Starlight: Κανονικά ναι, είναι διαφορετικά... η αρχιχοποίηση γίνεται μονάχα κατά τον ορισμό των μεταβλητών. Αλλά μπορεί να το συναντήσεις σαν ορολογία και για την πρώτη-πρώτη φορά που κάνεις assign μια τιμή στην μεταβλητή.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 04 Μαρ 2012, 03:15

migf1 έγραψε:@Ilias: Το NUM_CHARS δεν έχει ορίσματα ;)

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

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

Δημοσίευσηαπό migf1 » 04 Μαρ 2012, 03:25

Ναι, στο NUM_CHARS είναι περιττές.. πάω να δω την άσκηση :) Και το casting σε (int) είναι περιττό.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 04 Μαρ 2012, 03:28

migf1 έγραψε:
@Starlight: Κανονικά ναι, είναι διαφορετικά... η αρχιχοποίηση γίνεται μονάχα κατά τον ορισμό των μεταβλητών. Αλλά μπορεί να το συναντήσεις σαν ορολογία και για την πρώτη-πρώτη φορά που κάνεις assign μια τιμή στην μεταβλητή.


Κατσε να το παίξω λιγο σπασίκλας ξένος!

Νo it's not Sir! There is no "αρχιχοποιηση" ιν C! :lol: :lol:
παντως υπάρχει και μια διχογνωμία γυρω απο αυτο???? Γιατι προ λιγου ρωτησα και αλλου πριν ερθω σε εσας
και μου ειπαν ειναι pretty much same λεει.... εκανε λαθος λες?
Γνώσεις ⇛ 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
Εκτύπωση

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

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