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

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

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

Δημοσίευσηαπό clepto » 04 Ιούλ 2011, 00:32

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

Κώδικας: Επιλογή όλων
#include <stdio.h>

main(void) {

int x, y, a, xya, moxya;

printf("ΔΩΣΕ 3 ΑΡΙΘΜΟΥΣ");
scanf("%d %d %d", &x, &y, &a);

xya = x+y+a;
printf("ΤΟ ΑΘΡΟΙΣΜΑ ΤΟΥΣ ΕΙΝΑΙ %d /n", xya);

if (xya>0) {
moxya = xya/3;
printf("Ο ΜΕΣΟΣ ΟΡΟΣ ΕΙΝΑΙ %d", moxya);
}
else if (xya<=0) {

if (x>y && x>a) {
printf("μεγαλύτερο είναι το %d", x);
}
else if (y>x && y>a) {
printf("μεγαλύτερο είναι το %d", y);
}
else if (a>x && a>y) {
printf("μεγαλύτερο είναι το %d", a);
}

}

}
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

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

Μόλις βρήκα κι αυτό το link για τους πρώτους αριθμούς: http://www.troubleshooters.com/codecorn ... umbers.htm
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Διαβάζω πως δεν χρειάζεται να εξετάζουμε το modulo όλων των αριθμών από το 2 έως το i-1, αρκεί να εξετάσουμε έως και την τετραγωνική ρίζα του i, οπότε μειώνεται πολύ ο χρόνος εκτέλεσης.

Άρα ο νέος κώδικας είναι:
Κώδικας: Επιλογή όλων

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

#define MAX 15

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

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
}

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

return 0;
}

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

migf1 έγραψε:Μου έβγαλε την ψυχή φίλε linuxs, αλλά νομίζω το κατάφερα...

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

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

#define MAX 15

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

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

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

isprime = 1; // TRUE
}

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

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

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

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

Σε ευχαριστώ για την προσπάθεια! ;) Το πρόβλημα ήταν ότι δεν έιχα κοιμηθεί 1 βράδυ και δεν άντεχα άλλο. Μου την έδωσε και λίγο το πρόβλημα και τα παράτητα (λεω και αύριο μέρα είναι). Λοιπόν, όταν προσπαθούσα να το λύσω σκεφτόμουν πολλούς τρόπους και σκέφτηκα μηπως να το συζητήσουμε? :/ Όπως είπες υπάρχουν πολλοι τρόποι να λυθεί...

θα το ξανακοιτάξω απο την αρχή και θα προσθέσω και τα υπόλοιπα στο αρχικό...
migf1 έγραψε:Διαβάζω πως δεν χρειάζεται να εξετάζουμε το modulo όλων των αριθμών από το 2 έως το i-1, αρκεί να εξετάσουμε έως και την τετραγωνική ρίζα του i, οπότε μειώνεται πολύ ο χρόνος εκτέλεσης.

Άρα ο νέος κώδικας είναι:
Κώδικας: Επιλογή όλων

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

#define MAX 15

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

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
}

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

return 0;
}

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

migf1 έγραψε:Μου έβγαλε την ψυχή φίλε linuxs, αλλά νομίζω το κατάφερα...

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

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

#define MAX 15

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

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

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

isprime = 1; // TRUE
}

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

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 » 04 Ιούλ 2011, 10:42

clepto έγραψε:απλή άσκηση,
να γράψετε πρόγραμμα που θα παίρνει ως είσοδο 3 ακέραιους αριθμούς και θα υπολογίζει το άθροισμα τους, αν το άθροισμα είναι μεγαλύτερο του μηδέν να βρίσκει τον μέσο όρο ενώ σε διαφορετική περίπτωση να δίνει τον μεγαλύτερο..

Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdio.h>

main(void) {

int x, y, a, xya, moxya;

printf("ΔΩΣΕ 3 ΑΡΙΘΜΟΥΣ");
scanf("%d %d %d", &x, &y, &a);

xya = x+y+a;
printf("ΤΟ ΑΘΡΟΙΣΜΑ ΤΟΥΣ ΕΙΝΑΙ %d /n", xya);

if (xya>0) {
moxya = xya/3;
printf("Ο ΜΕΣΟΣ ΟΡΟΣ ΕΙΝΑΙ %d", moxya);
}
else if (xya<=0) {

if (x>y && x>a) {
printf("μεγαλύτερο είναι το %d", x);
}
else if (y>x && y>a) {
printf("μεγαλύτερο είναι το %d", y);
}
else if (a>x && a>y) {
printf("μεγαλύτερο είναι το %d", a);
}

}

}

Εδώ μια άλλη υλοποίηση της ίδιας άσκησης η οποία είναι ανεξάρτητη από το πλήθος των αριθμών στην είσοδο, υπό την έννοια πως λειτουργεί για οποιοδήποτε πλήθος αριθμών αλλάζοντας την τιμή της σταθεράς: MAXNUMS
Κώδικας: Επιλογή όλων

/* ------------------------------------------------------------------------
* να γράψετε πρόγραμμα που θα παίρνει ως είσοδο 3 ακέραιους αριθμούς και θα
* υπολογίζει το άθροισμα τους, αν το άθροισμα είναι μεγαλύτερο του μηδέν να
* βρίσκει τον μέσο όρο ενώ σε διαφορετική περίπτωση να δίνει τον μεγαλύτερο
*/

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

#define MAXNUMS 3

int main( void )
{
int n, max, sum = 0;
register int i;

for (i=0; i < MAXNUMS; i++)
{
printf("Enter num #%d: ", i+1);
scanf("%d", &n);
if (i == 0) // στην 1η επανάληψη του loop
max = n; // αρχικοποιούμε το max
else
max = n > max ? n : max; // υπολογισμός του μεγαλύτερου
sum += n; // υπολογισμός του αθροίσματος
}

if ( sum > 0 )
printf("\nThe average of those numbers is: %d\n", sum/MAXNUMS);
else
printf("\nThe maximum of those numbers is: %d\n", max);

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

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

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

linuxs έγραψε:
[snip]
θα το ξανακοιτάξω απο την αρχή και θα προσθέσω και τα υπόλοιπα στο αρχικό...

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

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

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

Μπορεί κάποιος να κάνει πρόγραμμα που να μετρά τον χρόνο εκτέλεσης του αλγορίθμου? :/ Θα είναι φανταστικό αν μπορούμε να μετράμε το πόσο γρήγορα εκτελείτε!!! :Ο
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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, 10:47

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

migf1 έγραψε:
clepto έγραψε:απλή άσκηση,
να γράψετε πρόγραμμα που θα παίρνει ως είσοδο 3 ακέραιους αριθμούς και θα υπολογίζει το άθροισμα τους, αν το άθροισμα είναι μεγαλύτερο του μηδέν να βρίσκει τον μέσο όρο ενώ σε διαφορετική περίπτωση να δίνει τον μεγαλύτερο..

Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdio.h>

main(void) {

int x, y, a, xya, moxya;

printf("ΔΩΣΕ 3 ΑΡΙΘΜΟΥΣ");
scanf("%d %d %d", &x, &y, &a);

xya = x+y+a;
printf("ΤΟ ΑΘΡΟΙΣΜΑ ΤΟΥΣ ΕΙΝΑΙ %d /n", xya);

if (xya>0) {
moxya = xya/3;
printf("Ο ΜΕΣΟΣ ΟΡΟΣ ΕΙΝΑΙ %d", moxya);
}
else if (xya<=0) {

if (x>y && x>a) {
printf("μεγαλύτερο είναι το %d", x);
}
else if (y>x && y>a) {
printf("μεγαλύτερο είναι το %d", y);
}
else if (a>x && a>y) {
printf("μεγαλύτερο είναι το %d", a);
}

}

}

Εδώ μια άλλη υλοποίηση της ίδιας άσκησης η οποία είναι ανεξάρτητη από το πλήθος των αριθμών στην είσοδο, υπό την έννοια πως λειτουργεί για οποιοδήποτε πλήθος αριθμών αλλάζοντας την τιμή της σταθεράς: MAXNUMS
Κώδικας: Επιλογή όλων

/* ------------------------------------------------------------------------
* να γράψετε πρόγραμμα που θα παίρνει ως είσοδο 3 ακέραιους αριθμούς και θα
* υπολογίζει το άθροισμα τους, αν το άθροισμα είναι μεγαλύτερο του μηδέν να
* βρίσκει τον μέσο όρο ενώ σε διαφορετική περίπτωση να δίνει τον μεγαλύτερο
*/

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

#define MAXNUMS 3

int main( void )
{
int n, max, sum = 0;
register int i;

for (i=0; i < MAXNUMS; i++)
{
printf("Enter num #%d: ", i+1);
scanf("%d", &n);
if (i == 0) // στην 1η επανάληψη του loop
max = n; // αρχικοποιούμε το max
else
max = n > max ? n : max; // υπολογισμός του μεγαλύτερου
sum += n; // υπολογισμός του αθροίσματος
}

if ( sum > 0 )
printf("\nThe average of those numbers is: %d\n", sum/MAXNUMS);
else
printf("\nThe maximum of those numbers is: %d\n", max);

exit(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 » 04 Ιούλ 2011, 10:54

linuxs έγραψε:Μπορεί κάποιος να κάνει πρόγραμμα που να μετρά τον χρόνο εκτέλεσης του αλγορίθμου? :/ Θα είναι φανταστικό αν μπορούμε να μετράμε το πόσο γρήγορα εκτελείτε!!! :Ο

Αυτό υπάρχει κάπου έτοιμο, ή αν όχι τελείως έτοιμο σχεδόν έτοιμο... μισό να γκουγκλάρω να το βρω.

Στο μεταξύ, αν κάνεις compile με flags -pg (αν το θυμάμαι καλά) και το τρέξεις 1 φορά το πρόγραμμά σου, μετά μπορείς να χρησιμοποιήσεις το gprof (ο profiler της GNU) για να δεις ακριβώς πόσο χρόνο καταναλώνει η κάθε συνάρτηση του προγράμματος.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

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

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

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

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

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

cron