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

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

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

Δημοσίευσηαπό linuxs » 04 Ιούλ 2011, 11:02

migf1 έγραψε:
linuxs έγραψε:Νομίζω γενικά καλό είναι να το παίρνουμε με την γενική περίπτωση και όχι για 2-3-4 αριθμούς μόνο όπως είχα κάνει και εγώ στην αρχή. Καλό είναι τα προγράμματά μας να είναι βάση του Ν για να μπορούν να χρησιμοποιηθούν ανα πάσα στιγμή. Τι λέτε? :/

Εννοείς χωρίς καν χρήση σταθεράς για το πάνω όριο; Προσωπικά συμφωνώ, απλά θα έχει λίγο παραπάνω overhead στη διάβασμα τους.


μην μπερδεύεσαι...εννοώ ακριβως όπως το κάνεις εσύ! ;)
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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 » 04 Ιούλ 2011, 11:06

Εάν βρεις και καλύτερο οκ! Απλά, το παρακάτω είναι η άσκηση που έιχα κάνει...
Κώδικας: Επιλογή όλων

#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/time.h>

#define N 40000
#define M 60000
#define K 50000

int yourfunction( void );
int myfunction( void );
int parentfunction( void );
//-------------------------------------------------------------------------------------------------------------------------------------

static long p_realt_secs=0;
static long p_virtt_secs=0;
static long p_proft_secs=0;
static long c1_realt_secs=0;
static long c1_virtt_secs=0;
static long c1_proft_secs=0;
static long c2_realt_secs=0;
static long c2_virtt_secs=0;
static long c2_proft_secs=0;

static struct itimerval p_realt, c1_realt, c2_realt;
static struct itimerval p_virtt, c1_virtt, c2_virtt;
static struct itimerval p_proft, c1_proft, c2_proft;

//-------------------------------------------------------------------------------------------------------------------------------------
static void p_handler(int signo){
switch(signo)
{
case SIGALRM:

//printf("PARENT RECEIVED SIGNAL\n");

p_realt_secs++;

case SIGVTALRM:

//printf("PARENT RECEIVED SIGNAL\n");

p_virtt_secs++;

case SIGPROF:

//printf("PARENT RECEIVED SIGNAL\n");

p_proft_secs++;



}

}



static void c1_handler(int signo){
switch(signo){
case SIGALRM:
//printf("CHILD1 RECEIVED SIGNAL\n");
c1_realt_secs++;
case SIGVTALRM:
//printf("CHILD1 RECEIVED SIGNAL\n");
c1_virtt_secs++;
case SIGPROF:
//printf("CHILD1 RECEIVED SIGNAL\n");
c1_proft_secs++;
}
}

static void c2_handler(int signo){
switch(signo)
{
case SIGALRM:
//printf("CHILD2 RECEIVED SIGNAL\n");
c2_realt_secs++;
case SIGVTALRM:
//printf("CHILD2 RECEIVED SIGNAL\n");
c2_virtt_secs++;
case SIGPROF:
//printf("CHILD2 RECEIVED SIGNAL\n");
c2_proft_secs++;
}
}

//--------------------------------------------------------------------------------------------------------------------------------------

main(void)
{

int pid1,pid2;

int status;

/* get command line argument, funarg ...*/
/*initialize parent, child1, and child2 timer values ...*/
p_realt.it_interval.tv_sec = 1; // to pedio it_value = orizei thn trexoysa timh gia ton xronometrhth

p_realt.it_value.tv_sec = 1; // xronometrhth otan mhdenistei

p_virtt.it_interval.tv_sec = 1;

p_virtt.it_value.tv_sec = 1;

p_proft.it_interval.tv_sec = 1;

p_proft.it_value.tv_sec = 1;

//------------------------------------------------------------------------------------------------------------------------------------

c1_realt.it_interval.tv_sec = 1;

c1_realt.it_value.tv_sec = 1;

c1_virtt.it_interval.tv_sec = 1;

c1_virtt.it_value.tv_sec = 1;

c1_proft.it_interval.tv_sec = 1;

c1_proft.it_value.tv_sec = 1;

//------------------------------------------------------------------------------------------------------------------------------------

c2_realt.it_interval.tv_sec = 1;

c2_realt.it_value.tv_sec = 1;

c2_virtt.it_interval.tv_sec = 1;

c2_virtt.it_value.tv_sec = 1;

c2_proft.it_interval.tv_sec = 1;

c2_proft.it_value.tv_sec = 1;

//-------------------------------------------------------------------------------------------------------------------------------------

/*enable your signal handlers for the parent ...*/

signal(SIGALRM,p_handler);

signal(SIGVTALRM,p_handler);

signal(SIGPROF,p_handler);


/*set the parent 's itimers ...*/

setitimer(ITIMER_REAL, &p_realt, NULL);

setitimer(ITIMER_VIRTUAL, &p_virtt, NULL);

setitimer(ITIMER_PROF, &p_proft, NULL);


pid1=fork();

if( pid1 == 0 ) // an einai mhden ektelw ton kwdika toy piadioy alliws toy patera
{

/*enable child 1 signal handlers (disable parent handlers) */

signal(SIGALRM,c1_handler);

signal(SIGVTALRM,c1_handler);

signal(SIGPROF,c1_handler);



/*set the 1 itimers ...*/

setitimer(ITIMER_REAL, &c1_realt, NULL);

setitimer(ITIMER_VIRTUAL, &c1_virtt, NULL);

setitimer(ITIMER_PROF, &c1_proft, NULL);



/*start yourfunction() at child 1 ..."res=yourfunction(funarg);"*/

yourfunction();

/*Read the child itimer values, and report them ...*/

getitimer(ITIMER_PROF, &c1_realt);

getitimer(ITIMER_REAL, &c1_virtt);

getitimer(ITIMER_VIRTUAL, &c1_proft);

printf("\n");

printf("Child 1 real time=%Id sec\n", c1_realt_secs);

printf("Child 1 cpu time=%Id sec\n", c1_proft_secs);

printf("Child 1 user time=%Id sec\n", c1_virtt_secs);

printf("Child 1 kernel time=%Id sec\n", c1_proft_secs-c1_virtt_secs);

fflush(stdout);

exit(0);

}

else

{

pid2=fork();

if( pid2 == 0 )

{

/* enable the child 2 signal handlers (disable parent handlers ...*/

signal(SIGALRM,c2_handler);

signal(SIGVTALRM,c2_handler);

signal(SIGPROF,c2_handler);



/*set the child 2 itimers ...*/

setitimer(ITIMER_REAL, &c2_realt, NULL);

setitimer(ITIMER_VIRTUAL, &c2_virtt, NULL);

setitimer(ITIMER_PROF, &c2_proft, NULL);



myfunction();



getitimer(ITIMER_PROF, &c2_realt);

getitimer(ITIMER_REAL, &c2_virtt);

getitimer(ITIMER_VIRTUAL, &c2_proft);

printf("\n");

printf("Child 2 real time=%Id sec\n", c2_realt_secs);

printf("Child 2 cpu time=%Id sec\n", c2_proft_secs);

printf("Child 2 user time=%Id sec\n", c2_virtt_secs);

printf("Child 2 kernel time=%Id sec\n", c2_proft_secs-c1_virtt_secs);



fflush(stdout);

exit(0);

}

else /* this is the parent */

{

/* start your function at the parent */

parentfunction();



/*wait for the children to terminate */

waitpid(pid1,&status,0);

waitpid(pid2,&status,0);



/* read the parent itimer values and report them */

getitimer(ITIMER_PROF, &p_realt);

getitimer(ITIMER_REAL, &p_virtt);

getitimer(ITIMER_VIRTUAL, &p_proft);

printf("\n");

printf("Parent real time=%Id sec\n", p_realt_secs);

printf("Parent cpu time=%Id sec\n", p_proft_secs);

printf("Parent user time=%Id sec\n", p_virtt_secs);

printf("Parent kernel time=%Id sec\n\n", p_proft_secs-c1_virtt_secs);

}

//printf("this line should never be printed\n");

}

return;

}

//--------------------------------------------------------------------------------------------------------------------------------------

int yourfunction( void )

{

int *x,i,j,T,b;



x=(int*)malloc(N*sizeof(int));



for(i=0; i<N; i++)

{

x[i]=((int)(RAND_MAX)-((int)rand() ) );

}



for(i=0; i<N-1; i++)

{

for(j=0; j<(N-1)-i; j++)

{

if( x[j+1] < x[j] )

{

T=x[j];

x[j]=x[j+1];

x[j+1]=T;

}

}

}



return;

}

//--------------------------------------------------------------------------------------------------------------------------------------

int myfunction( void )

{

int *x,i,j,T,b;



x=(int*)malloc(M*sizeof(int));



for(i=0; i<M; i++)

{

x[i]=((int)(RAND_MAX)-((int)rand() ) );

}



for(i=0; i<M-1; i++)

{

for(j=0; j<(M-1)-i; j++)

{

if( x[j+1] < x[j] )

{

T=x[j];

x[j]=x[j+1];

x[j+1]=T;

}

}

}



return;

}

//-------------------------------------------------------------------------------------------------------------------------------------

int parentfunction( void )

{

int *x,i,j,T,b;



x=(int*)malloc(K*sizeof(int));



for(i=0; i<K; i++)

{

x[i]=((int)(RAND_MAX)-((int)rand() ) );

}



for(i=0; i<K-1; i++)

{

for(j=0; j<(K-1)-i; j++)

{

if( x[j+1] < x[j] )

{

T=x[j];

x[j]=x[j+1];

x[j+1]=T;

}

}

}



return;

}

//---------------------------------------------------------------------------------------------------------------------------------------




Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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 » 04 Ιούλ 2011, 11:13

Πω πω βρε συ, ολόκληρο πρόγραμμα :)

Βρήκα αυτό εδώ: http://www.edaboard.com/thread172380.html αλλά διαβάζω πως δεν είναι και πολύ αξιόπιστο (αλλά τρέχει σε όλες τις πλατφόρμες).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 04 Ιούλ 2011, 11:16

Μόλις το δοκίμασα με το τύπωμα και ο άθροισμα πρώτων από το 1 έως το 100.000 εδώ στο λάπτοπ, και μου έδωσε 7.73 secs
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 04 Ιούλ 2011, 11:25

Επειδή ο timer είναι όντως πολύ ενδιαφέρον τόπικ (εγώ χρησιμοποιούσα το gprof) βρήκα κι άλλο ένα link: http://stackoverflow.com/questions/2215 ... lliseconds
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό linuxs » 04 Ιούλ 2011, 11:27

migf1 έγραψε:Μόλις το δοκίμασα με το τύπωμα και ο άθροισμα πρώτων από το 1 έως το 100.000 εδώ στο λάπτοπ, και μου έδωσε 7.73 secs

...μου φαίνεται πολύ! :/ Εκτός και είναι τόσο παλίο το λαπτοπ! Μπορεί να το δοκιμάσει και ένας τρίτος? :?
Τελευταία επεξεργασία από linuxs και 04 Ιούλ 2011, 11:34, έχει επεξεργασθεί 1 φορά/ες συνολικά
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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 » 04 Ιούλ 2011, 11:32

Κοίταξε αυτό που χρειαζόμαστε δεν είναι το κατεβατό της άσκησης που έδωσα στο προηγούμενο link. Έλεος δηλαδή!! Απλά, η λογική που χρησιμοποιήσα είναι παρόμοια με το timer που είπες. Αλλα είναι ολόκληρη ιστορία! Πραγματικά...ας το πάμε σιγά σιγά και αν με το καλό φτάσουμε στις κλήσεις συστήματος βλέπουμε! :Ο

Off topic:
Θα ήθελα και μια γνώμη...για Πανεπιστήμιο Ιωαννίνων-Τμήμα Πληροφορικής-3ο Εξάμηνο, είναι λίγο τραβηγμένη η άσκηση? :/
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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 » 04 Ιούλ 2011, 11:44

linuxs έγραψε:Κοίταξε αυτό που χρειαζόμαστε δεν είναι το κατεβατό της άσκησης που έδωσα στο προηγούμενο link. Έλεος δηλαδή!! Απλά, η λογική που χρησιμοποιήσα είναι παρόμοια με το timer που είπες. Αλλα είναι ολόκληρη ιστορία! Πραγματικά...ας το πάμε σιγά σιγά και αν με το καλό φτάσουμε στις κλήσεις συστήματος βλέπουμε! :Ο

Off topic:
Θα ήθελα και μια γνώμη...για Πανεπιστήμιο Ιωαννίνων-Τμήμα Πληροφορικής-3ο Εξάμηνο, είναι λίγο τραβηγμένη η άσκηση? :/

Αν και δεν τον διάβασα όλον τον κώδικα, σαν concept άσκησης δεν το βρίσκω τραβηγμένο για 3ο εξάμηνο (αν και δεν γνωρίζω το επίπεδο). Απλά σαν υλοποίηση είναι τελείως platform-dependent, ενώ υπάρχουν ήδη έτοιμες συναρτήσεις που κάνουν την περισσότερη δουλειά (εννοώ για το μέτρημα του χρόνου, και όχι το φορκάρισμα και την διαχείριση των διεργασιών).

ΥΓ. Το laptop εδώ τρέχει Win7 και είναι i3 με 4Giga RAM... εσένα πόσα secs σου δίνει;
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό linuxs » 04 Ιούλ 2011, 12:07

migf1 έγραψε:
linuxs έγραψε:Κοίταξε αυτό που χρειαζόμαστε δεν είναι το κατεβατό της άσκησης που έδωσα στο προηγούμενο link. Έλεος δηλαδή!! Απλά, η λογική που χρησιμοποιήσα είναι παρόμοια με το timer που είπες. Αλλα είναι ολόκληρη ιστορία! Πραγματικά...ας το πάμε σιγά σιγά και αν με το καλό φτάσουμε στις κλήσεις συστήματος βλέπουμε! :Ο

Off topic:
Θα ήθελα και μια γνώμη...για Πανεπιστήμιο Ιωαννίνων-Τμήμα Πληροφορικής-3ο Εξάμηνο, είναι λίγο τραβηγμένη η άσκηση? :/

Αν και δεν τον διάβασα όλον τον κώδικα, σαν concept άσκησης δεν το βρίσκω τραβηγμένο για 3ο εξάμηνο (αν και δεν γνωρίζω το επίπεδο). Απλά σαν υλοποίηση είναι τελείως platform-dependent, ενώ υπάρχουν ήδη έτοιμες συναρτήσεις που κάνουν την περισσότερη δουλειά (εννοώ για το μέτρημα του χρόνου, και όχι το φορκάρισμα και την διαχείριση των διεργασιών).

ΥΓ. Το laptop εδώ τρέχει Win7 και είναι i3 με 4Giga RAM... εσένα πόσα secs σου δίνει;


...Time elapsed: 0.040000 μπορείς να ποστ'αρεις ακριβώς τον κώδικα να τον δοκιμάσω μήπως κάνουμε κάτι διαφορετικό εκεί :/
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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 » 04 Ιούλ 2011, 12:18

Αυτός εδώ είναι:
Spoiler: show
Κώδικας: Επιλογή όλων

/* -------------------------------------------------------------
* Τυπωνει και αθροίζει του πρώτους αριθμούς από το 1 έως το MAX
* -------------------------------------------------------------
*/
#include <stdio.h>
#include <math.h>
#include <time.h>

#define MAX 100000

int main ( void )
{
clock_t tstart;
double tstop;
long primesum = 0;
register int i, j;
int isprime = 1;

tstart = clock();
for (i=2; i <= MAX; i++)
{
for (j=2; j<=sqrt(i); j++)
{
if ( i%j == 0 ) {
isprime = 0; // FALSE
break;
}
}

if ( isprime ) {
printf("%d is a prime\n", i);
primesum += i;
}

isprime = 1; // TRUE
}

tstop = ((double)clock() - tstart) / CLOCKS_PER_SEC;
printf("Time elapsed: %f\n", tstop);

printf("\nSum of prime numbers from 1 to %d = %ld\n", MAX, primesum);

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

Για απλές συγκρίσεις πάντως, ο παρακάτω κώδικας πρέπει να είναι οκ...
Spoiler: show
Κώδικας: Επιλογή όλων

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

// ---------------------------------------------------------------------------------
int main( void )
{
clock_t tstart;
double tstop;

tstart = clock(); // εκκίνηση του χρονομέτρου
/* εδώ μπαίνει ο κώδικας προς χρονομέτρηση */
tstop = ( (double)clock() - tstart ) / CLOCKS_PER_SEC; // σταμάτημα του χρονομέτρου

printf("Time elapsed: %f\n", );

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

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

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

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

cron