Foros ZackYFileS

Foros ZackYFileS (http://foros.zackyfiles.com/index.php)
-   PROGRAMACIÓN Lenguajes: Visual Basic, C++, etc (http://foros.zackyfiles.com/forumdisplay.php?f=370)
-   -   Programa en C conversor decimal <->Ascii (http://foros.zackyfiles.com/showthread.php?t=383917)

TonYJauSS 20/12/2005 16:15

Programa en C conversor decimal <->Ascii
 
Hola gente,estoy empezando en esto del C y ya tengo mis primeros fallos para empezar jejeje,quiero hacer un programa que me lea por teclado una serie de numeros y me escriba el codigo ascii de esos numeros cuando lea un 0 ,no se que falla este codigo,compila pero no sirve :(.Salu2
Cita:

#include <stdio.h>
main(){
int i,numeros[10];

for(i=0;i<10;i++){
numeros[i]=0;
scanf("%i",&numeros[i]);
if(numeros[i]=0){
for(i=0;i=10;i++)

printf(" letra %c\n",numeros[i]);
}}}

kolmo7 20/12/2005 17:47

Cita:

Iniciado por TonYJauSS
Hola gente,estoy empezando en esto del C y ya tengo mis primeros fallos para empezar jejeje,quiero hacer un programa que me lea por teclado una serie de numeros y me escriba el codigo ascii de esos numeros cuando lea un 0 ,no se que falla este codigo,compila pero no sirve :(.Salu2

Código:

#include <stdio.h>
main(){
int i,numeros[10];

for(i=0;i<10;i++){
  numeros[i]=0;
  scanf("%i",&numeros[i]);
  if(numeros[i]=0){
    for(i=0;i=10;i++)
      printf(" letra %c\n",numeros[i]);
    }
  }
}


No me entero bien de lo que tiene que hacer el programa, pero el tuyo hace esto:

Usa la librería stdio.h
Considera un número entero y un vector de 10 números enteros
Comienza un bucle de 0 a 10 incrementando el contador de uno en uno para hacer:

1.asignar 0 en la posición del vector que nos diga el contador

2.leer un número y asignarlo en la posición del vector que nos diga el contador (es decir, en donde acabamos de poner un cero)

3.y si ese valor asignado es un cero...me parece que se hace un lío o pasa algo raro porque vuelves a usar el mismo contador para iniciar otro bucle...seguro que se hace la picha un lío...:)

TonYJauSS 20/12/2005 19:10

Tiene que leer numeros por teclado,y en cuanto metas un 0 que te escriba el codigo ascii de los que has metido.El primer bucle for es para inicializar a 0 el vector e ir metiendo en el valores por teclado,el 2º for viene metido dentro del if,si en el vector se ha metido algun 0 quiero que me escriba todos los numeros,por eso hago un for para que desde i =0 hasta i = 10 me escriba el ascii de todos los numeros.Perdonarme por no explicarme bien,pero es que soy muy novato :) .Salu2

kolmo7 20/12/2005 19:55

¿Pero si ha metido algún 0 dentro de los diez o en cuanto meta un cero paras de introducir números y muestras en pantalla los que se han introducido hasta entonces?

Si es la primera posibilidad, el programa debería preguntar por los diez números y en otro bucle (fuera del que se usa para pedir números) hacer la comprobación del cero.

Si es la segunda posibilidad entonces podrías hacerlo como lo tienes pero sin escribir necesariamente los diez números (es lo que estas diciendo en el segundo for: for(i=0;i=10;i++) ). Es decir, si en el segundo número meto un cero el programa lo que hace es mostrar en pantalla el primer número, luego el cero y después intenta escribir los siguientes...pero el vector no tiene ningún valor en esas posiciones...

Otra cosa: ¿tiene que ser con for o puedes usar también while?

TonYJauSS 20/12/2005 20:41

Gracias kolmo7 por tu ayuda,es la 2ª opción la que tengo que hacer,cuando se reciba un 0 se escribirá todos los numeros en ascii anteriormente leidos,es verdad que ese for me escribe siempre desde i=0 hasta i =10,pero algo falla aparte,porque aunque meta los 10 números no me escribe nada cuando uno es 0,no se si el if falla o que,voy a probar con el while(scanf numeros mientras el ultimo no sea 0,) no se si lo solucionará
...Salu2 y gracias

kolmo7 20/12/2005 20:51

¿Con esto que quieres decir: scanf("%i",&numeros[i]) ?

No recuerdo las cosas de C y no se qué hace eso. La idea es coger un número desde el teclado, pero ¿cómo se usaba el scanf? ¿Qué significa ese %i ? ¿No será otra cosa?

Más: Después de que resuelvas el tema ese de mostrar los números que has ido introduciendo, tendrás que resolver otro problema que no veo: ¿cómo pasas el número a su código ascii? ¿Con esto: printf(" letra %c\n",numeros[i])? ¿Seguro?

kolmo7 20/12/2005 20:55

http://www.lookuptables.com/asciifull.gif

Efirenet 21/12/2005 01:05

Hola,

a ver, vayamos por pasos. La teoría es: [I]Escribir números por pantalla y tras pulsar el número 0, imprimir el valor ASCII de todos los números previamente escritos.[/I] ¿Ok?
Bueno, pues vamos a echarle un vistazo a tu propuesta:

[PHP]
#include <stdio.h>
main(){
int i,numeros[10];

for(i=0;i<10;i++){
numeros[i]=0;
scanf("%i",&numeros[i]);
if(numeros[i]=0){
for(i=0;i=10;i++)
printf(" letra %c\n",numeros[i]);
}
}
}
[/PHP]

Todo se está haciendo muy bien, hasta el If. Veamos por qué:
¿Como funciona un If en C++? Si el resultado de la expresión del If es = 0, entonces no se entra. Si es <> 0, sí. En éste caso, estás haciendo lo siguiente:

[PHP]
if(numeros[i]=0){
[/PHP]

No estás haciendo una comparación de si numeros[i] es 0; estás asignando a numeros[i] el valor cero. Entonces, el resultado de esa expresión es siempre 0 y no se entra en el If.
Lo que realmente querías hacer es esto:

[PHP]
if(numeros[i]==0){
[/PHP]

Observa que con el == hacemos una comparación y con el = se hace una asignación.

Siguiente punto: Como bien dice el compañero kolmo7, en el siguiente For estás usando el mismo contador que en el for de fuera, luego ahí estás haciendo la picha un lío al programa. Además, estás usando como condición de funcionamiento del bucle que i=10, luego ahí se te va a meter en un bucle infinito (i=10 da un valor distinto de cero, luego no habría nunca una condición de parada). Lo peor de todo es que en ese segundo bucle, estás "tocando" el valor de i, con lo que al volver al primero la i tendrá otro valor y no sale lo que realmente tú querías.

Yo que tú usaría otro contador para el segundo For :D .
Por último, probablemente, querrás salir del programa tras mostrar los códigos ASCII de lo tecleado, así que te sugiero una instrucción break cuando termines el for ese que tienes anidado (una instrucción break te saca del For en el que te encuentras).

En resumen, que yo lo haría de ésta manera:

[PHP]
#include <stdio.h>
main(){
int cont1, cont2;
int numeros[10];
for(cont1=0;cont1<10;cont1++){
numeros[cont1]=0;
scanf("%i", &numeros[cont1]);
if(numeros[cont1]==0){
for(cont2=0;cont2<10;cont2++)
printf(" letra %c\n",numeros[cont2]);
break;
}
}
}
[/PHP]

Nota: He puesto cont1 y cont2 a los contadores de los bucles, ya que son nombres más descriptivos que una simple i.

Un saludo y felices fiestas

kolmo7 21/12/2005 19:43

Cita:

if(numeros[i]=0)
Se me escapó...:p
Cita:

scanf("%i", &numeros[cont1])
Me sigo haciendo la misma pregunta: ¿se pone %i o %d?

Y: ¿cómo pasas el número a su código ascii?

Efirenet 21/12/2005 22:08

[QUOTE=kolmo7]
Me sigo haciendo la misma pregunta: ¿se pone %i o %d?
[/QUOTE]

Hola, en éste caso da igual.
[LIST]
[*]%d: Conversión a enteros decimas
[*]%i: Conversión a entos
[/LIST]
Si te sirve de consuelo, yo siempre uso %d (nunca he visto mucha diferencia entre ambos).
[QUOTE=kolmo7]
Y: ¿cómo pasas el número a su código ascii?
[/QUOTE]

Muy sencillo. En el printf ponemos %c. El %c espera un número para sustituirlo por su carácter ASCII. A lo mejor a tí te confunde que no le estamos pasando una variable de tipo char, pero recuerda que el tipo char en C no es un caracter propiamente dicho, sino un número de 0 a 255. En éste caso, le estamos pasando un número y él interpretará ese número y con el %c pondrá su valor ASCII.

Un saludo y felices fiestas

kolmo7 21/12/2005 23:03

Ok, gracias Efirenet :)

Mis conocimientos de C se van perdiendo en la penumbra por la falta de costumbre :D

TonYJauSS 22/12/2005 00:40

Muchas gracias a los 2,el código que pasteó Efirenet funcionaba,pero me escribía siempre 10 veces la letra aunque el 4º número fuera un 0,lo arreglé metiendo una variable que me indicara cuantas veces habia usado el bucle de lectura para luego usarla en la escritura.Ahora me falta arreglar el porque siempre me escribe letra aunque el primer número sea un 0.Gracias y salu2

[PHP]$ vi programa1.c
#include <stdio.h>
main(){
int cont1,cont2,cont3;
int numeros[10];
cont3=0;
for(cont1=0;cont1<10;cont1++){
numeros[cont1]=0;
scanf("%i",&numeros[cont1]);
cont3++;
if (numeros[cont1]==0){
for(cont2=0;cont2<cont3;cont2++)
printf("letra %c\n",numeros[cont2]);

}
}
}[/PHP]

Efirenet 22/12/2005 11:25

Hola, yo que tú le daba una vueltita de tuerca más al asunto. Yo quitaría la nueva variable que pusiste (cont3) y todo lo que tiene asociado, y en el For pondría como condición que cont2 < cont1. Es decir, un código tal que así:

[PHP]
#include <stdio.h>
main(){
int cont1,cont2;
int numeros[10];
for(cont1=0;cont1<10;cont1++){
numeros[cont1]=0;
scanf("%i",&numeros[cont1]);
if (numeros[cont1]==0){
for(cont2=0;cont2<cont1;cont2++)
printf("letra %c\n",numeros[cont2]);
break;
}
}
}
[/PHP]

De esta manera, cuando entre en el segundo for, el cont2 caminará hasta justo antes donde se encuentre cont1 (cont1 apuntará a la casilla del array que contiene el 0).
Por cierto, le he puesto el break para que se vaya al imprimir la respuesta.

Un saludo y felices fiestas

kolmo7 22/12/2005 11:33

Para no usar el break yo pondría un while en lugar de un for al principio. Así cualquiera que coja el código sabe qué condición o condiciones hace que se detenga el bucle.

TonYJauSS 24/12/2005 00:54

Muchas gracias a los 2,funciona de vicio ;).Salu2

T4d3o 02/01/2006 21:32

[QUOTE=kolmo7]Para no usar el break yo pondría un while en lugar de un for al principio. Así cualquiera que coja el código sabe qué condición o condiciones hace que se detenga el bucle.[/QUOTE]

Es que usar ahi un break es saltarse a la torera toda la metodologia de la programacion.

Cuando un bucle se ejecuta un numero de veces determinado se usa for, si el numero varia se debe usar while.

Por otro lado el segundo for no deberia ser anidado, sino ejecutado despues del while.

Efirenet 03/01/2006 12:18

Cita:

Iniciado por T4d3o
Es que usar ahi un break es saltarse a la torera toda la metodologia de la programacion.

Cuando un bucle se ejecuta un numero de veces determinado se usa for, si el numero varia se debe usar while.

Por otro lado el segundo for no deberia ser anidado, sino ejecutado despues del while.

Hola, tienes toda la razón. Yo lo que pretendía era echar a andar el ejemplo que puso TonYJauSS, haciendo la mínima cantidad de cambios posibles.

Desde luego, yo esto lo haría de otra forma totalmente distinta, pero ya te digo que mi idea era sólo echar a andar ese ejemplo sin "tocarlo" demasiado.

Un saludo y feliz año a todos.

TonYJauSS 12/01/2006 15:19

Hola gente,pues vuelvo con ese programa retocado jeje,lo que quiero es quitar el break y el for,y usar un mientras,pero no se porque no me funciona,solo me hace una iteracion y se sale,el segundo código es el que funciona.Salu2[php]$ vi prueba5.c
#include <stdio.h>
main(){
int cont1,cont2,numeros[80],mayusculas[80];
cont1=0;
do
{


scanf("%i",&numeros[cont1]);

if(((numeros[cont1]<20)&&(numeros[cont1]!=0))||(numeros[cont1]>126))/*Comprobamos si es un numero valido*/
{
cont1--;/*Si no lo es borramos ultima posicion*/
}
if((numeros[cont1]>96)&&(numeros[cont1]<123)) /*Vemos si es una mayuscula*/
{
mayusculas[cont1]=numeros[cont1]-32;/*Si no lo es la convertimos*/
}
else
{
mayusculas[cont1]=numeros[cont1];
}
cont1++;
}
while(numeros[cont1]!=0);/*Si recibimos un 0 escribimos la salida*/

for(cont2=0;cont2<cont1;cont2++)
{
printf("%c",numeros[cont2]);/*Escribimos minusculas*/
}
printf("\n");

for(cont2=0;cont2<cont1;cont2++)
{
printf("%c",mayusculas[cont2]);/*Escribimos mayusculas*/
}
printf("\n");




}

[/php]

Este funciona pero me sobra el for y el break ;)
[php]$ vi Ascii.c
#include <stdio.h>
main(){
int cont1,cont2,numeros[80],mayusculas[80];
for(cont1=0;cont1<80;cont1++)/*Recorremos vector numeros*/
{
scanf("%i",&numeros[cont1]);

if(((numeros[cont1]<20)&&(numeros[cont1]!=0))||(numeros[cont1]>126))/*Miramos si es un numero valido*/
{
cont1--;/*Si no lo es borramos ultima posicion*/
}
if((numeros[cont1]>96)&&(numeros[cont1]<123))/*Miramos si es minuscula*/
{
mayusculas[cont1]=numeros[cont1]-32;/*La convertimos en mayuscula*/
}
else
{
mayusculas[cont1]=numeros[cont1];/*La guardamos directamente*/
}
if(numeros[cont1]==0)/*Si recibimos un 0 escribimos la salida*/
{
for(cont2=0;cont2<cont1;cont2++)
{
printf("%c",numeros[cont2]);*/Escribimos minusculas*/
}
printf("\n");

for(cont2=0;cont2<cont1;cont2++)
{
printf("%c",mayusculas[cont2]);/*Escribimos mayusculas*/
}
printf("\n");
break;/*Salimos del bucle for*/

}
}
}

[/php]

T4d3o 13/01/2006 01:40

Debes aprender a depurar los programas, si no empiezas con estos sencillitos .. cuando sean mas grandes te volveras loco ;)

Fijate:

inicializamos cont1 a 0
1ª Entrada en el bucle
Leemos caracter por teclado y lo asignamos a numeros[cont1], cont1=0
Continua la ejecucion del bucle ...
...
Tras finalizar las operaciones incremetamos cont1, asi que con1=1
Chequeamos el valor de numeros[cont1], cont1=1 <-- Aqui esta el error, el valor fue almacenado en numeros[0] y tu compruebas numeros[1]

TonYJauSS 14/01/2006 02:49

Gracias T4d3o con poner while(numeros[cont1-1]) solucionado,la verdad que es todo un mundo el C,cada vez me doy más cuenta que el 99% de la programación es saber plantear bien el problema :) .Salu2 y gracias


La franja horaria es GMT +2. Ahora son las 08:40.

Powered por vBulletin™ Version 3.8.10
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.
Traducido por vBsoporte - vBulletin en español
ZackYFileS - Foros de Debate