topografoi.com



Author Topic: Άσκηση: Τρίγωνα;  (Read 7313 times)

chiossif

  • Posts: 334
Άσκηση: Τρίγωνα;
« on: 26 Δεκ 2007, 17:07 »
Εγκαινιάζω το forum με μια ασκησούλα:

Σε ένα αρχείο κειμένου υπάρχουν τρεις πραγματικοί αριθμοί σε κάθε γραμμή. Ζητείται ένα πρόγραμμα το οποίο θα διαβάσει όλες τις τριάδες μέχρι να τελειώσουν και για κάθε μία από αυτές θα ελέγχει αν είναι πλευρές τριγώνου και τότε θα υπολογίζει τα υπόλοιπα στοιχεία του τριγώνου δηλαδή γωνίες, περίμετρο και εμβαδό και θα τα εμφανίζει κατάλληλα. Προαιρετικά μπορείτε με βάση τα στοιχεία αυτά να χαρακτηρίσετε το τρίγωνο σε ορθογώνιο, οξυγώνιο ή αμβλυγώνιο, ισόπλευρο ισοσκελές ή σκαληνό ή ότι άλλο τριγωνο-σχετικό φανταστείτε...

Αυτήν την ασκησούλα όπως και πολλές άλλες δεν τις έχω "γεννήσει" και άρα δεν διεκδικώ την πατρότητα καμιάς (εκτός και αν το γράψω ρητά) (άνω τελεία) τις έχω διαβάσει σε βιβλία, που δυστυχώς δεν θυμάμαι, ή τις είχα συναντήσει όταν ήμουν φοιτητής. Επίσης μην ξεχάσετε να σχολιάσετε την λύση της...

Κωστής

  • Administrator
  • Posts: 577
  • Gender: Male
    • kp
Απ: Άσκηση: Τρίγωνα;
« Reply #1 on: 27 Δεκ 2007, 17:21 »
Έβαλα μόνο την απολύτως βασική διαδικασία του ελέγχου, μονο για το αν δημιουργούν τρίγωνο οι αριθμοί. (Νταξ, απο κει και πέρα μπορούν να μπουν παπάδες, αλλα αυτη τη στιγμή προχωράει και το development της τοποδιανομής.) Μολις συνειδητοποίησα ότι ειχα καιρό να γραψω σε c++, λέω να κάνω μια δοκιμή και σε Python..
Code: (cpp) [Select]
#include <iostream>
#include<fstream>
using namespace std;

int main()
{
double a,b,c;
ifstream infile("triangle.txt");
if (! infile.is_open() )
{
cout<<"Error";
exit (-1);
}
while (!infile.eof() )
{
infile>>a>>b>>c;
if ( (a < b + c) && ( b < a + c ) && ( c < a + b ) )
{
cout <<a<<","<<b<<","<<c<<":they form a triangle " << endl;
}
else
cout <<a<<","<<b<<","<<c<<":they don't form a triangle" << endl;
}

return 0;
}
« Last Edit: 28 Δεκ 2007, 10:16 by Κωστής »

liberostelios

  • Administrator
  • Posts: 145
  • Gender: Male
Απ: Άσκηση: Τρίγωνα;
« Reply #2 on: 27 Δεκ 2007, 20:06 »
Έχει πέσει πολύ δουλειά στο προγραμματιστικό forum ;D

Καμιά ασκησούλα για VB ή C# δεν έχει (πάλι ντομάτες θα φάμε μου φαίνεται ::));

chiossif

  • Posts: 334
Απ: Άσκηση: Τρίγωνα;
« Reply #3 on: 27 Δεκ 2007, 20:21 »
Μόλις τελείωσα:


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

#define RAD2DEG 57.2957795138210
#define EPS 1e-8

int main() {
    
double abcgAgBgCpet;
    
register int k;

    for (
k=1;scanf("%lf %lf %lf",&a,&b,&c)==3;k++) {
        
printf("%08d:   a=%8.3lf  b=%8.3lf  c=%8.3lf"kabc);
        if (
a+b>=&& a+c>=&& b+c>=a) {
            
p=a+b+c;
            
t=p/2.0;
            
e=sqrt(t*(t-a)*(t-b)*(t-c));
            
gA=acos(0.5*((b*b+c*c)-a*a)/(b*c))*RAD2DEG;
            
gB=acos(0.5*((a*a+c*c)-b*b)/(a*c))*RAD2DEG;
            
gC=acos(0.5*((b*b+a*a)-c*c)/(b*a))*RAD2DEG;
            
printf("\n           gA=%8.3lf gB=%8.3lf gC=%8.3lf"gAgBgC);
            
printf("\n           Perimeter=%8.3lf Area=%8.3lf"pe);
            if (
fabs(a-b)<EPS && fabs(a-c)<EPS)
                
printf(" is Equilateral");
            else if (
fabs(a-b)<EPS || fabs(a-c)<EPS || fabs(b-c)<EPS)
                
printf(" is Isosceles");
            else
                
printf(" is Scalene");
            if (
fabs(gA-90)<EPS || fabs(gB-90)<EPS || fabs(gC-90)<EPS)
                
printf(" and is right-angled.\n");
            else if (
gA>90 || gB>90 || gC>90)
                
printf(" and is Obtuse.\n");
            else
                
printf(" and is Acute.\n");
        } else {
            
printf(" is NOT a triangle.\n");
        }
    }
    return 
0;
}


με αυτό το αρχείο:
Code: [Select]
3 4 5
9 9 9
3 4 7
3.0 4.0000001 4.9999999
1 2 1
3 2 2
1 3 1

δίνει:
Code: [Select]
00000001:   a=   3.000  b=   4.000  c=   5.000
           gA=  36.870 gB=  53.130 gC=  90.000
           Perimeter=  12.000 Area=   6.000 is Scalene and is right-angled.
00000002:   a=   9.000  b=   9.000  c=   9.000
           gA=  60.000 gB=  60.000 gC=  60.000
           Perimeter=  27.000 Area=  35.074 is Equilateral and is Acute.
00000003:   a=   3.000  b=   4.000  c=   7.000
           gA=   0.000 gB=   0.000 gC= 180.000
           Perimeter=  14.000 Area=   0.000 is Scalene and is Obtuse.
00000004:   a=   3.000  b=   4.000  c=   5.000
           gA=  36.870 gB=  53.130 gC=  90.000
           Perimeter=  12.000 Area=   6.000 is Scalene and is Acute.
00000005:   a=   1.000  b=   2.000  c=   1.000
           gA=   0.000 gB= 180.000 gC=   0.000
           Perimeter=   4.000 Area=   0.000 is Isosceles and is Obtuse.
00000006:   a=   3.000  b=   2.000  c=   2.000
           gA=  97.181 gB=  41.410 gC=  41.410
           Perimeter=   7.000 Area=   1.984 is Isosceles and is Obtuse.
00000007:   a=   1.000  b=   3.000  c=   1.000 is NOT a triangle.

Καλή Χρονιά σε όλους...


chiossif

  • Posts: 334
Απ: Άσκηση: Τρίγωνα;
« Reply #4 on: 27 Δεκ 2007, 20:28 »
Έχει πέσει πολύ δουλειά στο προγραμματιστικό forum ;D

Καμιά ασκησούλα για VB ή C# δεν έχει (πάλι ντομάτες θα φάμε μου φαίνεται ::));

Φίλε liberostelio,

λύσ'τη σε VB. Περίεργος είμαι να δω πως διαβάζει η VB το αρχείο...

Φίλοι,

τυχεροί είστε που η κόρη μου θέλει να "παίξει".
Γιατί έχω κατά νου να φτιάξω ένα αρχείο με 2Μ τρίγωνα
για να κοντράρω τον pythonά... (εκεί ΣΙΓΟΥΡΑ του ρίχνω)

Α, δεν είναι απίθανο να'χω και κανα bug.

Καλή Χρονιά και πάλι...

chiossif

  • Posts: 334
Απ: Άσκηση: Τρίγωνα;
« Reply #5 on: 28 Δεκ 2007, 00:12 »
Το αρχείο 1374926_triangles.txt.gz έχει 1374926 τρίγωνα ενώ το αρχείο 2224677_triangles.txt.gz έχει 2224677 τρίγωνα. (Επαναλαμβάνεται η ίδια επτάδα τριγώνων αλλά αυτό δεν έχει σημασία).

Το πρόγραμμα μου σε C δίνει:
Code: [Select]
chiossif@dhcppc0:~/My Code/2007/Forums/triangles> time ./triangles <2224677_triangles.txt >/dev/null

real    0m14.358s
user    0m14.321s
sys     0m0.036s
chiossif@dhcppc0:~/My Code/2007/Forums/triangles>
στον ένα από τους Intel(R) Core(TM)2 CPU 6300 @ 1.86GHz που τρέχουν Linux 2.6.22.13-0.3-default x86_64 σε 2GB RAM.

Πριν αποσυμπιέσετε τα αρχεία φροντίστε για 30ΜΒ χώρο στο δίσκο. ΑΝ το τρέξετε ΑΠΟΦΥΓΕΤΕ την έξοδο στην οθόνη για να τελειώσει φέτος. Σε Linux/Unix αποσυμπιέστε με gunzip και τρέξτε όπως παραπάνω με ανακατεύθυνση εισόδου <2224677_triangles.txt και εξόδου >/dev/null ή αλλιώς "αχόρταγος". Σε άλλες γλώσσες ανοίξτε ανάλογα για είσοδο και έξοδο τα ίδια αρχεία. Δεν γνωρίζω αν έχει κάτι ανάλογο με το null ο Βασιλάκης στο δικό του το λσ (γιορτάζει μεθαύριο χρόνια του πολλά).

Χρόνια Πολλά και Καλή Χρονιά, με υγεία και ευτυχία για όλο τον κόσμο.

 

Copyright © topografoi.com