Soy nuevo en programación. Me gustaría llamar desde funciones (primero, segundo, tercero las variables en la función "enter" y en la función "matemáticas" en consecuencia).

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

void math (void);
void first (void);
void second (void);
void third (void);
void enter(void);
void scan(void);


int main() 
{

 first();  //function
 second(); //function
 third();  //function
 enter();  //function
 printf("\n\n Would you like to edit? (Y/N)\n\n");
 scan();   //function
 return(0);
}

Aquí está la entrada del usuario:

void first (void){
float a;
printf("Enter First number: ");
scanf("%f",&a);
 }

 void second (void){
 float b;
 printf("Enter Second number: ");
 scanf("%f",&b);
  }

  void third (void){
  float c;
  printf("Enter Third number: ");
  scanf("%f", &c );
  }

¿Cómo puedo llamar a las variables desde la entrada del usuario a la función a continuación?

  void enter(){
  float a,b,c;
  printf("you have entered a: %f, b: %f, c:%f", a,b,c);
     }

Este es el bucle en caso de que el usuario desee editar o continuar con los números de entrada iniciales.

    void scan(void){
    int ch;
    scanf("%d", &ch);
    if (ch==1){
        main();

        }else{
        math();
        }
        }

Aquí también me gustaría llamar a las variables de entrada desde la función (primer, segundo tercio) para realizar algunos cálculos matemáticos.

        void math (void){
           float a,b,c;
           float x,y,z;
           x=a+b+c;
           y= powf(x,2);
           z=sqrt(y);

           printf("Final Result of Addition is: %f \n Final Result of 
           Multiplication is: %f \n Final Result of squareroot  is:%f\n 
           ",x,y,z);
                          }
0
Klayd Pro 27 feb. 2018 a las 23:53

3 respuestas

La mejor respuesta

Es mejor si las funciones no dependen o modifican datos externos a ellas. No siempre es posible, pero es mejor si se pueden definir con ese objetivo en mente.

En su caso, las funciones first, second y third están haciendo esencialmente lo mismo. Será mejor usar solo una función y darle un nombre más apropiado, como read_float y cambiar el tipo de retorno para que el valor ingresado por el usuario regrese a la función de llamada.

Declararlo como:

float read_float(char const* prompt);

Entonces, puedes usarlo como:

float a = read_float("Enter the first number:");
float b = read_float("Enter the second number:");
float c = read_float("Enter the third number:");

Etcetera.

La función enter no transmite correctamente lo que está haciendo. Se debe cambiar el nombre a algo más apropiado, como display_input_values. Puede aceptar los valores ingresados por el usuario como sus argumentos.

Declararlo como:

void display_input_values(float a, float b, float c);

Y úsalo como:

float a = read_float("Enter the first number:");
float b = read_float("Enter the second number:");
float c = read_float("Enter the third number:");
display_input_values(a, b, c);

La función scan tampoco transmite claramente su significado. Puede dividir scan en dos funciones: una que le devuelva la opción de continuar con las siguientes entradas o llamar a una función que calcule algo con la entrada del usuario.

Puede obtener la opción del usuario utilizando una función llamada read_int función como:

int option = read_int("Enter 1 for next round of inputs and 2 to compute with current input:");

Y use ese valor devuelto como:

if ( option == 2 )
{
   // Do the computations
}

También necesita otra opción para salir del programa. La llamada para obtener la opción debe ser:

char const* prompt = "Enter 1 for next round of inputs.\n"
                     "Enter 2 to compute with current input.\n"
                     "Enter 3 to exit program.\n";
int option = read_int(prompt);

Siempre agregue código para verificar si scanf tuvo éxito antes de proceder a utilizar los datos que esperaba leer.


Aquí hay una versión actualizada de su código.

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

float read_float(char const* prompt);
int read_int(char const* prompt);
void display_input_values(float a, float b, float c);
void math(float a, float b, float c);

int main() 
{
   while ( 1 )
   {
      float a = read_float("Enter first number: ");
      float b = read_float("Enter second number: ");
      float c = read_float("Enter third number: ");

      display_input_values(a, b, c);


      char const* prompt = "Enter 1 for next round of inputs.\n"
                           "Enter 2 to compute with current input.\n"
                           "Enter 3 to exit program.\n";
      int option = read_int(prompt);
      if ( option == 3 )
      {
         break;
      }

      else if ( option == 2 )
      {
         math(a, b, c);
      }
   }
}


float read_float(char const* prompt)
{
   float num;
   printf("%s", prompt);

   // For flushing the output of printf before scanf.
   fflush(stdout);

   if (scanf("%f", &num ) != 1)
   {
      print("Unable to read number. Exiting.\n");
      exit(1);
   }
   return num;
}

int read_int(char const* prompt)
{
   int num;
   printf("%s", prompt);

   // For flushing the output of printf before scanf.
   fflush(stdout);

   if (scanf("%d", &num ) != 1)
   {
      print("Unable to read number. Exiting.\n");
      exit(1);
   }
   return num;
}

void display_input_values(float a, float b, float c)
{
  printf("You have entered a: %f, b: %f, c:%f\n", a, b, c);
}

void math(float a, float b, float c)
{
   // Do whatever makes sense to you.
}
3
R Sahu 27 feb. 2018 a las 21:51

Las variables locales (como su nombre lo indica) son locales y no pueden mantener sus valores una vez que finaliza la función. Tienes dos opciones:

  1. Hacer que las funciones primero, segundo y tercero devuelvan sus números y otras funciones los obtienen como argumentos.
  2. Hacer a, b, c variables globales.

El segundo es mucho más fácil, pero se llama mal estilo de programación.

-1
bebidek 27 feb. 2018 a las 21:02

Por ejemplo, declara float a,b,c; en tu Main y cambia tus funciones para devolver un flotante float first() { ... } Luego escribe a = first();

0
AxW 27 feb. 2018 a las 21:04