Reto
2008-08-27 00:39:39-05
Programacion
Modificar el programa de saidjose:
Superficie de un triangulo rectangulo
de tal manera que quede lo mas profesional posible: validación de datos, validación de entrada, que acepte argumentos a través de la linea de comandos:
# Calcula la superficie de un objeto de altura 10 y de base 3 al estilo BSD:
% calcular -a 10 -b 3
O al estilo GNU:
% calcular --altura=10 --base=3
O usando ambos estilos:
% calcular -a 10 --base=3
*SIN* usar ningún widget (GTK+, Motif, Qt, GNUStep, etc, etc).
Es decir, que no sea para el entorno gráfico sino para la consola.
Tip: En entornos BSD y GNU/Linux pueden usar la funcion getopt(3) incluído en la librería #include <unistd.h> para checar los argumentos de la función main(3).
Permalink: http://www.mononeurona.org/users/entry/asarch/1523
Comentblogs:1.-
thot wrote:
No pensaba hacerlo, pero me tomé 10 minutos en la chamba, y aquà está, si alguien lo desea, lo explicaré a detalle en una entrada de mi blog:
#include <stdio.h>
#include <getopt.h>
int main (int argc, char *argv[])
{
int c;
float a = 0, b = 0,area, hypotenusa;
extern char *optarg;
extern int optind, optopt, opterror;
static struct option long_options[] =
{
{"base", required_argument, 0, 'a'},
{"altura", required_argument, 0, 'b'},
{0, 0, 0, 0}
};
int option_index = 0;
while ((c=getopt_long(argc, argv, "a:b:",long_options, &option_index))!=-1)
{
switch(c)
{
case 'a':
printf ("Base:%s\n",optarg);
sscanf (optarg,"%f",&a);
break;
case 'b':
printf ("Altura:%s\n",optarg);
sscanf (optarg,"%f",&b);
break;
case '?':
printf ("Opcion desconocida %c\n", optopt);
break;
}
}
area = (b*a)/2;
hypotenusa = (b*b) + (a*a);
printf ("El area del triangulo equilatero es: %0.2f \nLa hypotenusa al cuadrado es %0.2f\n",area,hypotenusa);
return 0;
}
2008-08-29 11:46:42-05
No pensaba hacerlo, pero me tomé 10 minutos en la chamba, y aquà está, si alguien lo desea, lo explicaré a detalle en una entrada de mi blog:
#include <stdio.h>
#include <getopt.h>
int main (int argc, char *argv[])
{
int c;
float a = 0, b = 0,area, hypotenusa;
extern char *optarg;
extern int optind, optopt, opterror;
static struct option long_options[] =
{
{"base", required_argument, 0, 'a'},
{"altura", required_argument, 0, 'b'},
{0, 0, 0, 0}
};
int option_index = 0;
while ((c=getopt_long(argc, argv, "a:b:",long_options, &option_index))!=-1)
{
switch(c)
{
case 'a':
printf ("Base:%s\n",optarg);
sscanf (optarg,"%f",&a);
break;
case 'b':
printf ("Altura:%s\n",optarg);
sscanf (optarg,"%f",&b);
break;
case '?':
printf ("Opcion desconocida %c\n", optopt);
break;
}
}
area = (b*a)/2;
hypotenusa = (b*b) + (a*a);
printf ("El area del triangulo equilatero es: %0.2f \nLa hypotenusa al cuadrado es %0.2f\n",area,hypotenusa);
return 0;
}
2008-08-29 11:46:42-05
2.-
asarch wrote:
Thot:
Bug:
Si tecleas:
./calculo -b 10
el programa nunca pide el valor de la altura.
Si tecleas:
./calculo
El programa no pide ningun valor.
2008-08-29 11:52:54-05
Thot:
Bug:
Si tecleas:
./calculo -b 10
el programa nunca pide el valor de la altura.
Si tecleas:
./calculo
El programa no pide ningun valor.
2008-08-29 11:52:54-05
3.-
thot wrote:
Como te expliqué no fue Bug, simplemente esos casos no los quise considerar. Alargan el código y pierde la esencia del uso de las funciones, pero aquà está:
#include <stdio.h>
#include <getopt.h>
int main (int argc, char *argv[])
{
int c;
int flagaltura = 0, flagbase=0;
float a = 0, b = 0,area, hypotenusa;
extern char *optarg;
extern int optind, optopt, opterror;
static struct option long_options[] =
{
{"base", required_argument, 0, 'b'},
{"altura", required_argument, 0, 'a'},
{0, 0, 0, 0}
};
int option_index = 0;
while ((c=getopt_long(argc, argv, "a:b:",long_options, &option_index))!=-1)
{
switch(c)
{
case 'b':
printf ("Base:%s\n",optarg);
if (sscanf (optarg,"%f",&b)==1)
flagbase=1;
break;
case 'a':
printf ("Altura:%s\n",optarg);
if (sscanf (optarg,"%f",&a)==1)
flagaltura = 1;
break;
case '?':
printf ("Opcion desconocida %c\n", optopt);
break;
}
}
if (!flagaltura)
{
printf ("Introduzca la altura:");
scanf ("%f",&a);
}
if (!flagbase)
{
printf ("Introduzca la base:");
scanf("%f",&b);
}
area = (b*a)/2;
hypotenusa = (b*b) + (a*a);
printf ("El area del triangulo equilatero es: %0.2f \nLa hypotenusa al cuadrado es %0.2f\n",area,hypotenusa);
return 0;
}
2008-08-29 11:57:13-05
Como te expliqué no fue Bug, simplemente esos casos no los quise considerar. Alargan el código y pierde la esencia del uso de las funciones, pero aquà está:
#include <stdio.h>
#include <getopt.h>
int main (int argc, char *argv[])
{
int c;
int flagaltura = 0, flagbase=0;
float a = 0, b = 0,area, hypotenusa;
extern char *optarg;
extern int optind, optopt, opterror;
static struct option long_options[] =
{
{"base", required_argument, 0, 'b'},
{"altura", required_argument, 0, 'a'},
{0, 0, 0, 0}
};
int option_index = 0;
while ((c=getopt_long(argc, argv, "a:b:",long_options, &option_index))!=-1)
{
switch(c)
{
case 'b':
printf ("Base:%s\n",optarg);
if (sscanf (optarg,"%f",&b)==1)
flagbase=1;
break;
case 'a':
printf ("Altura:%s\n",optarg);
if (sscanf (optarg,"%f",&a)==1)
flagaltura = 1;
break;
case '?':
printf ("Opcion desconocida %c\n", optopt);
break;
}
}
if (!flagaltura)
{
printf ("Introduzca la altura:");
scanf ("%f",&a);
}
if (!flagbase)
{
printf ("Introduzca la base:");
scanf("%f",&b);
}
area = (b*a)/2;
hypotenusa = (b*b) + (a*a);
printf ("El area del triangulo equilatero es: %0.2f \nLa hypotenusa al cuadrado es %0.2f\n",area,hypotenusa);
return 0;
}
2008-08-29 11:57:13-05
4.-
asarch wrote:
Tienes otro bug:
Escribiste:
hypotenuza = (b*b) + (a*a);
y deberia de ser:
hypotenuza = sqrt((b * b) + (a * a));
2008-08-29 12:24:21-05
Tienes otro bug:
Escribiste:
hypotenuza = (b*b) + (a*a);
y deberia de ser:
hypotenuza = sqrt((b * b) + (a * a));
2008-08-29 12:24:21-05
5.-
thot wrote:
jajajajaja. No es bug: "La hypotenusa al cuadrado es %0.2f"
Lo hice para no tener que agregar la biblioteca math.h (y para que quedara igual que el código de saidjosé).
2008-08-29 13:32:48-05
jajajajaja. No es bug: "La hypotenusa al cuadrado es %0.2f"
Lo hice para no tener que agregar la biblioteca math.h (y para que quedara igual que el código de saidjosé).
2008-08-29 13:32:48-05
8.-
asarch wrote:
http://www.bsd.cl/wiki/index.php?title=Intel(R)_PRO/Wireless_3945ABG_con_WPA_en_FreeBSD.
2008-09-07 16:21:12-05
http://www.bsd.cl/wiki/index.php?title=Intel(R)_PRO/Wireless_3945ABG_con_WPA_en_FreeBSD.
2008-09-07 16:21:12-05










