Παραδείγματα & Ασκήσεις στην C

...ασύγχρονα μαθήματα γλώσσας C

Re: Προγράμματα & παραδείγματα στην C

Δημοσίευσηαπό Star_Light » 05 Ιούλ 2011, 05:53

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

/*==========================

Upologismos paragontikou h dunamis enos arithmou
analoga me tin epilogi tou xrhsth mesw tis switch
=============================

*/
#include<stdio.h>
int main()
{
int r;
int n;
int a;
char flag;



printf("Dwste enan akeraio arithmo: ");
scanf("%d",&a);
printf("Dwste ton akeraio ektheti: ");
scanf("%d",&n);
printf("Dwste A gia ton upologismo tou paragontikou H B gia tin dunami : \n");
scanf("%c",&flag);
flag=getchar();


switch(flag)
{
case 'A':
r=paragontiko(n);
printf("To apotelesma einai: %d \n",r);
break;

case 'B':
r= dunami(a,n);
printf("To apotelesma einai: %d\n",r);
break;
default:
printf("Den dwsate ta swsta stoixeia. Ksanadokimaste: \n");
break;

}

return 0;
}
int paragontiko(int n)
{
if (n==0)
return 1;
else
return n * paragontiko((n-1));
}
int dunami(int a , int n)
{
if(n==0)
return 1;
else
return a * dunami(a , n-1);
}

Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 05 Ιούλ 2011, 06:00

Off topic:
Μεταξυ μας παντως... αν το να εισαι προγραμματιστης πρυποθετει να εχεις τις γνωσεις του migf1 που μαλλον κατι τετοιο μυριζομαι με βλεπω να πουλαω κουλουρια αχαχαχχαχα να πηγαινω και να τους λεω αφηστε το βαλτε με καπου που να χει μονο λινουξ να τελειωνουμε ή PHP!!!! Παντως θα το προσπαθησω με την 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

Δημοσίευσηαπό linuxs » 05 Ιούλ 2011, 15:21

migf1 έγραψε:Βρήκα στο νετ το παρακάτω καταπληκτικό macro που δείχνει να κάνει swap ΟΤΙΔΗΠΟΤΕ ! Δεν μετακινεί δείκτες, αντιγράφει απευθείας τα περιεχόμενα των μεταβλητών x και y, ότι και να είναι: απλές μεταβλητές, δείκτες, struct, πίνακες, τα πάντα!

Το καλείτε απλά με το όνομα των 2 μεταβλητών, χωρίς & μπροστά. Με ότι κι αν το δοκίμασα μέχρι στιγμής, δείχνει να μη "μασάει" πουθενά. Από άποψη ταχύτητας βέβαια δεν είναι optimal, αλλά είναι φοβερή φάση!

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

#define swap(x,y) do {\
unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1];\
memcpy( swap_temp, &(y), sizeof(x) );\
memcpy( &(y), &(x), sizeof(x) );\
memcpy( &(x), swap_temp, sizeof(x) );\
} while(0)


χρησιμοποιέι σκλήσεις συστήματος...και απλά αντιγράφει τις μνήμες! Έτσι δεν είναι? :?
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Προγράμματα & παραδείγματα στην C

Δημοσίευσηαπό linuxs » 05 Ιούλ 2011, 15:33

Star_Light έγραψε:Off topic:
Μεταξυ μας παντως... αν το να εισαι προγραμματιστης πρυποθετει να εχεις τις γνωσεις του migf1 που μαλλον κατι τετοιο μυριζομαι με βλεπω να πουλαω κουλουρια αχαχαχχαχα να πηγαινω και να τους λεω αφηστε το βαλτε με καπου που να χει μονο λινουξ να τελειωνουμε ή PHP!!!! Παντως θα το προσπαθησω με την C περα απο την πλακα γιατι ειναι φοβερη γλωσσα. ΤΗν καλημερα μου τα λεμε παλι σε μερικες ωρες


Καλησπέρα βρε! Απογοητεύεσαι πολύ εύκολα...ο migf1 οκ ξέρει κάποια πραγματάκια απλά. Πλάκα κάνω είναι φοβερό το παιδί! ;) Δεν το λέω τοσο απο θέμα γνώσεων αλλα υπομονής που κάθεται και γράφει τόσο μεγάλα κείμενα(και δεν περιέχουν άσχετα μέσα). Φυσικά τον ευχαριστεί απο οτι θυμάμαι αλλα αυτό δεν έχει σημασία...μπράβο του: :)

Τώρα, και εγώ ξέρω κάποια πραγματάκια... και προσπαθώ για το καλύτερο! Ισως να μην γίνω ποτέ σαν τον migf1(δεν με απασχολεί), ίσως να καταλήξω κάπου αλλου(άσχετα με τον προγραμματισμό) αλλα ούτε αυτό με απασχολεί...αυτό που θέλω να πω είναι οτι "τώρα με έχει βαρέσει και εδώ και ένα χρόνο κάθομαι και ασχολούμε με την C. Μόνο και μόνο επειδή μου την βαρεσαι(...ουπς και λόγω της σχολής μου βασικά)! Δεν με νοιάζει αν θα πάει άχρηστη η γλώσσα στην ζωή μου που άχρηστη δεν είναι καμια γνωση...αλλα μου αρέσει και το συνεχίζω! Θέλω να γίνω hacker με την πραγματική σημασία της λεξης και όχι αυτή που πιστεύει το 90% του κόσμου γι' αυτό έχω γράψει τα tutorials και άσχετα με αυτό το φόρουμ και πολλά άλλα. Όσο έχω ζωή θα προσφέρω...γιατί έτσι μου αρέσει!". Οπότε ποτέ μην το βάζεις κάτω! Το οτι υπάρχει ο migf1 με τις γνώσεις του δεν σημαίνει οτι οκ παιδιά βρήκαμε έναν με πολλές γνώσεις δεν μπορεί να υπάρξει άλλος! Ελπίζω να κατάλαβες σε γενικές γραμμές αυτό που θέλω να σου πώ...καλή συνέχεια!

Φιλικά...
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Προγράμματα & παραδείγματα στην C

Δημοσίευσηαπό migf1 » 05 Ιούλ 2011, 15:48

Τι εννοείς όταν λες κλήσεις συστήματος;

Την memcpy() χρησιμοποιεί για να αντιγράψει πρώτα τα περιεχόμενα του y σε ένα προσωρινό buffer που το ορίζει με όνομα: swap_temp (άρα αυτό το όνομα δεν μπορεί να χρησιμοποιηθεί πουθενά αλλού μέσα στο πρόγραμμα). Κατόπιν τη χρησιμοποιεί για να αντιγράψει τα περιεχόμενα του χ στο y, και μετά για να αντιγράψει τα περιεχόμενα του swap_temp στο x.

To βάζει όλο μέσα σε ένα do-while (0) για να καταστραφεί το buffer: swap_temp μόλις βρει το δεξί άγκιστρο, μιας και είναι ορισμένο ως τοπική μεταβλητή (auto) μέσα στο scope του loop, ενώ για μέγεθος του swap_temp απαιτεί ο χώρος που πιάνουν στη μνήμη τα x και y να είναι ισοδύναμος, αλλιώς ορίζει το μέγεθος του buffer σε -1.
Π.χ. άμα ως x του περάσουμε έναν int και ως y ένα char, το swap_temp ορίζεται με μέγεθος -1. Σε αυτή την περίπτωση η όλη διαδικασία αποτυγχάνει σιωπηλά δυστυχώς (ο compiler δεν το "πιάνει" μιας και οι παράμετροι των macros είναι ανεξάρτητες από τύπους δεδομένων).

Και τέλος, για να δουλέψει σωστά πρέπει να κάνουμε include το <string.h> για την memcpy().

ΥΓ. @star_light: :lol: Μην απογοητεύεσαι ρε συ, εγώ και τα διδάχτηκα σε πανεπιστημιακό επίπεδο και τα εξάσκησα και real-life επί πολλά χρόνια. Αν μάθεις όμως καλά τη C είναι περίπου σαν να έχεις μάθει όλες τις γλώσσες (πλην του αντικειμενοστραφούς προγραμματισμού, που κι αυτός όμως θα σου φανεί πολύ ευκολότερος).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Προγράμματα & παραδείγματα στην C

Δημοσίευσηαπό linuxs » 05 Ιούλ 2011, 16:54

migf1 έγραψε:Τι εννοείς όταν λες κλήσεις συστήματος;

Την memcpy() χρησιμοποιεί για να αντιγράψει πρώτα τα περιεχόμενα του y σε ένα προσωρινό buffer που το ορίζει με όνομα: swap_temp (άρα αυτό το όνομα δεν μπορεί να χρησιμοποιηθεί πουθενά αλλού μέσα στο πρόγραμμα). Κατόπιν τη χρησιμοποιεί για να αντιγράψει τα περιεχόμενα του χ στο y, και μετά για να αντιγράψει τα περιεχόμενα του swap_temp στο x.

To βάζει όλο μέσα σε ένα do-while (0) για να καταστραφεί το buffer: swap_temp μόλις βρει το δεξί άγκιστρο, μιας και είναι ορισμένο ως τοπική μεταβλητή (auto) μέσα στο scope του loop, ενώ για μέγεθος του swap_temp απαιτεί ο χώρος που πιάνουν στη μνήμη τα x και y να είναι ισοδύναμος, αλλιώς ορίζει το μέγεθος του buffer σε -1.
Π.χ. άμα ως x του περάσουμε έναν int και ως y ένα char, το swap_temp ορίζεται με μέγεθος -1. Σε αυτή την περίπτωση η όλη διαδικασία αποτυγχάνει σιωπηλά δυστυχώς (ο compiler δεν το "πιάνει" μιας και οι παράμετροι των macros είναι ανεξάρτητες από τύπους δεδομένων).

Και τέλος, για να δουλέψει σωστά πρέπει να κάνουμε include το <string.h> για την memcpy().

ΥΓ. @star_light: :lol: Μην απογοητεύεσαι ρε συ, εγώ και τα διδάχτηκα σε πανεπιστημιακό επίπεδο και τα εξάσκησα και real-life επί πολλά χρόνια. Αν μάθεις όμως καλά τη C είναι περίπου σαν να έχεις μάθει όλες τις γλώσσες (πλην του αντικειμενοστραφούς προγραμματισμού, που κι αυτός όμως θα σου φανεί πολύ ευκολότερος).


Για κάποιον λόγο είιχα την εντύπωση ότι η memcpy() είναι κλήση στο σύστημα... :/ forget it!

Θέτω μια άσκηση...
Να υλοποιηθεί πρόγραμμα που να διαβάζει τα περιεχόμενα ενός αρχείου, και τέλος να επιστρέφει πόσους αριθμούς, χαρακτήρες και σύμβολα βρήκε. :/ Εύκολο? ...για να δούμε... :D

Παρατήρηση: Σίγουρα η πρώτη λύση είναι με πολλά cases και if! Μήπως υπάρχει κάτι πιο έξυπνο? :/
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Προγράμματα & παραδείγματα στην C

Δημοσίευσηαπό migf1 » 05 Ιούλ 2011, 17:18

Τώρα που την έκανα με τα if μας το λες; :lol:

Αν έχεις βρει κάτι πιο έξυπνο (ελπίζω και πιο γρήγορο) πόσταρέ το απευθείας ;)
Τελευταία επεξεργασία από migf1 και 05 Ιούλ 2011, 17:39, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Προγράμματα & παραδείγματα στην C

Δημοσίευσηαπό linuxs » 05 Ιούλ 2011, 17:37

Καλα το έγγραψες αμέσως? Ούτε ένα λεπτό δεν έκανα για το edit! ...μισό μισό γιατί μπερδεύτηκα και εγώ. Είχα άλλη λύση στο μυαλό μου αλλα καθώς έγγραφα βρήκα άλλα πράγματα. Ρίξε μια ματιά εδώ: http://cplusplus.com/reference/clibrary/cctype/isalpha/. υπάρχουν και άλλα τέτοια(ίσως τα ξέρεις) αλλα έχω κολλήσει κάπου και δεν βγαίνει. Βασικά θα δώσω τον κώδικα και βλέπουμε! :/ Δεν έχω ξαναχρησιμοποιήσει τις συναρτήσει οπότε κάτι θα μου ξεφεύγει!

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

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

int main(int argc, char *argv[]) {
FILE *infile;
char filename[32];
char buf;
int num_counter=0, char_counter=0, sym_counter=0;
/* Check if filename is given! */
if(argc != 2) {
printf("Error! Please run again the program and after the ./a.out enter the file name.\n");
exit(1);
}

filename = argv[1];
infile = fopen("filename","r");
while( (buf=fgetc(infile)) != EOF) {
if(isdigit(buf)){
num_counter++;
}else if(isalpha(buf)){
char_counter++;
}else{
sym_counter++;
}
}
return 0;
}
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Προγράμματα & παραδείγματα στην C

Δημοσίευσηαπό migf1 » 05 Ιούλ 2011, 17:42

Τι πρόβλημα έχει το παραπάνω; Καλό το βλέπω (αν και δεν το εξέτασα καλά γιατί είμαι στη δουλειά και μπαινοβγαίνει κόσμος)!

Να κι ο δικός μου κώδικας (μετράει κι άλλα πράματα)...

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

#include <stdio.h>
#include <stdlib.h> // for exit()
#include <ctype.h> // for isblank(), etc

#define MAXINBUF 255+1

// ---------------------------------------------------------------------------------
int main( void )
{
int c;
unsigned long int charcount=0, lettcount=0, digcount=0, symbcount=0;
unsigned long int blankcount=0, linecount=0;
char filename[MAXINBUF] = "test.txt";
FILE *fp = fopen(filename, "r");

if ( !fp ) {
puts("*** could not open file, aborting program...");
exit( EXIT_FAILURE );
}

while ( (c=fgetc(fp)) != EOF )
{
charcount++;
if ( isblank(c) )
blankcount++;
else if ( isdigit(c) )
digcount++;
else if ( isalnum(c) )
lettcount++;
else if ( c == '\n')
linecount++;
else
symbcount++;
}

fclose(fp);

if ( charcount == 0 )
printf("%s:\tempty file\n", filename);
else {
printf( "%s (%lu lines):\n%lu total char(s)\n",
filename, linecount+1, charcount);
printf("\t\t%8lu letters(s)\n\t\t%8lu digits(s)\n\t\t%8lu linefeed(s)\n\t\t%8lu others\n\t\t%8lu blank(s)\n", lettcount, digcount, linecount, symbcount, blankcount );
}

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

Re: Προγράμματα & παραδείγματα στην C

Δημοσίευσηαπό linuxs » 05 Ιούλ 2011, 17:46

Έδωσα βάση σε αυτό:
Κώδικας: Επιλογή όλων
puts("*** could not open file, aborting program...");

:P χαχχαχα...

Οκ βρε δεν χρησιμοποιείς if. Εννοούσα μην πάει κάποιος και εξετάζει if=0 || if==1 || .... κτλ!

κατάλαβες? :/ Στο παραπάνω υπάρχει λάθος στο πέρασμα ορισμάτων απο την main. Κάποια βλακεία θα έκανα αλλα δεν μου έρχεται...
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

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

  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Μαθήματα C

cron