[ Foro de C ]

Otros ejercicios resueltos del Capítulo 7: Funciones.

26-Aug-2012 06:37
Pablo Rampa
2 Respuestas

Aquí están algunos de los ejercicios pendientes:

/* 7.4a_Crear una función que borre la pantalla dibujando 25 líneas en blanco.
       No debe devolver ningún valor.  */
     
#include <stdio.h>

void borrarPantalla()
{
 int i;
 
 for (i=0; i<25; i++)
    printf("\n");
   
 return;
}

int main()
{
  printf("Este programa borra la pantalla.");
  borrarPantalla();
  printf("Se ha borrado la pantalla con exito!");
 
  return 0;
}
/* 7.6a_Crear una función “pedirEntero”, que reciba como parámetros el texto que se debe mostrar
  en pantalla,el valor mínimo aceptable y el valor máximo aceptable. Deberá pedir al usuario que
  introduzca el valor tantas veces como sea necesario, volvérselo a pedir en caso de error, y
  devolver un valor correcto. Probarlo con un programa que pida al usuario un año entre 1800 y
  2100.  */
     
#include <stdio.h>

void pedirEntero (char texto[40], char texto1[50], int valMin, int valMax, int entero)
{
   int ent;
   
   do
   {
   printf("%s", texto);
   scanf("%d", &ent);
   }
   while (ent != 2012);
   printf ("%s", texto1);
   
   return;
}
 
int main()
{
   char texto[40]=("Escriba un numero: ");
   char texto1[50]=("Eureka! Habeis acertado.");
   int entero=2012, valMin=1800, valMax=2100;
   
   pedirEntero(texto, texto1, valMin, valMax, entero);
   
   return 0;  
}
     
 /* 7.7d_Crear una función que reciba una cadena y una letra, y devuelva la cantidad de veces que
     dicha letra aparece en la cadena. Por ejemplo, si la cadena es "Barcelona" y la letra es 'a',
     debería devolver 2 (aparece 2 veces). */
     
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int numVecesApareceLetra (char cadena[20], char letra)
{
   int i, num=0;
   
   for (i=0; i<strlen(cadena); i++)
   {
      if (cadena[i]==(letra) || cadena[i]==toupper(letra))
         num++;  
   }
     
   return num;
}    
 
int main()
{
   char caden[20];
   char letr;
   int i;
   
   printf("Escriba una palabra: ");
   scanf("%s", caden);
   getchar();
   printf("Escriba una letra: ");
   scanf("%c", &letr);
   printf("La letra %c se encuentra %d veces en %s",
      letr, numVecesApareceLetra(caden, letr), caden);
   getchar();
   getchar();
   return 0;
}
 /*7.9.1_Crear un programa que genere un número al azar entre 1 y 100. El usuario tendrá
        6 oportunidades para acertarlo. */



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

int generaNumeroAzar();

int main()
{
   int i=0, num, numero;
   
   printf("Adivina un numero entre 1 y 100: ");
   scanf("%d", &num);
   i++;
   
   numero = generaNumeroAzar();          
   //printf("%d ", numero);           /* Sólo para comprobación. */
   
   do
   {
      if (num == numero)
      {  
         printf("¡Enhorabuena!.....Habeis acertado.");
         break;
      }
      else
      {
         if (i < 6)
         {
            printf("Sigue intentandolo.");
            scanf("%d", &num);
            i++;
         }
         else
         {
            printf("Lo siento. El juego ha terminado.");
            break;
         }
      }
   }
   while (i <= 6);  
     
   getchar();
   getchar();
   
   return 0;
}

int generaNumeroAzar()
{
   srand(time(NULL));
   return (1 + (rand() % 100));  
}


   .....Saludos cordiales!
                                             :-)


27-Aug-2012 18:56
Pablo Rampa

  ...Y estos son los ejerccios pendientes del Capítulo 7:
Introducción a las Funciones.

/* 7.10d_Crear un programa que emplee recursividad para calcular la suma de los elementos
         de un vector. */

#include <stdio.h>

int sumaVector(int elemento[], int numElemento);

int main()
{
   
   int i, numElem;
   int elem[numElem-1];  

   printf("Cuantos elementos tiene el vector? ");
   scanf("%d", &numElem);
   getchar();
   printf("Introduzca los %d elementos:\n", numElem);
   for (i=0; i<numElem; i++)  
   {
     printf("\tElemento[%d]: ", i);
     scanf("%d", &elem[i]);
   }
   printf("La suma de los elementos del vector es: %d",
      sumaVector(elem, numElem));
   
   
   return 0;
}

int sumaVector(int elemento[], int numElemento)
{
   int suma = 0;

   if(numElemento-1 == 0)  
       suma += elemento[0];
   else
       suma = elemento[numElemento-1] + sumaVector(elemento, numElemento-1);  
   
   return suma;
}


/* 7.10e_Crear un programa que emplee recursividad para calcular el mayor de los elementos
          de un vector. */

#include <stdio.h>

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

main()
{
  int i;
  int Mayor, n=0;
  int vec[n];
 
  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 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.10f_Crear un programa que emplee recursividad para dar la vuelta a una cadena de caracteres
         (por ejemplo, a partir de "Hola" devolvería "aloH"). */
     
#include <stdio.h>
#include <string.h>

void invierte (const char *c);

 int main()
 {
      char palabra[20];  
     
      printf(" Escriba una palabra:  ");
      scanf("%s", palabra);
      getchar();
      printf("La forma invertida es: ");
      invierte(palabra);

      return 0;          
}
 
void invierte (const char* c)
{
   if (*c != '\0')
   {
      invierte (c + 1);
      putchar (*c);
   }
   else
      return;  
}

/* 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. */
   
/* Esta es la forma recursiva. */
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int palindromo(const char *cadena, int longitud);

int main()
{

  char frase[80];
  int a=1, p;
 
  do
  {
     puts("Escriba una palabra o una frase");
     gets(frase);
     
    p = palindromo(frase, strlen(frase));
    if (p == 1)
       printf("ES un palindromo.\n\n");
    else
       printf("NO es un palindromo.\n\n");
   
  }
  while (strcmp(frase, "fin") != 0);
 
  return 0;
}

int palindromo(const char  *cadena, int longitud)
{
  if (longitud < 2)
     return 1;
  if (cadena[0] != cadena[longitud-1])
     return 0;

  return palindromo(cadena+1, longitud-2);
}


                                  .....Saludos a todos!





28-Aug-2012 16:50
Nacho Cabanes (+83)

Veamos... las recursivas están bien, aunque para mi gusto son "demasiado C": haces cosas como "cadena+1" para pasar a la siguiente posición de la cadena, y es algo que no tendrá equivalencia directa en casi ningún otro lenguaje, así que a mí me parece más elegante hacer cosas como

invertir(cadena, posicionDesde, posicionHasta)

en vez de modificar la cadena original incrementando punteros.

Pero insisto, va en gustos, y tus soluciones son perfectamente válidas.


La que me gusta menos es la de "pedirEntero": has hecho

void pedirEntero (char texto[40], char texto1[50], int valMin, int valMax, int entero)

y el enunciado decía "que reciba como parámetros el texto que se debe mostrar en pantalla,el valor mínimo aceptable y el valor máximo aceptable. Deberá pedir al usuario que introduzca el valor tantas veces como sea necesario, volvérselo a pedir en caso de error, y devolver un valor correcto."

Tu implementación no devuelve nada y tiene dos parámetros distintos de los que se pedían. Es más razonable:

int pedirEntero (char textoAviso[80], int valorMinimo, int valorMaximo)

(recuerda que un programa se escribe una sóla vez, pero se lee muchas más, especialmente si hay que corregir o ampliar, así que procura que sea legible, especialmente en cuanto a nombres de variables, a que lógica sea simple y a usar comentarios para cualquier decisión lógica que no sea evidente en un primer vistazo).






(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.)