[ Foro de C ]

Varios ejercicios resueltos del Capítulo 7: Introducción a las Funciones.

22-Aug-2012 21:58
Pablo Rampa
3 Respuestas

  Me encuentro varado en el Capítulo 6. Pero para despejarme un poco he decicido seguir con
el Capítulo 7. De paso, me parecen más manejables estos ejercicios. Quizás podría ir antes
que Manejo de Ficherose este capítulo.
  He aquí algunos ejercicios resueltos de Funciones. Me salto algunos que no he podido resolver
y en el caso del primero(borrar pantalla), ni idea. ¡Ya vendrá la luz!?

/* 7.4b_Crear una función que calcule el cubo de un número real (float). El resultado deberá
        ser otro número real. Probar esta función para calcular el cubo de 3.2 y el de 5. */

#include <stdio.h>

float cubica(float numero)
{
  float cubica;
  cubica = numero * numero * numero;
  return cubica;
}                            

int main()
{
  float numero;
  float cubo;
  int i=0;
 
  while(numero >= -1000000)
  {
     if(i==0)
        puts("\nEscriba un numero real");
     else
        puts("\nEscriba otro numero real");
     scanf("%f", &numero);
     printf("%f elevado al cubo es %f\n",
        numero,cubo=cubica(numero));
     i ++;
  }
  return 0;
}
 /* 7.4c_Crear una función que calcule cual es el menor de dos números enteros.
         El resultado será otro número entero. */

  #include <stdio.h>

 int minus(int num1, int num2)
  {
     int min;
     
     min = num1 < num2? num1: num2;
     return min;
  }
   
  int main()
  {
      int numero1, numero2, menor;
      while (numero1, numero2)
      {
      printf(" Escriba un numero\n");
      scanf("%d",&numero1);
      printf(" Escriba otro numero\n");
      scanf("%d",&numero2);
      menor=minus(numero1, numero2);
      printf("   El menor es %d\n\n", menor);
     
      }
      return 0;
}
/* 7.4d_Crear una función llamada “signo”, que reciba un número real, y devuelva un número entero con el
     valor: -1 si el número es negativo, 1 si es positivo o 0 si es cero. */

#include <stdio.h>

 int signo (float num)
{
   int sig;
   
   if (num > 0)
      sig = 1;
   if (num == 0)
      sig = 0;    
   if (num < 0)
      sig = -1;
     
   return sig;
   
}  

int main()
{
   float numero;
   while (numero > -1000000)
   {
      printf("\nEscriba un numero real: ");
      scanf("%f", &numero);
      printf("%d", signo(numero));
   }
   return 0;
   
}


   

/* 7.4e_Crear una función que devuelva la primera letra de una cadena de texto. Probar esta función para
     calcular la primera letra de la frase “Hola” */

#include <stdio.h>
#include <string.h>

char primeraLetra (char* cadena)
{
   return cadena[0];
}

int main()
{
   char palabra[10];
   
   printf("Escriba una palabra\n");
   scanf("%s", palabra);
   printf("La primera letra es %c.", primeraLetra(palabra));
   
   return 0;
}

/* 7.4e_Crear una función que devuelva la primera letra de una cadena de texto. Probar esta función para
     calcular la primera letra de la frase “Hola” */

#include <stdio.h>
#include <string.h>

char ultimaLetra (char* cadena)
{  
   return cadena[strlen(cadena)-1];
}

int main()
{
   char palabra[10];
   int i;
   
   printf("Escriba una palabra\n");
   scanf("%s", &palabra);
   printf("La ultima letra es: %c", ultimaLetra(palabra));
   
   return 0;
}


/*7.5b_Crear una función que reciba un número y muestre en pantalla el perímetro y la superficie de un
   cuadrado que tenga como lado el número que se ha indicado como parámetro. */
   
#include <stdio.h>

float perimetro (float numero)
{
   float perimetro;
   perimetro = 4 * numero;  
   return perimetro;
}

float area (float numero)
{  
   float area;
   area = numero * numero;
   return area;  
}
 
int main()
{
   int num;
   
   printf("Escriba un numero: ");
   scanf("%d", &num);
   printf("Perimetro:%f\n", perimetro(num));
   printf("Area:%f\n", area(num));
   
   return 0;
}

 /* 7.6b_Crear una función “escribirTablaMultiplicar”, que reciba como parámetro un número entero, y escriba
   la tabla de multiplicar de ese número (por ejemplo, para el 3 deberá llegar desde 3x0=0 hasta 3x10=30). */
   
#include <stdio.h>
   
void escribirTablaMultiplicar (int numero)
{
   int tabla;
       
   for (tabla=1; tabla<=10; tabla++)
      printf("%d x %d = %d\n", numero, tabla, numero * tabla);
       
   return;
}

int main()
{
   int num, tabla;
     
   printf("Escriba un numero: ");
   scanf("%d", &num);
   escribirTablaMultiplicar(num);
     
   
   return 0;
}
/* 7.6c_Crear una función “esPrimo”, que reciba un número y devuelva el valor 1 si es un número
        primo o 0 en caso contrario.  */
       
#include <stdio.h>

int esPrimo (int n)
{
   int r, res;
       
   if(n != 1)
   {  
      r=1;
      res=1;
      while (res != 0)
      {
         res = n % ++r;
      }
      if (n == r)
         return 1;
      else
         return 0;    
   }
   else
      return 1;
}

int main()
{
   int num;
   while (num){
   
   printf("Escriba un numero: ");
   scanf("%d", &num);
   printf("%d ", esPrimo(num));
   }
   return 0;
}
     
/*7.7e_Crear una función que reciba un número cualquiera y que devuelva como resultado la suma
       de sus dígitos. Por ejemplo, si el número fuera 123 la suma sería 6. */

#include <stdio.h>

int sumaDeSusCifras (int numero)
{
   int suma=0;
   
   if (numero < 10)
      return numero;
   else
   {
      while (numero >= 10)
      {
         suma += numero % 10;
         numero /= 10;
      }
      suma += numero;
      return suma;
   }  
}  

int main()
{
   int num;
   
   printf("Escriba un numero entero positivo: \n");
   scanf("%d", &num);
   printf("La suma de las cifras del numero %d es: %d",
      num, sumaDeSusCifras(num));
   
   return 0;
}  
/* 7.7f_Crear una función que reciba una letra y un número, y escriba un “triángulo” formado por esa
     letra, que tenga como anchura inicial la que se ha indicado. Por ejemplo, si la letra es * y la
     anchura es 4, debería escribir
                                    ****
                                    ***
                                    **
                                    *                                                    */
#include <stdio.h>

void dibujaTriangulo (char letra, int numero)
{
   int i;
   
   while (numero > 0)
   {
      for (i=0; i<numero; i++)
         printf("%c", letra);
      printf("\n");
      numero--;
   }  
   return;      
}

int main()
{
   char letra;
   int numero;
   
   printf("Escriba una letra: ");
   scanf("%c", &letra);
   printf("Escriba un numero: ");
   scanf("%d", &numero);
   dibujaTriangulo(letra, numero);
   
   return 0;
}                                  
/* 7.9.2a_Crear un programa que halle cualquier raíz de un número. El usuario deberá indicar el número
   (por ejemplo, 2) y el índice de la raiz (por ejemplo, 3 para la raíz cúbica). Pista: hallar la raíz
   cúbica de 2 es lo mismo que elevar 2 a 1/3. */
     
#include <stdio.h>
#include <math.h>

float raizUniversal (int numero, float raiz);

int main()
{
   int radicando, indice;;
   
   printf("Escriba el numero al cual le quiere extraer raiz: ");
   scanf("%d", &radicando);
   printf("Escriba la raiz que quiere extraer: ");
   scanf("%d", &indice);
   printf("La raiz es: %f", raizUniversal(radicando, indice));
   
   return 0;
}

float raizUniversal(int numero, float ind)
{
   float raiz;
   
   raiz = pow(numero, 1/ind);
   return raiz;
}
   
 /* 7.9.2b_Crear un programa que resuelva ecuaciones de segundo grado, del tipo ax2 + bx + c = 0 El usuario
     deberá introducir los valores de a, b y c. Pista: la solución se calcula con
     x = ? raíz (b2 – 4·a·c) / 2·a */

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

float ecuacion2oGrado1 (float, float, float);
float ecuacion2oGrado2 (float, float, float);

int main()
{
   float a, b, c;
   do
   {
      printf("Escriba las constantes a, b y c\n");
      scanf("%f %f %f", &a, &b, &c);
   }
   while (((a==0) || (b==0) || (c==0)) || (((b*b)-(4*a*c)) < 0));
     
   printf("La raices son: %f %f", ecuacion2oGrado1(a, b, c), ecuacion2oGrado2(a, b, c));
       
   
   return 0;
}

float ecuacion2oGrado1 (float a, float b, float c)
{
   float x1;
   
   x1 = (-b + pow(b*b-4*a*c, 0.5)) / (2*a);
   
   return x1;
}
   
float ecuacion2oGrado2 (float a, float b, float c)
{
   float x2;
   
   x2 = (-b - pow(b*b-4*a*c, 0.5)) / (2*a);
 
   return x2;
}
 En este tengo problema con algunas potencias de 5.

/* 7.10a_Crear una función que calcule el valor de elevar un número entero a otro número entero
        (por ejemplo, 5 elevado a 3 = 53 = 5 ·5 · 5 = 125). Esta función se debe crear de forma
        recursiva. */
     
#include <stdio.h>
#include <math.h>

int exponenciacion (int numero, int numero);

int main()
{
   int base, exponente;
   while (exponente >= 0)
   {
      printf("Escriba el numero que quiere potenciar: ");
      scanf("%i", &base);
      printf("Escriba el numero al que lo quiere elevar: ");
      scanf("%i", &exponente);
      printf("La potencia es: %d\n\n", exponenciacion(base, exponente));
   }
   return 0;
}

int exponenciacion (int a, int n)
{
   if (n == 0)
      return 1;
   else
      return a * pow(a, n-1);
       
   
           
                 /*  ¿Porqué no funciona para muchas de las potencias de 5
                     como: 3, 4, 5, 7, 8, 9, 10, 13 ?   */
}
/* 7.10b_Como alternativa, crear una función que calcule el valor de elevar un número entero a otro número
     entero de forma NO recursiva (lo que llamaremos “de forma iterativa”), usando la orden “for”. */
     
#include <stdio.h>
#include <math.h>

int exponenciacion (int numero, int numero);

int main()
{
   int base, exponente;
   while (exponente >= 0)
   {
      printf("Escriba el numero que quiere potenciar: ");
      scanf("%d", &base);
      printf("Escriba el numero al que lo quiere elevar: ");
      scanf("%d", &exponente);
      printf("La potencia es: %d\n\n", exponenciacion(base, exponente));
   }
   return 0;
}

int exponenciacion (int base, int expo)
{
   int i, pot=1;
   
   for (i=0; i<expo; i++)
      pot *= base;
     
   
   return pot;      
               
 
}
   
     
/* 7.10c_Crear un programa que emplee recursividad para calcular un número de la serie Fibonacci
     (en la que los dos primeros elementos valen 1, y para los restantes, cada elemento es la suma
     de los dos anteriores). */
     
#include <stdio.h>
#include <math.h>

long serieFibonacci (int);

int main()
{
   int termino;
   while (termino >= 0)
   {
      printf("Escriba el termino de la serie que quiere encontrar: ");
      scanf("%d", &termino);
     
      printf("El termino buscado es: %d\n\n", serieFibonacci(termino));
   }
   
   return 0;
}

long serieFibonacci (int n)
{
   
   if ((n == 0) || (n == 1))
      return n;
   else
      return  serieFibonacci(n - 1) + serieFibonacci(n - 2);      
                 
}
   
     
/* 7.10c_Crear un programa que emplee recursividad para calcular un número de la serie Fibonacci
     (en la que los dos primeros elementos valen 1, y para los restantes, cada elemento es la suma
     de los dos anteriores). */
     
#include <stdio.h>
#include <math.h>

long serieFibonacci (int);

int main()
{
   int termino;
   while (termino >= 0)
   {
      printf("Escriba el termino de la serie que quiere encontrar: ");
      scanf("%d", &termino);
     
      printf("El termino buscado es: %d\n\n", serieFibonacci(termino));
   }
   
   return 0;
}

long serieFibonacci (int n)
{
   
   if ((n == 0) || (n == 1))
      return n;
   else
      return  serieFibonacci(n - 1) + serieFibonacci(n - 2);      
                 
}
   
     
/* 7.10e_Crear un programa que emplee recursividad para calcular el mayor de los elementos de un vector. */

#include <stdio.h>

#define TAMANYO_VECTOR 100

int May(int vector[], int n);

main()
{
  int i;
  int Mayor, n=0;
  int vec[TAMANYO_VECTOR];
 
  while (n < 1)
  {
     printf("Ingrese el numero de elementos: ");
     scanf("%d", &n);
  }
 
  for (i=0; i<n; i++)
  {
     printf("\tElemento[%d]: ", i);
     scanf("%d", &vec[i]);
  }
 
  printf("\nMayor: %d\n", May(vec, n));
 
}

int May(int vector[], int n)            /* Primera línea. */
{
  int max, maxResto;

  if (n == 1)                            /* Caso base */
     max = vector[0];
  else {
     maxResto = May(vector+1, n-1);   /* Maximo del resto del vector */
     if (vector[0] > maxResto)
        max = vector[0];
     else
        max = maxResto;
  }  
  return(max);
}
/* 7.10g_Crear, tanto de forma recursiva como de forma iterativa, una función diga si una cadena de
     caracteres es simétrica (un palíndromo). Por ejemplo, "DABALEARROZALAZORRAELABAD" es un
     palíndromo. */
     
#include <stdio.h>

void palindromo (char cadena[80]);

int main()
{
  char letras[80];
  int a=1, i;
 
  while ( a )
  {
     puts("Escriba una palabra o una frase");
     scanf("%c", &letras);
     
     palindromo(letras);
   
  }
  return 0;
}

void palindromo (char cadena[80])
{
   int aux, flag=1, i, j;
   
 
     
   for(i=0; (cadena[i]=getchar()) != '\n'; ++i)        
     aux = i-1;
   j=aux;  
   for(i=0; i<=aux/2; ++i)
   {
      if (cadena[i] != cadena[j])
      {
         flag = 0;                                
         break;
      }                            
      --j;
   }                            
                             
   if (flag == 1)
      printf(" ES un palindromo.\n\n");
   else
      printf(" NO es un palindromo.\n\n");

   return;
}

/* 7.10h_Crear un programa que encuentre el máximo común divisor de dos números usando el algoritmo de
     Euclides : Dados dos números enteros positivos m y n, tal que m > n, para encontrar su máximo
     común divisor, es decir, el mayor entero positivo que divide a ambos: - Dividir m por n para
     obtener el resto r (0 = r < n) ; - Si r = 0, el MCD es n.; - Si no, el máximo común divisor
     es MCD(n,r). */
     
#include <stdio.h>
#include <math.h>

int MCD (int num1, int num2);

int main()
{
   int  a, numero1, numero2;
   
   while( a )
   {
      printf("Escriba dos numeros enteros:\n");
      scanf("%d %d", &numero1, &numero2);
      if ((numero1 == 0) || (numero2 == 0))
      {
         printf("El cero no es factor de ningun numero.\n\n");
         continue;
      }
      printf("MCD(%d , %d) = %d\n\n",
         numero1, numero2, MCD(numero1, numero2));    
   }
   return 0;
}
   
int MCD (int num1, int num2)
{
  int c, D, d, r;
 
  if (num1 > num2)
  {
     D = num1;
     d = num2;
  }
  else
  {
     D = num2;
     d = num1;
  }
  c = D/d;
  r = D % d;
  while (r != 0)
  {
    D = d;
    d = r;
    c = D/d;
    r = D % d;
  }
 
  return d;

}  

    .....Saludos!     V-.


23-Aug-2012 01:14
Nacho Cabanes (+30)

Haces bien en no estancarte y avanzar. En general están bien, pero en un primer vistazo, veo cosas simplificables, sobre todo en cuanto a variables locales no necesarias o a algún "return" sin valor como última orden de la función. (Al final recopilo los pocos problemas "serios"). Por ejemplo:

 int minus(int num1, int num2)
 {
     int min;
     
     min = num1 < num2? num1: num2;
     return min;
 }

podría ser

 int minus(int num1, int num2)
 {
     return num1 < num2? num1: num2;
 }

Y de igual modo:

int signo (float num)
{
   int sig;
   
   if (num > 0)
     sig = 1;
   if (num == 0)
     sig = 0;    
   if (num < 0)
     sig = -1;
     
   return sig;
   
}  

podría ser

int signo (float num)
{
   if (num > 0)
     return 1;
   if (num == 0)
     return 0;    

   return -1;
}  

Mientras que

void escribirTablaMultiplicar (int numero)
{
   int tabla;
       
   for (tabla=1; tabla<=10; tabla++)
     printf("%d x %d = %d\n", numero, tabla, numero * tabla);
       
   return;
}

podría ser

void escribirTablaMultiplicar (int numero)
{
   int tabla;
       
   for (tabla=1; tabla<=10; tabla++)
     printf("%d x %d = %d\n", numero, tabla, numero * tabla);
}

Ahora, los problemas un poco más "serios":

- esPrimo es muy difícil de seguir. Se puede hacer de una forma mucho más sencilla.

- La potencia recursiva... no es recursiva!

- El mayor elemento de un vector hace una cosa muy peligrosa: ¿por qué aumentas en 1 un array? Puede tener efectos colaterales que me temo que no has previsto. Mejor, pasa como parámetro el mismo array sin modificar, pero indícale que empiece a analizar en la siguiente posición.

- Lo ideal sería que "palindromo" devolviera un valor, en vez de escribir algo en pantalla (reconozco que el enunciado no lo deja claro).


23-Aug-2012 21:09
Pablo Rampa

Gracias por su pronta respuesta, estimado Nacho.
Tendré que hacer las modificaciones sugeridas y sobretodo con el
del palíndromo que tengo que volver a codificarlo en la forma recursiva.
Por ahora estoy enfocado en el 1er. ej. del capítulo.
No sé cómo llevar el cursor al inicio de la pantalla.
Pensé en crear un archivo con 25 líneas.
Abrirlo en modo r+ para poderlo leer y luego escribir las 25 líneas vacías, pero no sé si me falló el "fseek(fichero, 0, SEEK_SET);" o que no se puede hacer de esa manera. Además en
archivos es que estoy varado.
Sería más facil con "gotoxy()" pero por no ser una función estandar de ANSI-C no me funciona en mi Dev-C++ 4.9.9.2.
He visto que existen formas de emular a "conio.h", pero además
de que me parece muy artificial, la verdad no estaría a mi alcance meterme en esos líos.
Agradecería mucho una idea para salir de este "in pase".

  Gracias nuevamente y saludos Estimado Nacho.


24-Aug-2012 17:39
Nacho Cabanes (+30)

Respondido en el otro hilo. Aun así, ya sabes: el primer ejercicio (que ahora será el sexto, y ya no estará duplicado), se hace de la forma más simple y más fea posible.

clrscr y gotoxy, al ser específicos de una plataforma, y además de una plataforma en desuso, se ven en el apartado 10.3.

No pretendas a estas alturas que las cosas sean "bonitas en pantalla" ;-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)