Log in

View Full Version : Help Deniz with C



Deniz
11-09-2006, 22:40
**edited**

Boom!
12-09-2006, 01:52
Βρηκα αυτο εδω:

http://shmmy.ntua.gr/phpBB2/viewtopic.p ... sc&start=0 (http://shmmy.ntua.gr/phpBB2/viewtopic.php?t=2988&postdays=0&postorder=asc&start=0)

Δεν ξερω αμα βοηθαει, βεβαια.

12-09-2006, 02:35
E γενικά τα τσίμπησα από το νετ με εξαίρεση το πρώτο που ήταν το πρώτο πράγμα που μου ήρθε στο μυαλό.

Βαριέμαι σχόλια c, βάζω σχόλια c++. Απλά βγάλτα από τον κώδικα αν έχεις κανά περίεργο compiler.

Πρόγραμμα που διαβάζει αρχείο κειμένου στην είσοδο και στο τέλος τυπώνει το μέγεθος του(τον αριθμό των χαρακτήρων του). Η χρήση του γίνεται στη μορφή "a.out <test.txt"(a.out το εκτελέσιμο που βγαίνει, test.txt το αρχείο που θέλουμε να μετρήσουμε το μέγεθός του).

#include <stdio.h>

main()
{
int c ; //Μεταβλητή χαρακτήρα, που χρησιμοποιείται για να διαβαστεί το αρχείο εισόδου
int count ; //Ο μετρητής μας

while ( ( c = getchar() ) != EOF ) //Για όσο το test.txt έχει χαρακτήρες κάνεις το loop. Μόλις φτάσει στο end of file, θα βγει.
count ++ ; //Για κάθε χαρακτήρα που διαβάζει, αυξάνει το μετρητή και διαβάζει τον επόμενο.

printf( "%d characters\n" , count ) ; //Απλά τυπώνει στο τέλος το μέγεθος του αρχείου
}


Πρόγραμμα που δίνεις το βαθμό του πτυχίου σε αριθμό και σου γράφει τι είναι(καλώς, λίαν καλώς, άριστα).

#include <stdio.h>

void print_grade( float grade ) ; //Δήλωση της συνάρτησης

main()
{
float input_grade; //Float αφού είναι δεκαδικός

printf (“\nΕισαγωγή βαθμού : ”) ; //Ε να είναι όμορφη η είσοδος
scanf (“%f”, &input_grade) ; //Εδώ γίνεται η είσοδος
print_grade( input_grade ) ; //Εδώ τρέχουμε την συνάρτηση που βγάζει το αποτέλεσμα.
}

void print_grade( float grade )
{
if ( ( grade >= 8.5 ) && ( grade <= 10.0 ) ) //Απλό if με ένα λογικό AND μέσα για να έχουμε όρια. Ίδιο είναι παντού, και ανάλογα με την τιμή του grade δίνει διαφορετική έξοδο.
printf( "Άριστα\n" ) ;
else if ( ( grade >= 6.5 ) && ( grade < 8.5 ) )
printf( "Λίαν καλώς\n" ) ;
else if ( ( grade >= 5.0 ) && ( grade < 6.5 ) )
printf( "Καλώς\n" ) ;
else if ( ( grade < 5.0 ) && ( grade >= 0.0 ) )
printf( "Θά΄θελες πολύ το πτυχίο ε;\n" ) ;
else
printf( "error: Μη απόδεκτός βαθμός %f\n" , grade ) ;
}

Δεν είμαι σίγουρος αν πάνε έτσι ακριβώς αυτά, δηλαδή για το 8.5 δεν είμαι σίγουρος. Εδώ με το ζόρι πάω για το 6.5 εγώ :oops:

Και ένα έτοιμο που βρήκα που σίγουρα σου κάνει.

/*
compare.c

Prompts a use for two numbers, compares them, and reports
whether the first is less than, greater than, or equal
to the second.
*/

#include <stdio.h>

main()
{
float a , b ;

printf( "Enter a number.\n" ) ;
scanf( "%f" , &a ) ;
printf( "Enter another number.\n" ) ;
scanf( "%f" , &b ) ;

if ( a<b )
printf( "%f is less than %f.\n" , a , b ) ;
else if ( a > b )
printf( "%f is greater than %f.\n" , a , b ) ;
else
{
printf( "Congratulations!\n" ) ;
printf( "%f is equal to %f.\n" , a , b ) ;
}
}

Αυτό είναι εύκολο να δεις πως δουλεύει, απλά παίρνει στις 2 scanf είσοδο για τις μεταβλητές a, b και μετά με μερικά if βλέπει ποια είναι μεγαλύτερη ή μικρότερη.

Και τέλος ένα απλό πρόγραμμα που τυπώνει στην κονσόλα όλους τους εκτυπώσιμους χαρακτήρες μαζί με τον κωδικό τους.
#include <stdio.h>
#include <ctype.h> //Δεν είμαι σίγουρος αν χρειάζεται αυτό, βάλτο καλού κακού

void main() {
int i = 0; // Loop counter - ως το 128 είναι καλά

char ch = 0;

for(i = 0 ; i<128 ; i++) {
ch = (char)i; //Απλό cast του i ως char. Δε θυμάμαι αν δουλεύει και χωρίς αυτό.
printf(" %4d %c\n",ch,ch); //Πρώτα τυπώνει τον κώδικα(int μέρος), μετά τον χαρακτήρα(το %c δηλαδή)
}
}

Δεν τα έτρεξα να βεβαιωθώ, βαριέμαι να βάλω κανά mingw τώρα. Ε δοκίμασε και αν έχεις καμιά απορία ή αν βγάζει κανά error πες.

Επίσης προσπάθησα να είναι όσο πιο απλά μπορούσα. Δηλαδή το πιο πολύπλοκο σημείο είναι μάλλον το getchar μέσα στο while, αλλά δέξου το as is πως δουλεύει - είναι από τις πλέον διαδεμομένες τεχνικές για χύμα είσοδο από αρχεία.

cavity
12-09-2006, 03:09
deniz τι βοήθεια θελεις ακριβώς? να σου εξηγησει καποιος τις ασκησεις? να τις λυσει?

12-09-2006, 03:25
Όποιος μπορεί να μου δείξει 3-4 παρόμοιες με αυτές και να μου τις εξηγήσει λίγο θα του ήμουν SUPER ευγνώμων..
Αυτό.

12-09-2006, 03:46
windows key + r(ή απλά το run από το start menu), cmd, και ανοίγει το console.

Με μερικά cd πας στο dir που έχεις το εκτελέσιμο(καλύτερα διώχτα από το desktop και πέτα τα στο c:\prog_tests πχ)

Έτσι απλά γράφεις στο console:
cd \
cd prog_tests
compare.exe ή όποιο άλλο πρόγραμμα θες.

Το μόνο που σου λέω να προσέχεις, στο πρώτο παράδειγμα που κάνει count τον αριθμό των chars ενός txt, βάλε στο c:\prog_tests ένα αρχείο test.txt που μέσα να γράφει ότι θες(lyrics Manowar πχ :P) και το τρέχεις ως εξής:
count.exe <test.txt (αν το έχεις ονομάσει count.exe δηλαδή, και ενώ είσαι στο C:\prog_tests ήδη στο console)

PS: Υποθέτω πως έχεις xp/2000 για αυτά. Για 98 το cmd δε θυμάμαι αν δουλεύει ή αν είναι αλλιώς το filename του shell στο system.

EDIT: Α ναι, δεν είπα γιατί κλείνει. Κλείνει γιατί απλά τελείωνει το πρόγραμμα. Μέσα στο console όμως μένει η έξοδος στο buffer άρα το βλέπεις. Άλλος τρόπος είναι πριν κλείσει κάθε πρόγραμμα(πριν το τελευταίο } δηλαδή) να προσθέσεις το ακόλουθο:
while(1);

Έτσι απλά μπαίνει σε ένα ατελείωτο loop και θα κλείσει το παράθυρο μόνο αν πατήσεις alt+c. Προφανώς είναι λάθος τρόπος αυτός ε; Αλλά από το βάλουμε κανά timeout κλπ τώρα, είτε έτσι κομπογιαννίτικα είτε απλά άνοιξε την κονσόλα. Συνιστώ το 2ο. Α ναι, και αν εκεί στην εξέταση τα τρέξεις σε κανά unix/linux τότε μην αγχώνεσαι, λόγικά gcc από κονσόλα θα είναι άρα δεν θα σου βγάζει αυτά τα περίεργα κλεισίματα. :P

ikonoklast
12-09-2006, 04:51
ντένίζ, πες αν είσαι γκομενάκι τελικά να το δούμε το 8έμα.

ikonoklast
12-09-2006, 05:13
Δεν πεί8εις και δεν είμαι σε 8έση να διαβάζω τι έχετε πει οποτε 8α πώ απλα οτι στο προγκ που συγκρίνει παίρνει 'λά8ος' είσοδο. Αφου σ' ενδιαφέρουν οι ακέραιοι για να τους συγκρίνεις, δήλωσε τις μεταβλητές σου στην αρχή σαν int αντι για float και εκεί που εκτυπώνει στην ο8όνη βάλτου %d αντι για %f ή ό,τι έχει.

ikonoklast
12-09-2006, 05:47
Νε άστο έτσι.
Η φιμπονάτσι 8έλει μιαν αναδρομική συνάρτηση κε αφου σας είπε κατι πολύ απλό αμφισβητώ οτι 8α σας ζητήσει κατι τέτοιο ωστόσο δες πως είναι:


#include <stdio>

long fibo (int); // Δηλώνουμε την αναδρομική συνάρτηση fibo (όπως ρίμπο, λολ!).

int main()
{
int n;

printf("Lege poion ari8mo ths akolou8ias fibonatsi 8es:");

//Ελέγχει αν ο αρι8μός είναι γουστόζικος.

if (scanf("%d", &n) != 1) {
printf("Malakia.\n");
return 1;
}
else if (n<0) {
printf("H fibonatsi den orizetai gia arnhtikous akeraious, vale fysiko re arxidi.\n");
return -1;
}
else {
printf("O %d-os ari8mos ths akolou8ias fibonatsi einai: %ld\n", n fibo(n)); //Εξάγει το αποτέλεσμα για τον αρι8μό n καλώντας την fibo(n).
}
return 0;
}

/*εδώ η συνάρτηση main τελειώνει και δηλώνουμε την συνάρτηση fibo αυτή ελέγχει αν ο αρι8μός που παίρνει σαν όρισμα είναι ο 1 ή το 2 οπότε επιστρέφει 1 (οι πρώτοι δύο φιμπονάτσι είναι το 1). Άν όχι τοτε καλεί τον εαυτό της (γι' αυτό κε αναδρομική) δύο φορές με ορισματα τον n-1 αρι8μό της φιμπονάτσι και τον n-2 κε επιστρέφει το ά8ροισμα αυτών. */

long fibo(int n)
{
if (1 == n || 2 == n) {
return 1;
} else {
return (fibo(n-1) + fibo(n-2));
}
}

εδιτ: δεν έχω ιδέα πως και τι αλλα δε μπποω να γράψω < στδιο τελεία έιτς >

cavity
12-09-2006, 06:15
if (scanf("%d", &n) != 1) {
printf("Malakia.\n");
return 1;





πολύ μάγκικο το φίλτρο. ένιωσα φλώρος. :dscared:

12-09-2006, 09:16
Καταρχήν, άστο float στο compare. Αν δε σου κάνουν τα μηδενικά εκεί που είναι η printf τo %f κάντο %.3f αν θες 3 δεκαδικά, %.2f για δύο κ.ο.κ. Δε θυμάμαι αν κάνει αποκοπή ή στρογγύλευση, νομίζω στρογγύλευση πάντως. Απλά αν θες να ομορφύνεις την έξοδο, αλλά και να του αφήσεις τα κατεβατά μηδενικά δεν έγινε τίποτα. Και αν σου πει τίποτα, του απαντάς ακρίβεια φιλαράκο. Εδώ άλλοι σκίζονται για να εξαλείψουν τέτοια σφάλματα.

Τώρα περί fibonacci επειδή θυμάμαι μας το είχε βάλει και εμάς τότε(7 χρόνια πριν), παίζουν διάφορες εκδόσεις που βελτιώνουν την πολυπλοκότητα του αλγορίθμου. Αλλά οκ, αυτό που έγραψες δουλεύει. Απλά αμέσως μετά την scanf βάλε μερικά if για να αποκλείσεις περίεργες τιμές στην είσοδο(όπως ο -20ος όρος της ακολουθίας ή ο MANOWARός όρος πχ). Κάνε πέιστ αυτά του ικόνοκλαστ.