Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Array tipo char

Estas en el tema de Array tipo char en el foro de C/C++ en Foros del Web. Buenas noches amigos, apenas empiezo a programar en c, y ando haciendo un programa que me ordene una array tipo char pero tengo algunas dudas ...
  #1 (permalink)  
Antiguo 21/01/2014, 21:18
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 3 meses
Puntos: 0
Array tipo char

Buenas noches amigos, apenas empiezo a programar en c, y ando haciendo un programa que me ordene una array tipo char pero tengo algunas dudas aunque el programa va bien, el programa basicamente lo que hace es guardar una letra mostrala luego ordenada y desordenda alfabeticamente, lei en este foro algo del metodo burbuja estoy intentando aplicarlo pero ni me compila aqui les dejo el codigo muchisimas gracias.

Cita:
#include <stdio.h>
#include <conio.h>
#include <string.h>

main()
{
char A[1][10],B[1][10],a,temp[10];
int i,j;

printf("Ingrese 10 letras \n");


for (i=0;i<10;i++)
{
printf ("%d letra: ",i);
scanf("%s",&A[i]);

}
for(i=0;i<10;i++)
{
strcpy (B[i],A[i]);
}
printf("Vector Desordenado");

for(i=0;i<10;i++)
{
printf("%s ",&B[i]);
}
printf("Vector ordenado");

for (i=1;i<=10;i++)
for (j=i+1;j<=10;j++)
{
if(A[i]>=A[j])
temp=A[j];
A[j]=A[i];
A[i]=temp;
}



getch();
}
  #2 (permalink)  
Antiguo 22/01/2014, 01:38
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Array tipo char

Si declaras los arrays como bidimensionales... porque los accedes como si fuese unidimensionales?

Podrias indicar los errores de compilación que te marcan?
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 22/01/2014, 02:27
 
Fecha de Ingreso: diciembre-2013
Mensajes: 10
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Array tipo char

Lo que te dice Malenko tiene razón, deberías de arreglar ese error. Aunque revisando un poco tu código, para imprimir un texto en pantalla, la sintaxis seria así: printf("%c", A[i]);

Imprime mejor un carácter y elimina el símbolo &.

También de una manera rápida, creo que estas implementando mal el método de la burbuja, la condición del ciclo accede a la posición 10 del vector A, recuerda que se accede desde la posición 0 hasta la 9 (10 espacios en total).

Te recomiendo, que primero intentes ordenar una lista de números implementando el método de la burbuja y después intentes continuar con este ejercicio.

Cualquier duda, aquí estamos.

Saludos.
  #4 (permalink)  
Antiguo 22/01/2014, 10:08
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Array tipo char

Gracias por sus prontas respuestas amigos, declaro la array bidimensional por que o si no, no me copia esta parte el cod .
Cita:
for(i=0;i<10;i++)
{
strcpy (B[i],A[i]);
}
No entiendo el porque y el error de compilacion lo coloque en esta imagen, y ya arregle el for del contador que vaya a 0 9 pero el error de compilacion sigue:

gracias de antemano
  #5 (permalink)  
Antiguo 22/01/2014, 14:01
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Array tipo char

una tabla array o como lo llames es en realidad un puntero a la primera letra de una cadena, ejemplo:

Si en un array guardamos:
char palabra[]="hola";
palabra es un puntero en realidad que apunta hacia la primera letra que es h, la ultima letra es \0 (cero).
Estas intentando modificar la dirección de memoria.
Para guardarlo en alguna parte de la tabla debes hacerlo así:
temp[0]=A[j];
Eso es así por que declaraste temp como tabla y no como variable simples.
Si quieres una variable para guardar un char declararla así:
char temp; y no char temp[10];
si declaras como esta ultima tienes 10 posiciones para guardar
temp[0]
temp[1]
temp[2]
temp[3]
temp[4]
temp[5]
...
temp[9] es la ultima y creo que aquí se guarda el \0 o no lo recuerdo.

temp a secas apunta donde esta guardado la h si escribes temp[3] estas accediendo a la 4 variable de la tabla.
temp y temp[] son 2 cosas distintas.
haz un printf de temp y veras la dirección de memoria de temp[0];

Te dejo algo de lectura sobre eso.
http://platea.pntic.mec.es/vgonzale/..._C/cadenas.htm
Ahí puedes ver como funciona el string en c ;)

Última edición por vangodp; 22/01/2014 a las 14:07
  #6 (permalink)  
Antiguo 22/01/2014, 17:48
 
Fecha de Ingreso: diciembre-2013
Mensajes: 10
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Array tipo char

Si solo deseas pasar el contenido del arreglo A hacia B, basta con poner dentro del ciclo B[i]=A[i];

El error de la variable temp, tal como te lo explica vangodp, necesitas declararla como así char temp, ya que solo va a contener un carácter auxiliar.

También cuando vayas a almacenar un carácter en el arreglo A, guárdalo así: scanf("%c", &A[i]);

Por ultimo, utiliza bien los indices, dentro del método burbuja, ya que necesitas comparar un lugar adelante de la posición actual.
  #7 (permalink)  
Antiguo 22/01/2014, 21:35
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Array tipo char

Gracias amigos por sus prontas respuestas, ya he resuelto el ejercicio aqui dejo el codigo

Cita:
#include <stdio.h>
#include <conio.h>

main()
{

char letras[10],desor[10],temp;
int i,j;

printf("Ingrese 10 letras ");


for (i=1;i<=10;i++)
{
printf("Letra %d: ",i);
scanf("%s",&letras[i]);
}
for (i=1;i<=10;i++)
{
desor[i]=letras[i];
}

for (i=1;i<=9;i++)
for (j=i+1;j<=10;j++)
{
if (letras[i]>letras[j])
{
temp = letras[i];
letras[i] = letras[j];
letras[j] = temp;
}
}
printf("Letras ordenadas ");
for (i=1;i<=10;i++)
{
printf("%c ",letras[i]);
}
printf("\n");

printf("Letras desordenadas ");
for (i=1;i<=10;i++)
{
printf("%c ",desor[i]);
}


getch();
}
Luego de entender exactamente como trabajan los strings gracias a vangodp, pude aplicar algo del sentido comun :), y solo me queda una duda por que scaneo los datos con %s y para imprimirlo, lo tengo que imprimir con %c o si no el dato no es correcto y gracias por la ayuda brindada
  #8 (permalink)  
Antiguo 22/01/2014, 22:31
 
Fecha de Ingreso: diciembre-2013
Mensajes: 10
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Array tipo char

Con %s espera recibir una cadena de caracteres (string) y con %c solo recibe un carácter de entrada.

Saludos.
  #9 (permalink)  
Antiguo 22/01/2014, 22:53
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Array tipo char

Gracias amigo por tu pronta repuesta eso lo tengo claro, pero cuando scaneo, con %c me lee nada mas 5 letras en vez de 10 a que se debe ? y gracias de nuevo.
  #10 (permalink)  
Antiguo 23/01/2014, 00:46
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Array tipo char

c es para imprimir un caracter o una sola letra c = char.
s espara imprimir la cadena completa.
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. /*Salta a una nueva linea pero envés de escribir printf("\n"); escribimos salto*/
  4. #define salto printf("\n");
  5.  
  6.  
  7. int main(){
  8.     char palabra[] = "palote";
  9.     int longitud = ( sizeof palabra );
  10.    
  11.     printf( "%s", palabra );
  12.     printf( "%i", longitud ); /* Esto me dice el tamaño de "palabra", gracias a sizeof palabra */
  13.     /*
  14.     // Como dije antes, %s es de string, y apunta la primera letra de una cadena, sabiendo
  15.     // donde esta la primera imprime todas hasta llegar a la \0 o al final de la cadena
  16.     // por eso lo de \0
  17.     // Si declaras texto[100]; y solo pones "hola" le sobra 96 casillas(95 en realidad por
  18.     // la \0), la forma de saber  que solo imprima hasta la 'a' de "hola" es por la \0 (cero),
  19.     // si no fuera asi sabe Dios lo que contendría en estas casillas, códigos de otros
  20.     // programas (números, chars..... etc) que se imprimirían junto con hola y gracias a \0
  21.     // sabemos que no se imprime.
  22.    
  23.     // La %c solo recojo una letra y por eso necesitas especificar la posición donde la vas
  24.     // encajar
  25.     // ahora ponemos a prueba la letra \0 (cero) a ver si es verdad que esta ahí:
  26.     // palote tiene 6 letras ¿No?
  27.    
  28.     // y se puede comprobar haciendo esto:
  29.     */
  30.     salto
  31.     printf( "Tamanio de la cadena: %i bytes\n", sizeof palabra ); /*Esto lo mismo que lo anterior*/
  32.    
  33.     /*
  34.     // aquí consta que tiene un tamaño de 7 Pero un momento hemos dicho que tenia 6 XD
  35.     // a ver que hay ahí en la posición 7
  36.     */
  37.    
  38.     salto
  39.     char letra = (char)palabra [6]; // como inicia en 0 la 7º posición es el 6 ¿No?
  40.    
  41.     /*
  42.     // Imprimimos como un entero ya que de otro modo no se mostraría XD
  43.     // Aqui imprimimos palabra[6] y como entero nos va a dar 0 (cero)
  44.     */
  45.     printf( "%i", letra );
  46.    
  47.     /*
  48.     // ¿Por que imprimir como entero? Prueba a imprimirle como %c y no te va salir nada.
  49.     // Se puede comprobar los resultados con la tabla ASCII y ver realmente lo que contiene.
  50.     // 0 es igual que NULL en c por eso no se muestra como char, si le mostramos como int
  51.     // al ser igual a cero como int si le podemos ver un (cero), ni todos los caracteres de
  52.     // la tabla son imprimibles.
  53.     // Aqui te dejo una tabla para comprobar http://www.elcodigoascii.com.ar/
  54.     // el primer numero de la tabla es el nul y no lo puedes imprimir como char, eso no
  55.     // quiere decir que no este ahi, pero si lo puedes imprimir como int ;)
  56.     // fiate en la potencia de c que incluso podemos imprimir una casa que ni esta dentro
  57.     // del rango
  58.     // Esto: char palabra[] = "palote"; Equivale a crear esto: char palabra[7] y meterle
  59.     // "palote0"
  60.     // pero puedo muy bien imprimir los datos de que tengan a continuación como palabra[100] XD
  61.     // Eso quiere decir que imprime la casilla 100 a partir de la dirección de la primera letra
  62.     // que es 'p'. Vamos ha comprobar, pero una cosa es tener claro, como dije antes algunos
  63.     // caracteres no son imprimibles por eso imprimimos como int y comprobamos en la tabla ;)
  64.     // Tampoco sabemos que es lo que contiene estas casillas si son int o chars :D, pero todas
  65.     // las que pueden ser imprimibles lo hacen como int.
  66.     // por ejemplo \n que hace salto de linea no es un carácter, mas bien es un símbolo que
  67.     // que dice que cuando llegue ahí salte a una nueva linea ¿ok?(Pero esta ahí, siempre hay
  68.     // algo aun que sea nulo(cero))
  69.     // Basta de chacharas y pongamos a prueba. No se lo que te va salir por que como dije
  70.     // esta en la memoria de tu ordenador, cada vez que enciendes, borras, escribes, inicias
  71.     // un programa... la memoria cambia así que es impredecible saber lo que contiene ahí :(
  72.     */
  73.    
  74.     salto
  75.     printf( "Aqui imprimimos una casilla fuera de rango: %i", palabra[1000] );
  76.     /*
  77.     // En la posición 1000 me imprimió la letra U mayúscula según la tabla XD.
  78.     // Vayan cambiando el numero muchos salen como NULL o no salen por no ser imprimibles XD
  79.     // No se si os habéis dado cuenta la potencia que tiene esto, no me salta ningún error
  80.     // y puedo tanto cambiar como leer cualquier parte de una memoria XD
  81.     // Chicos cuidado con eso, es una arma de doble filo, si modifico un dato que no
  82.     // corresponde puedo poner en peligro todo el sistema operativo XDD
  83.     // Ahora juguemos un poco mas, vamos a ver cualquier parte de la memoria :D
  84.     */
  85.     salto
  86.     /* poniendo el valor aquí en hexdecimal podemos ver cualquier posición de la memoria */
  87.     char *puntero=(char*)0x402004;
  88.     printf ("%d",*puntero);
  89.    
  90.        
  91. }

Bueno no se todo sobre memoria, pero la memoria es algo imaginable.
Piénsalo así: la memoria es un almacén, las casillas son cajas numeradas consecutivamente.
En ese almacén entra mas gente a poner cosas en las cajas aparte de ti.
En ese almacén no podemos meter todo lo que queramos en una sola caja, pero podemos distribuir entre varias cajas.
si tengo 5 melones los divido entre cajas, puedo reservar la cantidad de cajas que me apetezca para guardar melones el limite lo pone el sistema operativo. leer sobre "la pila". En la memoria heap puedo reservar muuuuuuucha memoria, tanto como no ayas sido tacaño en comprar XD.
No tendría lógica tener que llenar de melones todas las cajas que reserve, pongo los melones que tengo y cuando termine pongo un aviso que en esa caja ya no tengo mas melones (\0) pero mis cajas siguen ahí reservadas por si despues meto melones o platanos o otra cosa XD.
No tengo que llevar las cajas de melones para vender, modificar, ni nada por el estilo. Imagine que envés de llevar la caja apunto en un papel donde esta esta caja, y cuando me la compran les digo en que numero de caja esta, eso hace los punteros.
los punteros serian en ese almacén una caja que dentro hay un numero que dice donde esta el melón. Si sabes donde esta el puntero sabes donde esta el melón XD
Por supuesto no solo se puede poner melones en una caja, puedo meter fresas(char), plátanos (int) y otras cosas mas.
Si pienso en una caja no voy a saber lo que hay dentro si no lo puse yo, pero nada me impide abrir esta caja. Pero en el caso de la memoria aun abriendo esta caja no sabríamos si el dato es un char o un int o yo que se que mas cosas pueden ser jeje.
Si se que tengo 20 cajas y les metí 10 melones no hay por que abrir todas, el puntero me dice cual es la primera y las voy abriendo, hasta encontrar el aviso \0 (en el caso de las tablas)que me dice, (oye!No sigas que no hay melones XD). Pero si quiero puedo seguir vendendo melones y ya lo has visto que si, aun que eso seria lo mas parecido a un timo. O.o
Ya tengo una diarrea mental con la memoria XD y tanto hablar de melones ya tengo hambre XD
Espero haber aclarado algo, la mejor manera de entender la memoria es jugar con ella, has cosillas. Trabaja con punteros, tablas, direcciones... así te pones un fiera ;)
¡Suerte! A mi esas cosas me hace recordar cosillas que ya lo tenia olvidado ^^
Si me equivoco en algo soy humano, si hay alguna maquina aquí que trabaje algo, que me gusta aprender también XD
PD: leer sobre punteros y entenderás la memoria perfectamente si no lo has echo ya XD

Última edición por vangodp; 23/01/2014 a las 01:27
  #11 (permalink)  
Antiguo 23/01/2014, 10:09
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Array tipo char

Gracias amigo por tu detallada explicacion, si como tu dices al principio enreda un poco visualizar como trabaja la memoria, y donde guarda los datos, ya tengo una idea mas clara, sin embargo la unica manera de fortalecer ese conocimiento es en la practica tal cual como lo mencionas, gracias de nuevo

Etiquetas: char, int, metodo, programa, string, tipo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:46.