Autor Tema: C (lenguajeC) printf mostrar mensajes pantalla arrays unidimensionales CU00523F  (Leído 2376 veces)

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Hola, dejo una posible solución al ejercicio CU00523F del tutorial de programación en lenguaje C desde cero.

Citar
EJERCICIO
Crea un programa donde se cumplan estas indicaciones. Declara cuatro variables: una de tipo entero y nombre edad, otra de tipo long y nombre distancia, otra de tipo carácter y nombre letra y otra de tipo array de caracteres y nombre cadenaTexto. Asígnales, respectivamente, los siguientes valores: 21, 488321, k, alameda. Muestra dichos contenidos por pantalla. A continuación asigna respectivamente, los siguientes valores a las variables: 22, 666543, t, arboleda. Muestra dichos contenidos por pantalla.

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
int main() {
    int edad = 21;
    long distancia = 488321;
    char letra = 'k';
    char cadenaTexto [] = "alameda";
    printf("edad = %d\n", edad);
    printf("distancia = %ld\n", distancia);
    printf("letra = %c\n", letra);
    printf("cadenaTexto = %s\n", cadenaTexto);
    edad = 22;
    distancia = 666543;
    letra = 't';
    cadenaTexto [0] = 'a';
    cadenaTexto [1] = 'r';
    cadenaTexto [2] = 'b';
    cadenaTexto [3] = 'o';
    cadenaTexto [4] = 'l';
    cadenaTexto [5] = 'e';
    cadenaTexto [6] = 'd';
    cadenaTexto [7] = 'a';
    cadenaTexto [8] = '\0';
    printf("edad = %d\n", edad);
    printf("distancia = %ld\n", distancia);
    printf("letra = %c\n", letra);
    printf("cadenaTexto = %s\n", cadenaTexto);
}

Después de asignar el nuevo valor a la variable 'letra', no me lo muestra, en realidad no muestra nada.

Con la variable 'cadenaTexto', tuve que asignar los valores uno a uno para que me imprimiese bien el resultado, ademas de poner como ultimo digito '\0' para que lo tomase como el final de la cadena, porque si no ponía nada, imprimía el valor del string seguido de algún carácter y algún símbolo "arboledat»+".

Me imagino que habrá formas mas fáciles de resolver estos problemas, pero hasta donde he llegado en el temario, no explica nada al respecto.

P.D.:Posible errro en el primer párrafo de dicha entrega. El párrafo que aparece es el mismo que aparece en la entrega anterior.

Saludos.  ;D
« Última modificación: 17 de Mayo 2016, 09:23 por Mario R. Rancel »

Mario R. Rancel

  • Administrador
  • Experto
  • ********
  • APR2.COM
  • Mensajes: 1978
    • Ver Perfil
Buenos días Pedro, en primer lugar gracias por comunicar esa errata, efectivamente se trataba de un error que ya está corregido.

C es un lenguaje un poco peculiar y muchas veces no es fácil interpretar lo que ocurre.

Cuando declaras char cadenaTexto [] = "alameda"; se crea cadenaTexto como array de 7 elementos, índices 0 a 6.

Pero arboleda tiene 8 caracteres, 8 elementos. Por tanto no nos cabe en un array de 7 elementos.

Al tratar de asignar más elementos de los disponibles, se puede producir que se ocupe memoria de espacios colindantes y esto generar resultados inesperados como que al tratar de mostrar letra no se muestre nada (la memoria ha sido alterada). En otros lenguajes te saltaría un error, pero C no realiza comprobación de índices de arrays. No es seguro que esta sea la explicación, pero es el tipo de cosas que te puedes encontrar en C.

Una pequeña trampa sería alterar el orden de las instrucciones:

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
int main() {
    int edad = 21;
    long distancia = 488321;
    char letra = 'k';
    char cadenaTexto [] = "alameda";
    printf("edad = %d\n", edad);
    printf("distancia = %ld\n", distancia);
    printf("letra = %c\n", letra);
    printf("cadenaTexto = %s\n", cadenaTexto);
    edad = 22;
    distancia = 666543;
    letra = 't';
    printf("edad = %d\n", edad);
    printf("distancia = %ld\n", distancia);
    printf("letra = %c\n", letra);
    cadenaTexto [0] = 'a';
    cadenaTexto [1] = 'r';
    cadenaTexto [2] = 'b';
    cadenaTexto [3] = 'o';
    cadenaTexto [4] = 'l';
    cadenaTexto [5] = 'e';
    cadenaTexto [6] = 'd';
    cadenaTexto [7] = 'a';
    cadenaTexto [8] = '\0';
    printf("cadenaTexto = %s\n", cadenaTexto);
}

Aquí jugaríamos con que ya se ha mostrado letra cuando hacemos una manipulación indebida con cadenaTexto. No es una buena solución.

Te propongo que pruebes a trabajar la cadenas de texto carácter a carácter dejando espacio suficiente para que quepa todo lo que desees introducir. Es decir declarar char cadenaTexto [8]; o char cadenaTexto [20]; si lo prefieres e introducir carácter a carácter, a ver si funciona.

Recomendación: incluir return 0; como última línea en el main

Añado pedirte una cosa (si te es posible). Si tienes resueltos los ejercicios del curso, te agradecería que los fueras poniendo en el foro, aunque no te hayan generado dudas, pues así nos ayudas a tener más completos los foros y pueden servir de referencia para personas que están realizando el curso, o para ponerlos de ejemplo cuando se hacen consultas.

Saludos

pedro,,

  • Moderador Global
  • Experto
  • *******
  • APR2.COM
  • Mensajes: 1292
    • Ver Perfil
Hola Mario.

Sobre el ejercicio, como bien dices, en cuanto modifico la forma de crear la variable cadenaTexto, funciona perfectamente, la línea quedaría así:

Código: [Seleccionar]
char cadenaTexto [50] = "alameda";
de esta forma ya no hace falta esta línea:

Código: [Seleccionar]
cadenaTexto [8] = '\0';
El código quedaría así:

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
int main() {
    int edad = 21;
    long distancia = 488321;
    char letra = 'k';
    char cadenaTexto [50] = "alameda";
    printf("edad = %d\n", edad);
    printf("distancia = %ld\n", distancia);
    printf("letra = %c\n", letra);
    printf("cadenaTexto = %s\n", cadenaTexto);
    edad = 22;
    distancia = 666543;
    letra = 't';
    cadenaTexto [0] = 'a';
    cadenaTexto [1] = 'r';
    cadenaTexto [2] = 'b';
    cadenaTexto [3] = 'o';
    cadenaTexto [4] = 'l';
    cadenaTexto [5] = 'e';
    cadenaTexto [6] = 'd';
    cadenaTexto [7] = 'a';
    printf("edad = %d\n", edad);
    printf("distancia = %ld\n", distancia);
    printf("letra = %c\n", letra);
    printf("cadenaTexto = %s\n", cadenaTexto);
    return 0;
}

Iré subiendo al foro los demás ejercicios, puesto que sí los tengo realizados.

Gracias por la corrección y los comentarios.

Saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".