Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: pedro,, en 17 de Mayo 2016, 00:36

Título: C (lenguajeC) printf mostrar mensajes pantalla arrays unidimensionales CU00523F
Publicado por: pedro,, en 17 de Mayo 2016, 00:36
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
Título: Re:C (lenguajeC) printf mostrar mensajes pantalla arrays unidimensionales CU00523F
Publicado por: Mario R. Rancel en 17 de Mayo 2016, 09:25
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
Título: Re:C (lenguajeC) printf mostrar mensajes pantalla arrays unidimensionales CU00523F
Publicado por: pedro,, en 17 de Mayo 2016, 10:06
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.