Dev - C++ - Problema con programa para obtener el área de un círculo + Nuevo usuario

 
Vista:
Imágen de perfil de Reman

Problema con programa para obtener el área de un círculo + Nuevo usuario

Publicado por Reman (6 intervenciones) el 09/04/2017 06:24:31
¡Saludos!
Antes que nada, quiero decir que soy completamente nuevo en esto de la programación. He llevado un pequeño curso de HTML básico, pero realmente en mi opinión yo no me considero ni cerca a un programador aficionado.
En fin, tengo un pequeño problema con un programa que intenté crear en Dev C++ pero al parecer no tengo ni idea de cómo hacer la operación de área de un círculo.
Vean aquí el programa (disculpen el pequeño desorden en la operación):

Programa-para-sacar-area-de-circulo

Es un ejercicio que intenté hacer a partir de un libro de programación que obtuve de una feria de libro que se llevó a cabo en mi ciudad :P
Resultó ser algo caro el libro pero vale la pena si es para aprender algo que siempre he querido hacer como es la programación.

20170408_211922

Espero y me puedan ayudar, les agradecería mucho.

PD: Naturalmente, antes de recurrir aquí busqué en internet alguna forma de hacerlo pero realmente lo que encontraba no podía entenderlo muy bien (debo volver a mencionar que soy COMPLETAMENTE NUEVO en programación y especialmente en C++, sé que no es excusa pero espero y lo comprendan).

Muchas gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema con programa para obtener el área de un círculo + Nuevo usuario

Publicado por Thanatos (199 intervenciones) el 09/04/2017 12:42:31
Tu código está escrito en lenguaje C, la extensión del archivo debería ser .c: "Ejercicio2.c".
La extensión que estás utilizando (.cpp), se utiliza para el código de C++.

En lenguaje C:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>         // printf(), scanf(), getchar()
#include <math.h>          // powf()
 
#define PI 3.1416f         // constante global PI (macro)
 
void limpiarBuffer(void);  // prototipo de la función limpiarBuffer()
 
int main(void) {
    float diametro, area;
 
    printf("Diametro del circulo: ");
    scanf("%f", &diametro);
 
    area = PI * powf(diametro / 2.0f, 2.0f);
    printf("Area del circulo = %4.6f\n\n", area);
 
    printf("Presione una tecla para terminar...");
    limpiarBuffer();
    (void)getchar();
 
    return 0;
}
 
void limpiarBuffer(void) {
    int ch;
    while ((ch = getchar()) != '\n' && ch != EOF) { }
}


En lenguaje C++:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>             // cout, cin
#include <cmath>                // pow()
#include <limits>               // numeric_limits<>
 
using namespace std;
 
void limpiarBuffer(void);       // prototipo de la función limpiarBuffer()
 
int main() {
    const float kPi = 3.1416f;  // constante local kPi
    float diametro, area;
 
    cout << "Diametro del circulo: ";
    cin >> diametro;
 
    area = kPi * pow(diametro / 2.0f, 2.0f);
    cout << "Area del circulo = " << area << "\n\n";
 
    cout << "Presione una tecla para terminar...";
    limpiarBuffer();
    (void)cin.get();
 
    return 0;
}
 
void limpiarBuffer() {
    (void) cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema con programa para obtener el área de un círculo + Nuevo usuario

Publicado por agustin (522 intervenciones) el 09/04/2017 23:25:11
La f detrás de un número de coma flotante jamás lo había visto ¿eso es lo mismo que colocar delante (float)? Al ser ya un número de coma flotante no necesita ya nada de eso ¿no?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Reman

Problema con programa para obtener el área de un círculo + Nuevo usuario

Publicado por Reman (6 intervenciones) el 10/04/2017 09:47:02
Hola Agustin.
Mmm... no logro entender completamente a que te refieres :S, no se si hablas acerca de mi programa o del programa de Thanatos, pero yo tengo entendido que float declara las variables mientras que f señala que se desplegará el valor de tipo flotante.
No estoy completamente seguro si es eso a lo que te refieres, jeje, pero supongo de que si hablas del código propuesto por Thanatos entonces vendría siendo algo similar a lo que dices.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Reman

Problema con programa para obtener el área de un círculo + Nuevo usuario

Publicado por Reman (6 intervenciones) el 10/04/2017 09:23:45
Muchas gracias por responder.
Agradezco mucho tu ayuda, aunque el libro limita a que los ejercicios no tengan condiciones como WHILE, pero me ayudaste resolver mi duda y eso es lo más importante.

Saludos.
PD: Ahora que mencionas lo de que escribí mi programa en C. Yo realicé un ejercicio pasado con el mismo código y lo guardé como un archivo .cpp y logró compilarse y ejecutarse. ¿Será por la similitud entre los dos lenguajes?

Programa-para-obtener-area-de-un-cuadrado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema con programa para obtener el área de un círculo + Nuevo usuario

Publicado por agustin (522 intervenciones) el 10/04/2017 22:15:33
Me refiero a esta linea:
area = kPi * pow(diametro / 2.0f, 2.0f);
Esas f's que he resaltado. No se que hacen esas pero intuyo que será lo mismo que:
area = kPi * pow(diametro / (float)2.0, (float)2.0);
Aunque al ser números con coma flotante tampoco se necesita hacer eso. ¿me lo explican?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema con programa para obtener el área de un círculo + Nuevo usuario

Publicado por Thanatos (199 intervenciones) el 11/04/2017 06:32:15
1
area = kPi * pow(diametro / 2.0f, 2.0f);

La f al final de los números de coma flotante, es uno de los sufijos que se utilizan para escribir valores literales:

1
2
3
4
5
6
7
8
9
10
11
unsigned int num1 = 2u;
long int num2 = 2L;
unsigned long int num3 = 2UL;
 
// El sufijo 'LL' se puede usar desde el estándar C++ 2011
long long int num4 = 2LL;
unsigned long long int num5 = 2ULL;
unsigned long long int num6 = 2LLU;
 
float num7 = 2.0f;
long double num8 = 2.0L;

Los sufijos se pueden escribir con mayúsculas o minúsculas. Los literales enteros escritos sin sufijo se interpretan como de tipo int, y los literales de punto flotante sin sufijo, como double.

En las líneas:

1
area = kPi * pow(diametro / 2.0f, 2.0f);

1
area = kPi * pow(diametro / (float)2.0, (float)2.0);

Los literales 2.0f de la primera, son interpretados directamente como valores de tipo float, aquí no se realiza ningún tipo de casting, ni siquiera implícitamente. Como en C++ la función pow() está sobrecargada, al recibir dos parámetros de tipo float, el valor que devuelve también es de tipo float.

En la segunda, al realizarse un casting de un tipo de dato de mayor capacidad (double), a un tipo de dato de menor capacidad (float), podría alterarse el valor almacenado. Se puede usar si se tiene la seguridad de que no alterará el valor original al realizar la conversión.

Cuando se utilizan literales es preferible utilizar los sufijos, los castings sólo cuando es necesario.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema con programa para obtener el área de un círculo + Nuevo usuario

Publicado por agustin (522 intervenciones) el 11/04/2017 10:25:54
Una última pregunta ¿eso de los literales es solo cosa de c++ o también se usan en C? Es que yo estoy aprendiendo C y nunca oí hablar de ellos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema con programa para obtener el área de un círculo + Nuevo usuario

Publicado por Thanatos (199 intervenciones) el 11/04/2017 23:03:12
Sí, los literales con sufijos también se usan en C.

En C algunos detalles pueden causar confusión al momento de mostrar los valores por la salida estándar, debido al uso de los especificadores de formato. Por ejemplo, este código compilado con MinGW en Linux funciona correctamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
 
int main(void) {
    unsigned int num1 = 2u;
    long int num2 = 2L;
    unsigned long int num3 = 2UL;
 
    float num4 = 2.0f;
    long double num5 = 2.0L;
 
    // Desde el estándar del lenguaje C de 1999
    long long int num6 = 2LL;
    unsigned long long int num7 = 2ULL;
    unsigned long long int num8 = 2LLU;
 
    printf("num1 = %u\n", num1);
    printf("num2 = %ld\n", num2);
    printf("num3 = %lu\n", num3);
    printf("num4 = %f\n", num4);
    printf("num5 = %Lf\n", num5);
    printf("num6 = %lld\n", num6);
    printf("num7 = %llu\n", num7);
    printf("num8 = %llu\n", num8);
 
    return 0;
}
 
/*
 *  Comando de compilación/ejecución:
 *  gcc -std=c11 -o main main.c && main
 *
 *  Salida:
 *  num1 = 2
 *  num2 = 2
 *  num3 = 2
 *  num4 = 2.000000
 *  num5 = 2.000000
 *  num6 = 2
 *  num7 = 2
 *  num8 = 2
 */

Pero si se compila con MinGW en Windows (con el mismo comando), la salida para num5 muestra el valor -0.000000. Esto ocurre por las diferencias en las implementaciones del compilador GCC y las librerías en tiempo de ejecución de Microsoft. Se puede solucionar el problema en la salida, agregándole al código esta directiva de preprocesador:

1
#define printf __mingw_printf

Otra opción es agregar un argumento extra al comando de compilación:

gcc -std=c11 -D__USE_MINGW_ANSI_STDIO -o main main.c && main

Otro detalle, en Windows, es el especificador de formato para num5 (long double). Si se escribe %lf (con minúsculas), el compilador espera que se le pase un double, por eso aún usando la directiva de preprocesador o el argumento extra en el comando de compilación, muestra como salida -0.000000. Aunque no sucede en Linux, se puede comprobar que %Lf es el especificador correcto, agregando un nuevo argumento al comando de compilación para verificar con más detalle los especificadores de formato:

Si no se está usando la directiva de preprocesador:
gcc -std=c11 -Wformat=2 -D__USE_MINGW_ANSI_STDIO -o main main.c && main

Si se está usando la directiva de preprocesador:
gcc -std=c11 -Wformat=2 -o main main.c && main

Si se usa uno de los anteriores comandos, con la línea 20 del código escrita de esta manera:

1
printf("num5 = %lf\n", num5);

Se obtiene la advertencia:

1
2
3
4
main.c: In function 'main':
main.c:20:22: warning: format '%lf' expects argument of type 'double', but argument 2 has type 'long double' [-Wformat=]
     printf("num5 = %lf\n", num5);
                      ^
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Problema con programa para obtener el área de un círculo + Nuevo usuario

Publicado por agustin (522 intervenciones) el 12/04/2017 15:33:43
Muy interesante todo. La verdad es que ni sabia que existian pero lo tendré muy en cuenta para futuros códigos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar