[ Foro de C ]

Soluciones de ejercicios propuestos

09-Jan-2010 11:48
emuletas yp
31 Respuestas

Aquí iré poniendo los ejercicios que solucione y que todavía no estén escritos en la página de nacho cabanes, así podrá copiar y pegar, que es mas rápido (comprobaré que todos funcionen perfectamente):

/*-------------------------*/
/*  Solucion al ejercicio  */
/*    propuesto 3.1.1a     */
/*  s020501.c              */
/*                         */
/*    Crear un programa    */
/* que pida al usuario     */
/* un número entero   */
/* y diga si es par        */
/*                         */
/*     */
/*  comillas               */
/*                         */
/*  Curso de C,            */
/*    Nacho Cabanes        */
/*-------------------------*/

#include <stdio.h>

main()
{
   int numero;
   printf("Introduce un número\n");
   scanf("%d", &numero);
   if (numero%2==0) printf("El número es par\n");
   else printf("El número no es par\n");
}


09-Jan-2010 11:59
emuletas yp

Otro:

/*-------------------------*/
/*  Solucion al ejercicio  */
/*    propuesto 3.1.1b     */
/*                     */
/*                         */
/*    Crear un programa   */
/*    que pida al usuario  */
/*    dos números enteros  */
/*    y diga cual es   */
/*    el mayor de ellos.   */
/*   */
/*                         */
/*     */
/*                     */
/*                         */
/*  Curso de C,            */
/*    Nacho Cabanes        */
/*-------------------------*/

#include <stdio.h>

main()
{
   int numero1, numero2;
   printf("Introduce un número\n");
   scanf("%d", &numero1);
   printf("Introduce otro número\n");
   scanf("%d", &numero2);
   if (numero1>numero2) printf("El %d es mayor que el %d\n", numero1, numero2);
   if (numero2>numero1) printf("El %d es mayor que el %d\n", numero2, numero1);
   if (numero1==numero2) printf("Son el mismo número!\n");
}


09-Jan-2010 12:04
emuletas yp

Aquí va otro:

/*-------------------------*/
/*  Solucion al ejercicio  */
/*    propuesto 3.1.1c     */
/*                     */
/*                         */
/*    Crear un programa   */
/*    que pida al usuario  */
/*    dos números enteros  */
/*    y diga si el   */
/*    primero es múlti-    */
/*    plo del segundo.   */
/*                         */
/*     */
/*                     */
/*                         */
/*  Curso de C,            */
/*    Nacho Cabanes        */
/*-------------------------*/

#include <stdio.h>

main()
{
   int numero1, numero2;
   printf("Introduce un número\n");
   scanf("%d", &numero1);
   printf("Introduce otro número\n");
   scanf("%d", &numero2);
   if (numero1%numero2==0) printf("El %d es múltiplo de %d\n", numero1, numero2);
   else printf("El %d no es múltiplo de %d\n", numero1, numero2);
   
}


09-Jan-2010 12:15
emuletas yp

Otro más. Me está cosatando el comentario inicial XD

/*------------------------------------------------*/
/*  Solucion al ejercicio                         */
/*    propuesto 3.1.3a                            */
/*                                            */
/*                                                */
/*    Crear un programa          */
/* que multiplique  */
/* dos números enteros  */
/* de la siguiente forma:  */
/* pedirá al usuario  */
/* un primer número  */
/* entero.  */
/* Si el número que se que teclee es 0,  */
/* escribirá en pantalla:  */
/* “El producto de 0  */
/* por cualquier número es 0” .  */
/* Si se ha tecleado  */
/* un número distinto de cero,  */
/* se pedirá al usuario un segundo número  */
/* y se mostrará el producto de ambos.  */
/*                          */
/*                            */
/*                                            */
/*                                                */
/*  Curso de C,                                   */
/*    Nacho Cabanes                               */
/*------------------------------------------------*/

#include <stdio.h>

main()
{
   int numero1, numero2;
   printf("Introduce un número\n");
   scanf("%d", &numero1);
   if(numero1==0) printf("Cualquier número multiplicado por 0 es 0\n");
   else
   {
   printf("Introduce otro número\n");
   scanf("%d", &numero2);
   printf("El resultado de multiplicar %d por %d es: %d\n", numero1, numero2, numero1*numero2);
   }
   
}


09-Jan-2010 12:24
emuletas yp

/*---------------------------------*/
/*  Solucion al ejercicio          */
/*    propuesto 3.1.3b             */
/*                             */
/*                                 */
/*    Crear un programa           */
/* que pida dos números   */
/* reales sólo si el segundo  */  
/* no es cero.                */        
/*   */
/*           */
/*                                 */
/*                   */
/*                             */
/*                                 */
/*  Curso de C,                    */
/*    Nacho Cabanes                */
/*---------------------------------*/

#include <stdio.h>

main()
{
   int numero1, numero2;
   printf("Introduce un número\n");
   scanf("%d", &numero1);
   printf("Introduce otro número\n");
   scanf("%d", &numero2);
   if(numero2==0) printf("ERROR! No se puede dividir entre 0\n");
   else printf("El resultado de dividir %d entre %d es: %d\n", numero1, numero2, numero1/numero2);
 
   
}


09-Jan-2010 13:38
emuletas yp

/*---------------------------------*/
/*  Solucion al ejercicio          */
/*    propuesto 3.1.4a             */
/*                             */
/*                                 */
/*    Crear un programa que        */
/* multiplique                */
/*      dos números enteros        */
/* de la siguiente forma...  */                                    
/*                                 */
/*  Curso de C,                    */
/*    Nacho Cabanes                */
/*---------------------------------*/

#include <stdio.h>

main()
{
   int numero1, numero2;
   printf("Introduce un número\n");
   scanf("%d", &numero1);
   if(numero1==0) printf("El resultado de multiplicar un número por 0 es 0\n");
   else{
   printf("Introduce otro número\n");
   scanf("%d", &numero2);
   printf("El resultado de multiplicar %d por %d es: %d\n", numero1, numero2, numero1*numero2);
   }
   
}



09-Jan-2010 13:44
emuletas yp

Vaya una tontería he hecho!! No me di cuenta de en el enunciado, hacerlo con else o sin else!!! Bueno, yo los voy a dejar así,
no puedo modificarlos! Aún así el procedimiento para hacer los programas es similar.


09-Jan-2010 13:56
emuletas yp

/*---------------------------------*/
/*  Solucion al ejercicio          */
/*    propuesto 3.1.5a             */
/*                             */
/*                                 */
/*    Crear un programa que pida   */
/*    una letra al usuario y diga  */
/*    si se trata de una vocal   */                                    
/*                                 */
/*  Curso de C,                    */
/*    Nacho Cabanes                */
/*---------------------------------*/

#include <stdio.h>

main()
{
   char letra;
   printf("Introduce una letra\n");
   letra=getchar();
   if(letra=='a'||letra=='e'||letra=='i'||letra=='o'||letra=='u') printf("La letra %c es una vocal\n", letra);
   else printf("La letra %c no es una vocal\n", letra);
}


09-Jan-2010 14:10
emuletas yp

/*---------------------------------*/
/*  Solucion al ejercicio          */
/*    propuesto 3.1.5b             */
/*    Crear un programa            */
/*     que pida al usuario         */
/*   dos números enteros y diga    */
/* “Uno de los números es positivo”*/
/* “Los dos números son positivos” */
/*  o bien “Ninguno de los números */
/*  es positivo”...                */
/*  Curso de C,                    */
/*    Nacho Cabanes                */
/*---------------------------------*/

#include

main()
{
   int num1, num2;
   printf("Introduce un número\n");
   scanf("%d", &num1);
   printf("Introduce otro número\n");
   scanf("%d", &num2);
   if(num1&gt;0 && num2&gt;0) printf("Los dos números son positivos\n");
   else if(num1&gt;0 || num2&gt;0) printf("Uno de los dos números es positivo\n");
   if(num1<0 && num2<0) printf("Ninguno de los dos números es positivo\n");
}


09-Jan-2010 14:24
emuletas yp

Ahora simplemente cogeré todos los que he escrito mas los que quedan, los ordeno y los comprimo en un GNU zip, lo subo a megaupload y pongo aquí el link.


09-Jan-2010 17:52
emuletas yp

De momento todo va bien, estoy corrigiendo todos los errores que he encontrado en lo que aquí he posteado, así que los masrco como no fiables, porque he puesto algunas burradas, sobre todo en los comentarios. Estimo que me llevará poco acabar los codigos fuente para poder subirlos. por lo menos hasta 6.0


11-Jan-2010 11:53
Manuel Carvajal

Te me adelantaste!! Jeje.. No deberias subir toodaas las soluciones! El administrador menciono q solo iba a colocar entre 50-70, es decir, mas o menos la mitad..! Para que los alumnos no se saltaran los ejercicios difíciles!


12-Jan-2010 01:08
Nacho Cabanes (+83)

En primer lugar, para Manuel: yo incluiré en el curso algo menos de la mitad de los ejercicios resueltos, pero vosotros podeis publicar aquí todos los que querais, y así pedir opinión a los demás usuarios, aunque sea sobre algún fuente que luego yo no publique.

Para Emuletas: buen trabajo. Aun así, ten en cuenta que los ejercicios deberían ser un poco más progresivos. Me explico: en el 3.1.1a y 3.1.1c usas "else", pero se supone que el "else" no se aprende hasta que llegas al apartado 3.1.4, así que deberías buscar una solución que no utilice "else", sólo un "if" básico.


12-Jan-2010 14:52
emuletas yp

"ten en cuenta que los ejercicios deberían ser un poco más progresivos"

Los ejercicios qu he posteado o sirven, lo dije. Porfavor, bórralos si puedes. Los que sí valen son los que tengo yo en mi ordenador que pronto los subiré, seguramente comprimidos.

No se me ocurre en que compresión subirlos, aunque la mejor idea que se me ocurre es hacerlo en .tar.gz (http://www.gzip.org/) y subirlos a megaupload.

Otra cosa que no tiene mucho que ver:

Aquí se prefiere la producción de software libre (gnu.org) o de software privativo (microsof*)??


12-Jan-2010 20:59
mario moreno

Aquí se prefiere la producción de software libre (gnu.org) o de software privativo (microsof*)??


Yo diré lo que ya dijo Mel Gibson en BraveHeart... LIBERTAAAAAAAAAAAAAAAD!!!!


13-Jan-2010 17:34
Manuel Carvajal

Aaah.. bueno yo tambien pondre algunos..!

Ejercicio de página 46, objetivo 3.1.5: Crear un programa que pida una letra al usuario y diga si se trata de una vocal.

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

main() {
char x;
printf("Teclea una letra: ");
scanf("%c", &x), getchar();
if ((x=='a')|(x=='e')|(x=='i')|(x=='o')|(x=='u')) printf("Es una vocal.");
else (printf("Es una consonante."));
getchar();
}
Ejercicio de página 54, objetivo 3.1.10: Crear un programa que lea una letra tecleada por el usuario y diga si se trata de una vocal, una cifra numérica o una consonante.

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

main() {
char tecla;
printf("Pulse una tecla y luego Intro: ");
scanf("%c", &tecla), getchar();
switch (tecla)
{
case ' ': printf("Has tecleado espacio.\n");
break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0': printf("Es un digito.\n");
break;
case 'a':
case 'e':
case 'i':
case 'o':
case 'u': printf("Es una vocal.\n");
break;
default: printf("Es una consonante.\n");
}
getchar();
}



Ejercicio de página 55, objetivo 3.2.1: Crea un programa que escriba en pantalla los numeros del 1 al 10, usando “while”.

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

main() {
int x, y, z;
y = 1;
while (x!=10)
{
x = y++;
printf("%d\n", x);
}
getchar();
}

Ejercicio de página 56, objetivo 3.2.2: Crear un programa que pida números positivos al usuario, y vaya calculando la suma de todos ellos (terminara cuando se teclea un número negativo o cero).

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

main() {
int x, y, z, a;
printf("Introduzca un numero positivo: ");
scanf("%d", &x), getchar();
printf("Escribe otro numero positivo: ");
scanf("%d", &y), getchar();
z = x+y;
if ((x<0) | (y<0)) printf("Numero invalido");
else
{
printf("Su suma es %d\n", z);
do
{
printf("Escribe otro numero positivo: ");
scanf("%d", &a), getchar();
z = z+a;
if (a>0) printf("Su suma es %d\n", z);
else
printf("No valido!\n");
}
while (a>0);
printf("Adios.\n");
}
getchar();
}


14-Jan-2010 19:34
mario moreno

Supongo que al final Nacho hará un recopilatorio que incluirá en el pdf final, porque si no va a ser un poco follón ¿no?


16-Jan-2010 23:34
Nacho Cabanes (+83)

Respondiendo un poco a todo:

- A emuletas y Mario: "Aquí se prefiere la producción de software libre (gnu.org) o de software privativo (microsof*)??"

Cada cual tendrá sus preferencias. Yo, en particular, prefiero software libre cuando me es posible. Por ejemplo, creo mis programas en C usando CobeBlocks, apoyado en el compilador de C de GNU portado a Windows (MinGW) y como librerías gráficas para los juegos uso SDL o Allegro, en vez de DirectX. En C# uso Mono y Tao.Sdl. Ahora mismo te escribo desde Firefox... pero en este momento no estoy usando GNU/Linux (que también tengo y uso) sino Windows, que en esta versión es razonablemente estable... y para algo me lo han cobrado al comprar el ordenador. ;-)

- A Manuel:

Sobran los "getchar" al final de cada fuente. Eso sólo es necesario si creas programas de línea de comandos desde un entorno que no es de línea de comandos y que además no es capaz de hacer una pausa al terminar de ejecutar los programas. Es "una ayuda para ti" mientras desarrollas con un entorno poco versátil, pero debería desaparecer de un programa terminado.

En el ejercicio 3.1.5, no puedes dar por sentado que todo lo que no sean vocales van a ser consonantes.

En el 3.2.1 basta con una única variable.

En el ejercicio 3.2.2, yo incluiría todo en un único "do..while", en de dejar repetida la misma estructura antes del "do..while" sólo para que aparezca escrito "un número" en vez de "otro número". Se puede hacer el programa en la tercera parte de espacio y con sólo dos variables. Pero no es importante: el fuente es más legible si es más compacto (como propongo yo) pero también es más amigable para el usuario si el mensaje es más claro (como en tu ejemplo). Lo que sí es claramente mejorable es el nombre de las variables: la suma debería llamarse "suma" o "total", pero no "z".

- A Mario:

Sí, escogeré varios fuentes para incuirlos en el PDF y en la versión web. No todos, como ya comenté, sino uno de cada dos o de cada tres, para que no todo esté hecho y quien quiera practicar no se acomode.


19-Jan-2010 17:08
Manuel Carvajal

Gracias por los consejos/correcciones! Aun tengo mucho que aprender..!


20-Jan-2010 17:09
Manuel Carvajal

Emuletas, podrias mostrarme la solucion del ejercicio 3.2.1?? "Crear un programa que calcule cuantas cifras tiene un numero entero positivo (pista: se puede hacer dividiendo varias veces entre 10)". Please! Mi pequeño cerebro no dio con una solución.. Estuve horas pensando y solo encontré un resultado que considero erróneo.. Porque a pesar de lograr el objetivo no es como creo que debería ser..!

Gracias de antemano!


20-Jan-2010 19:13
emuletas yp

#include <stdio.h>

/* Ejemplo dedicado al Pequeño cerebro de Manuel Carvajal ;)*/

/*INICIO DEL PROGRAMA. Lo hare un poco exagerado*/


main()

{

/* Introducimos las variables, en este caso, es una*/

float numero;

int vint=1;

/*Pedimos los datos*/

printf("Introduce el numero que quieres comprobar\n");

/*Guardamos los datos*/

scanf("%f", &numero);

/*Bien, ya tenemos el numero, ahora miramos las cifras.
En este ejercicio te piden que lo hagas dividiendo entre diez*/

/*Usamos for y la variable vint, que debe empezar por uno, cosa que
sera utilizada despues para mostrar el numero de cifras.
El for piensatelo :D*/

for(vint=1; vint>=vint; vint++){

if(numero<10) break;
else numero=numero/10;
}

printf("El numero tiene %d cifras\n", vint);

/*Finalmente, añadimos esto, :D*/

do{
printf("Please! Mi pequeño cerebro no dio con una solución :D \n");
}while(vint=vint);

/*Saludos!*/



}


20-Jan-2010 19:21
emuletas yp

Oh no, en lo de las variables, son dos, XDDDDD

Mi cerebro está encogiéndose XD


21-Jan-2010 12:34
Manuel Carvajal

Pero hay que resolverlo usando while, ni do while ni for..! Porque el ejercicio esta puesto antes de explicar esos objetivos..!


21-Jan-2010 13:33
emuletas yp

EL do while era una broma!

El for pásalo a while. Es mucho más sencillo todavía. Pero has de aprender a hacerlo por tu cuenta, por lo menos inténtalo! :D


21-Jan-2010 16:34
Manuel Carvajal

Jajaja no me habia percatado de tu broma ¬¬! Bueno ya esta, gracias a ti ya lo pude hacer, aqui esta mi resultado:

#include <stdio.h>

main()
{
float numero;
int vint=1;
printf("Introduce el numero que quieres comprobar\n");
scanf("%f", &numero);
while(numero>=10)
{
numero=numero/10;
vint++;
}
printf("El numero tiene %d cifras\n", vint);
}


22-Jan-2010 00:33
Nacho Cabanes (+83)

Esa forma es la buena, Manuel. Sólo un par de mejoras:

- El número debe ser entero.

- En vez de "vint" sería mejor llamar "cifras" a la variables, para que el programa sea más legible.

- La operación "numero=numero/10;" también se puede escribir abreviada como "numero /= 10;"  Esta alternativa es más "al estilo C", y además permite al compilador crear un código máquina más eficiente, al hacer evidente que sólo se trabaja con una variable, que no es necesario operar sobre un dato para guardarlo en otra variable distinta.

Por eso, yo lo habría hecho así:

#include <stdio.h>

main()
{
 int numero;
 int cifras = 1;

 printf("Introduce un numero: ");
 scanf("%d", &numero);
 while(numero>=10)
 {
   numero /= 10;
   cifras ++;
 }
 printf("El numero tiene %d cifras\n", cifras);
}


22-Jan-2010 12:12
Nacho Cabanes (+83)

He publicado en la web, en el apartado de soluciones, una solución a cada uno de los ejercicios de los apartados del 3.1.1 al 3.1.9 (he dado por sentado que, si se entienden esas, las que faltan son fáciles). Están en:

http://www.nachocabanes.com/c/curso/c_soluciones.php#030101a

Para Manuel: revisa alguna de tus soluciones. Por ejemplo, la de ver si es una vocal debería usar "||" en vez de "|" (error de sintaxis), y la de ver si se puede dividir debería usar números reales en vez de enteros (requisito del problema).

Querría terminar de publicar soluciones del tema 3 durante hoy o el resto del fin de semana.


22-Jan-2010 14:50
Manuel Carvajal

Hay alguna diferencia entre "|" y "||"? O es que algunos compiladores no lo leen igual?


05-Feb-2010 17:14
Nacho Cabanes (+83)

Perdona, Manuel, se me había pasado este mensaje sin contestar.

Sí que hay diferencia entre | y ||. Son totalmente distintos: | es una suma de bits (lo que se conoce como una operación "OR lógica"), mientras que || quiere decir "o", para enlazar dos condiciones.

Por ejemplo,

if ((x != 2) | (z != 3)) ...

para comprobar una condición es incorrecto, debería ser

if ((x != 2) || (z != 3)) ...

mientras que el operador | se usa para fijar ciertos bits de un número a 1. Por ejemplo, podrías hacer que el último bit (el "menos significativo") de un número fuese uno con:

dato = dato | 1;

Como puedes ver, | tiene un uso mucho más avanzado, porque supone saber qué utilidad tiene eso de manipular bits de forma individual, y eso no es algo evidente, sino que se aplica sólo a casos muy concretos, mientras que un "o" (||) aparece en muchísimas comprobaciones de condiciones.

Lo mismo ocurre con el operador && ("y", en condiciones) y el operador "&" (producto bit a bit).



07-Feb-2010 02:50
Manuel Carvajal

Esta bien, no hay problema..! Pillo el punto que me explicaste..! Gracias..! Hay alguna forma de "printf" una tabla (array)?  algo como: printf("%d", numero); en donde "numero" seria un array con varios datos, entiendo que eso que acabo de colocar esta malo, solo lo uso para explicarme mejor..!


08-Feb-2010 18:57
Manuel Carvajal

Bueno.. Estoy sufriendo con los arrays.. Cm podria calcular cual es el mayor de los datos en un array..? Estoy haciendo los ejercicios de 5.1.1 pero solamente he hecho los a y b, y estoy seguro que debe haber una forma mas resumida de hacerlo sin tener que escribir uno por uno..!


08-Feb-2010 19:52
Manuel Carvajal

Olviden mis últimos comentarios.. Había olvidado el uso de "for".. Lamento las molestias..!






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