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

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

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

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

Δημοσίευσηαπό clepto » 26 Ιουν 2011, 18:18

γράφεις else και όχι else if (συνθηκη)
στο τελευταιο while έχει ξεχάσει ";" στο τελος

με μια γρηγορη ματια αυτα βρηκα
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 26 Ιουν 2011, 18:38

Ok, διόρθωσα τον κωδικα σε αυτό:

Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int guess;
int real;
int yes_no;


char *game() {
real = rand() % 100;
printf("Please type a random number and then hit Enter:\n");
scanf("%d",&guess);
while(guess != real) {
if(guess < real) {
printf("No it is bigger...\n");
break;
}else if(guess > real) {
printf("No it is less...\n");
break;
}

}
}

main() {
real = rand() % 100;
do
{
game();
printf("Well done!\nDo you want to play again?(y/n)");
} while (scanf("%d",&yes_no) == 'y');
};

Αλλά πρέπει να βρω κάτι να αντικαταστήσει το break ώστε να επαναλαμβάνετε το loop και δεν ξέρω γιατί αλλά στο while έχει ένα πρόβλημα και όταν πατώ y δεν ξαναγίνεται το loop...
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό clepto » 26 Ιουν 2011, 18:45

το y είναι χαρακτήρας και όχι αριθμός που ζητάς...
έχεις γράψει int guess άρα το guess είναι ακέραιος...!

άμα θες να επαναλαμβάνεται το loop βάλε τον κώδικα μέσα σε do-while
κοίτα εδώ viewtopic.php?f=61&t=17600
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 26 Ιουν 2011, 19:06

clepto έγραψε:το y είναι χαρακτήρας και όχι αριθμός που ζητάς...
έχεις γράψει int guess άρα το guess είναι ακέραιος...!

άμα θες να επαναλαμβάνεται το loop βάλε τον κώδικα μέσα σε do-while
κοίτα εδώ viewtopic.php?f=61&t=17600

Και αν το βάλω σε do-loop πώς θα κάνω το play again να δουλέψει;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 26 Ιουν 2011, 19:28

Σε συνδυασμό με αυτό:
http://www.cplusplus.com/reference/clib ... dlib/rand/
Αποτέλεσμα:
Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int game(int real) {
int guess;
do {
printf("Please type a random number and then hit Enter:\n");
scanf("%d", &guess);
if (guess < real) { printf("No it is bigger...\n"); }
else if (guess > real) { printf("No it is less...\n"); }
getchar(); // clear stdin cache
} while(guess != real);
return 0;
}

int main() {
srand(time(NULL)); // initialize random seed

int real;
char yes_no;
real = rand() % 100 + 1;

do {
game(real);
printf("Well done!\nDo you want to play again?(y/n): ");
} while (scanf("%c", &yes_no) == 'y');

return 0;
}


Τα λάθη σου:
- int main() όχι main() απλώς
- μην ξεχνάς να τελειώνεις το main() με "return 0;"
- μην ξεχνάς να τελειώνεις την κάθε γραμμή με ";" (εκτός από αυτές με τις αγκύλες { } )
- πρέπει να καθαρίζεις το standard input cache μετά από κάθε scanf: getchar();
- ξέχασες να χρησιμοποιήσεις το srand(). Αλλιώς ο αριθμός του παιχνιδιού θα είναι πάντοτε ο ίδιος μετά το compile. Με το srand() ο αριθμός αλλάζει κατά την εκτέλεση του προγράμματος.
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 26 Ιουν 2011, 19:32

Σωστός ο clepto κι ο medigreek, αυτό είναι το πρόβλημα που σου επισημαίνει κι ο compiler στις τελευταίες γραμμές. Στις πρώτες γραμμές του σου επισημαίνει πως στην γραμμή 7 χρησιμοποιείς την real με αρχικοποίηση σταθεράς (σαν να ήταν const int, αντί για int που είναι δηλωμένη).

Όσο για τη δυσκολία, είναι απόλυτα φυσιολογικό. Μόνο και μόνο για να εξοικειωθείς με τη σύνταξη και τα keywrods της C (που είναι από τα λιγότερα που υπάρχουν σε οποιαδήποτε γλώσσα, γύρω στα 32 αν θυμάμαι καλά είναι) δεν θες κάνα μήνα περίπου;

Υπάρχουν κι άλλα θεματάκια με τον κώδικά σου, που είναι λίγο δύσκολο να τα γνωρίζεις αν δεν στα έχει πει κάποιος ή αν δεν τα έχεις διαβάσει.

Π.χ. τις μεταβλητές δεν πρέπει να τις ορίζουμε ως καθολικές, έξω δηλαδή από όλες τις συναρτήσεις. Μπορεί να βολεύει στην κατόπιν διαχείρισή τους μέσα σε οποιαδήποτε συνάρτηση, αλλά στην πράξη κάνει τον κώδικα επιρρεπή σε λάθη, του ακυρώνει τη δυνατότητα να τρέχει κερματισμένος σε πολλά threads του λειτουργικού συστήματος (και μερικά ακόμα, αλλά ας μείνουμε σε αυτά).

Οπότε τις μεταβλητές: guess, real και yes_no μετακίνησέ τες μέσα στο κυρίως σώμα της main() και αν θες να τις χρησιμοποιήσεις κατόπιν μέσα σε άλλη συνάρτηση, πέρνα την μεταβλητή ως όρισμα της συνάρτησης.

Εναλλακτικά, αν οι μεταβλητές σου έχουν λόγο ύπαρξης μονάχα μέσα σε μια συνάρτηση (ούτε καν στην main δηλαδή) όριζέ τες τοπικά μονάχα μέσα στη συναρτήση που τις χρειάζεσαι.

Επίσης, για να μπορείς να χρησιμοποιήσεις την rand() με αξιόπιστα αποτελέσματα, πρέπει πριν την καλέσεις να ενεργοποιήσεις (αρχικοποιήσεις) τη στάνταρ γεννήτρια τυχαίων αριθμών της C. Αυτό γίνεται καλώντας τη συνάρτηση srand() (μια φορά την αρχή του προγράμματός σου) η οποία επίσης ορίζεται μέσα στο <stdlib.h>. Και για να μη σου "γεννάει" την ίδια σειρά τυχαίων αριθμών κάθε φορά που τρέχει το πρόγραμμά σου, της περνάς ως όρισμα την τρέχουσα ώρα από το ρολόι του συστήματος.

Όλο μαζί είναι έτσι:
Κώδικας: Επιλογή όλων

srand( time(NULL) );

Κατόπιν μπορείς να καλέσεις την rand() όσες φορές θέλεις :)

Έπειτα έχει δυο ακόμα προβλήματα ο κώδικας. το πρώτο είναι πως στη συνάρτηση game() ναι μεν ρωτάς τον χρήστη να σου δώσει έναν αριθμό, αλλά μετά μέσα στο while-loop ΔΕΝ τον ξαναρωτάς για νέο αριθμό, αν αυτός που έδωσε δεν ήταν ο σωστός. Οπότε το while-loop τρέχει επ' άπειρο, αφού συγκρίνει συνέχεια τον 1ο αριθμό που του δίνει ο χρήστης ;)

Το δεύτερο πρόβλημα είναι πως στο do-while loop της main() την μεταβλητή yes_no τη διαβάζεις με το scanf() ως int (με το %d) αλλά μετά δεν συγκρίνεις την yes_no με το 'y', αλλά την τιμή επιστροφής της scnaf(). Πρέπει πρώτα να βάλεις το scnaf() να διαβάσει την yes_no και μετά να συγκρίνεις την yes_no με το 'y' στη συνθήκη του loop. Κι επειδή το 'y' αναφέρεται σε char, κάνε και την yes_no να είναι char και διαβάζέ την ως char μέσα στην scanf() (δηλαδή με %c αντί για %d).

Και τέλος, όταν χρησιμοποιείς συναρτήσεις πρέπει να ορίζεις μπροστά από το όνομά τους τι τύπο θες να σου επιστρέφουν, και στο τέλος του κυρίως σώματός τους να τις βάζεις να επιστρέφουν κάτι αντίστοιχο, με την εντολή: return.

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

int square(int x)
{
int temp = x * x;
return temp;

// ή θα μπορούσες κι απευθείας: return x*x;
}


Αν δεν θες να επιστρέφουν κάτι, τότε τις ορίζεις τύπου void και στο τέλος του σώματός τους βάζεις σκέτο ένα: return;

Η προσπάθεια που έχεις κάνει είναι πολύ καλή πάντως, γιατί το project που διάλεξες είχε αρκετές πονηριές μέσα του.

Σου παραθέτω τον κώδικα διορθωμένο, κι όπου έχεις απορίες να τις γράψεις να τις λύσουμε :)
(για τα fflush(stdin) που βάζω πριν από κάθε scanf() θα έχεις διαβάσει φαντάζομαι τόσο καιρό στα διάφορά νήματα του φόρουμ)

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

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// -----------------------------------------------------------------------------
void game( void )
{
int guess;
int real = rand() % 100;

printf("Please type a random number and then hit Enter:\n");
fflush(stdin); scanf("%d", &guess);

while (guess != real)
{
if (guess < real)
printf("No it is bigger...\n");
else
printf("No it is less...\n");

printf("Try again: ");
fflush(stdin); scanf("%d", &guess);
}

return;
}

// -----------------------------------------------------------------------------
int main( void )
{
char yes_no;

srand( time(NULL) );
do {
game();
printf("Well done!\nDo you want to play again (y/n)? ");
fflush(stdin);
scanf("%c", &yes_no);
} while ( yes_no == 'y' );

fflush(stdin); getchar();
return 0;
}



Θα πρότεινα να ξεκίναγες με πιο απλές ασκήσεις πάντως ;)

stamatiou έγραψε:Παιδιά, για μια ακόμη φορά καταφεύγω σε εσάς, πήγα να φτάξω και εγώ ο καημένος ένα πρόγραμματάκι που απλά μαντεύεις ένα νούμερο και ούτε αυτό δε μου βγαίνει χωρίς βοήθεια! :-x :-x
Ωρίστε ο κώδικας:
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int guess;
int real;
int yes_no;
real = rand() % 100;

char *game() {
printf("Please type a random number and then hit Enter:\n");
scanf("%d",&guess);
while(guess != real) {
if(guess < real) {
printf("No it is bigger...\n");
}else
{
printf("No it is less...\n");
}

}
}

main() {

do
{
game();
printf("Well done!\nDo you want to play again?(y/n");
} while (scanf("%d",&yes_no) == 'y')
};

και μου βγάζει:
Κώδικας: Επιλογή όλων
main.c:7:1: warning: data definition has no type or storage class
main.c:7:1: error: initializer element is not constant
main.c: In function ‘main’:
main.c:30:1: error: expected ‘;’ before ‘}’ token
main.c:30:1: error: expected declaration or statement at end of input

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

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

Δημοσίευσηαπό clepto » 26 Ιουν 2011, 21:11

τους long int τους διαβάζουμε και αυτούς με %d στη scanf;ή με άλλο;
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 26 Ιουν 2011, 21:12

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

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

Δημοσίευσηαπό clepto » 26 Ιουν 2011, 21:16

ποιος είναι ο μέγιστος int που μπορεί κάποιος να βάλει;
εννοώ πχ μπορεί να βάλει και 5 ψηφία; (10000)
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 26 Ιουν 2011, 21:22

clepto έγραψε:ποιος είναι ο μέγιστος int που μπορεί κάποιος να βάλει;
εννοώ πχ μπορεί να βάλει και 5 ψηφία; (10000)

Αλλάζει ανάλογα την πλατφόρμα (google is your frined ;) )

Κοινές σταθερές ορίων ορίζονται στο <limits.h>... για το συγκεκριμένο που ρωτάς είναι: INT_MAX
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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