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

[SOLUCIONADO] Atascado con ejercicio.

Estas en el tema de Atascado con ejercicio. en el foro de C/C++ en Foros del Web. Hacer un programa que contenga una función con el prototipo bool Incrementa(char numero[10]);. La función debe incrementar el número pasado como parámetro en una cadena ...

  #1 (permalink)  
Antiguo 11/06/2014, 03:03
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 10 años
Puntos: 0
Información Atascado con ejercicio.

Hacer un programa que contenga una función con el prototipo bool Incrementa(char numero[10]);. La función debe incrementar el número pasado como parámetro en una cadena de caracteres de 9 dígitos. Si la cadena no contiene un número, debe devolver false, en caso contrario debe devolver true, y la cadena debe contener el número incrementado.
Si el número es "999999999", debe devolver "0". Cadenas con números de menos de 9 dígitos pueden contener ceros iniciales o no, por ejemplo, la función debe ser capaz de incrementar tanto la cadena "3423", como "00002323".
La función main llamará a la función Incrementar con diferentes cadenas.

Este es el problema que me tiene atascado,y no se como avanzar, necesito ayuda,
1ª)el prototipo bool es un tipo logico,y tiene dos respuestas ,mi duda no se como plantearlo en el programa , ni se donde colocar el true ni el false,
2ª)al crear la cadena de caracteres e creado un ciclo for que guarda cada elemento en la cadena , pero cuando quiero mostrar la cadena al completo solo me muestra el ultimo carácter guardado.
3ª)como no termino de solucionar estos problemas no puedo avanzar,


Este es el código que llevo echo asta ahora,
Código:
#include <iostream>
using namespace std;


int main(){
	
	bool incrementar(char numero[10]);
	char numero = 10;
	int i;
	
		for(i=0;i<numero;i++){
			cout<<"Ingrese parametro "<<i+1<<" De string: ";
			cin>>numero;
		}
			for(i=0;i<numero;i++){
			cout<< numero[];
			}
		
			
	return 0;
}
Estoy totalmente perdido se la teoría ,pero no se como encajarla.necesitaría un ejemplo para el análisis y comprenderlo.
gracias y un saludo,
Me siento frustrado y quiero seguir aprendiendo.
  #2 (permalink)  
Antiguo 11/06/2014, 05:16
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 8 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Hola:

Debes afianzar algunos conceptos antes de seguir.

El prototipo ha de ir fuera de la función principal.
Por otro lado, si quieres crear un array de 10 elementos, has de definir un array de char, no un char y dentro del bucle acceder a cada uno de sus elementos a través de su indice.

Ahora una sugerencia. La variable i del bucle defínela dentro del mismo. Así se crea y se destruye en él y está más vinculada a él. A veces te ahorrarás errores involuntarios si intentas hacer uso de esa "i" y ya tiene asignado un valor que no esperabas.

Intenta arreglar eso primero.

Saludos
  #3 (permalink)  
Antiguo 12/06/2014, 05:12
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 10 años
Puntos: 0
Respuesta: Atascado con ejercicio.

Código:
#include <iostream>
using namespace std;

bool incrementar(char numero[10]);
const char numero = 10;

int main(){	
		
	char num;
	
		for(int i=0;i<numero;i++){//Inicio del bucle con variable definida en el bucle 
			cout<<"Ingrese parametro "<<i+1<<" De string: ";// Mensaje con incremento de seleccion de posicion
			cin>>num;//Guardado de datos en la variable num
			
			num = incrementar[i];//4.cpp:14:23: warning: pointer to a function used in arithmetic [-Wpointer-arith] este el fallo ,
								 //No se por que me sale este fallo ,aqui deveria de guardar en cada espacio de incrementar el valor introducido
			
			num = 0;// num vuelve a tener valor de cero
		}
		
			
	return 0;
}
hola, gracias por responderme dehm, siempre gusta una buena indicación , e seguido tu sugerencias y e modificado el código, pero cuando indico que quiero que me guarde los parámetros guardados en num en incrementar no comprendo el error que me muestra el copilador.
Gracias dehm y un saludo.
  #4 (permalink)  
Antiguo 12/06/2014, 05:33
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 8 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Hola:

Vamos por partes. Aunque sea pesado has de afianzar conocimientos básicos.
Vamos a olvidarnos por ahora de la función Incrementar()
Dejamos el prototipo como lo tienes, pero nos olvidamos por ahora.

Vamos a centrarnos en la entrada de datos. ¿Que variable necesitas para guardar un array de 10 char?
Código C++:
Ver original
  1. char num;
Esa variable te guarda 1 char. En el mejor de los casos, si resuelves bien el bucle, iras metiendo 10 valores en una variable char, por lo que lo único que obtendrás una vez salido del bucle es el último valor introducido.

Entonces, hay que cambiar la variable "char num" para que guarde un array de 10 char. Vamos, que debe de ser un array.
Luego hacer un bucle, en el que introduces los 10 valores que quieras en dicha variable, accediendo mediante su índice, y finalemente y opcionalmente volver a crear un bucle para recorrer los 10 valores del array y mostrarlos, para verificar que está todo correcto.

Resuelve esta parte, antes de meterte con la funcion Incrementar()
  #5 (permalink)  
Antiguo 16/06/2014, 02:58
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 10 años
Puntos: 0
Respuesta: Atascado con ejercicio.

hola dehm , de nuevo muchas gracias por tu ayuda, tenias razón estaba confundido con lo que tenia que hacer el programa no razone bien y cree un char para solo guardar un dato, no 10 de tipo char.

Código:
#include <iostream>
using namespace std;

bool incrementar(char numero[10]);
const char numero = 10;

int main(){	
	
	const char valores = 10;									
	char lista[valores];										
	
	
		for(int i=0;i<numero;i++){								
			cout<<"Ingrese parametro "<<i+1<<" de string: ";	
			cin>>lista[i];																						 						
		}
		
		
		cout<<"La Cadena es: ";									
			for(int i = 0 ; i<numero ; i++){					
				cout<< lista[i];									
				cout<<", ";
			}
					
	return 0;
}
Este es el código que llevo echo es la entrada de datos y la muestra de la cadena de carácter.
Ahora tengo que hacer el análisis de cada carácter para saber si es numero o carácter. Esto creo que lo tengo que hacer en el bucle de muestra del array. metiendo una función que analice cada elemento a la vez que lo muestra.
Y ya solo me quedaría la función incrementar(), que no tengo claro todavía que incrementa.
Y muchas gracias por la ayuda un saludo
  #6 (permalink)  
Antiguo 16/06/2014, 03:16
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 10 años
Puntos: 0
Respuesta: Atascado con ejercicio.

Tengo una duda de como plantear la condición de if para el análisis del dato,
Seria algo así:

if(lista[i] != a 0 asta 9){
cout <<ERROR;
}
como planteo la condición para que me haga un análisis del 0 al 9, es un bucle dentro de la condición?
  #7 (permalink)  
Antiguo 16/06/2014, 03:29
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 8 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Bueno, perfecto, ahora a por la función Incrementar()!

El planteamiento que estás haciendo no es correcto.
El análisis de la cadena introducida corresponde a la propia función Incrementar(). Por eso es de tipo bool.

Si la cadena que pasas a la función Incrementar() no está compuesta enteramente por caracteres numéricos, retornará false y no hará nada, y si no es así, realizará el propio acto de incrementar la cadena, y retornará true.

Para llamar a la función, que lo haces desde la función main(), puedes o bien invocar su nombre, algo como:
Código C++:
Ver original
  1. Incrementar (lista);

Pero en éste caso nos interesa hacer uso de ella para componer la secuencia que llevaremos en main().
Entonces la puedes invocar así:

Código C++:
Ver original
  1. if (Incrementar(lista)==false) // también puedes poner if (!Incrementar(lista))
  2. {
  3.     cout<<"Lo siento la cadena no puede ser tratada bla bla bla...."<<endl;
  4. }
  5. else
  6. {
  7.     cout<<lista; //mostrará la lista ya incrementada, acción que habrá realizado la función Incrementar() cuando la hemos llamado en el "if"
  8. }

Todo esto dentro de main().

Ahora puedes seguir con el cuerpo de la función Incrementar().
Yo empezaría por la parte más fácil, que es ver si todos los valores de la cadena son números.
Para ello, recorre el array comparando el valor de cada índice. En estos casos viene bien saber que los valores numéricos del 0 al 9 tienen un valor correlativo en la tabla ASCII. Así si TODOS los valores introducidos están dentro del rango, retornarás true, pero si alguno no está en él, puedes salirte del bucle retornando false y saliendo así de la función.
Cuando tengas implementada esta funcionalidad, entonces sólo quedará implementar el algoritmo de incrementar la cadena en los términos que marca el ejercicio.

P.D. A mi este ejercicio me llevó semanas hacerlo en su momento

Última edición por dehm; 16/06/2014 a las 03:35
  #8 (permalink)  
Antiguo 17/06/2014, 04:54
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 10 años
Puntos: 0
Respuesta: Atascado con ejercicio.

hola dehm, aquí estoy de nuevo jejej; esta vez con una duda lógica jejejej.

Código:
if(incrementar(numero) == false){	
			for(int i = 0 ; i<valores ; i++){				
			     if(numero[i]! <= 9){ // Este es el Error que me da  4.cpp:25:18: error: expected ‘)’ before ‘!’ token
			      numero[i] = 0;
					}
				}
			}						
			cout<<"La Cadena no se puede ejecutar";
		}
if(numero[i]! <= 9) esta Expresión lógica no esta bien compuesta no?
Pero es lógica para mi , se puede traducir así
si numero[i] no es menor o igual a 9 entonces, numero[i] = 0 no?
gracias y un saludo.
  #9 (permalink)  
Antiguo 17/06/2014, 06:39
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 8 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Hola:

La sintaxis sería así:
Código C++:
Ver original
  1. if(!(numero[i]<= 9))

Es decir, evalúa si numero[i]<=9 primero, y luego lo contrario a eso.
Pero claro, mejor:
Código C++:
Ver original
  1. if (numero[i]>9)
que es menos lioso

Pero igualmente me da que estás intentando usar la función para hacer una evaluación.

La cosa sería así:

Código C++:
Ver original
  1. includes
  2. prototipo de las funciones
  3. programa principal
  4. desarrollo de las funciones

Entonces el esqueleto de tu programa es:
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. bool Incrementa (char[10]);
  5. int main()
  6. {
  7. secuencia para crear una cadena de 10 char (ya la tienes) (1)
  8. Hacer uso de la función:(2)
  9. if (Incrementa(nombrecadena)==false)
  10. (lo que sea....por ejemplo, cout<<"no puedo incrementar esa cadena")
  11. else //si es true
  12. (lo que sea, por ejemplo, cout<<"la cadena incrementada es: "<<nombrecadena)
  13.  
  14. return 0;
  15. }
  16.  
  17. bool Incrementa(char cadena[10])
  18. {
  19. comprobar si TODOS los elementos de la cadena son numeros.
  20. si no lo son, retornar false y salir(3)
  21.  
  22. Si todos los elementos son número, proceder al incremento de la cadena
  23. retornar true(4)
  24. }

Bueno, los puntos (1) y (2) ya los tienes, y el programa principal no debe tener más que eso.
Ahora deberías desarrollar el punto (3).
La forma sería hacer un bucle que recorra cada elemento de la cadena
Si se encuentra con un elemento que no es número, simplemente retornar false. Así acabará la función y devolverá false al programa principal, que actuará en consecuencia (imprimirá el mensaje de error o la cadena incrementada)

Entonces, ¿cómo ver si el caracter es número o no?
Una forma sencilla es saber que los caracteres ASCII correspondientes a los símbolos numéricos van desde el 48 hasta el 57, así que cualquier cadena[i] cuyo valor sea menor que 48 o mayor que 57 no es número.
Saludos!
  #10 (permalink)  
Antiguo 17/06/2014, 08:10
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 2 meses
Puntos: 292
Respuesta: Atascado con ejercicio.

Cita:
if(numero[i]! <= 9) esta Expresión lógica no esta bien compuesta no?
Pero es lógica para mi , se puede traducir así
si numero[i] no es menor o igual a 9 entonces, numero[i] = 0 no?
Sino es menor o igual a 9 ENTONCES es MAYOR a 9

Código C++:
Ver original
  1. if(numero[i] > 9){
  2.      // 10 o mas
  3. }


EDIT: no entiendo porque si cuando respondi no habia mensaje de @dehm (y me demore 1 min o menos en redactar) despues del de @jscmanuel de 05:54, por qué su mensaje aparece Hoy, 07:39 ... que riduculo he quedado
__________________
Salu2!
  #11 (permalink)  
Antiguo 18/06/2014, 02:30
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 10 años
Puntos: 0
Respuesta: Atascado con ejercicio.

Muchas gracias a los dos por vuestra ayuda .Este problema me esta dejado seco,
ahora estoy creando la función bool, y con el bucle para que recorra todos los elementos y me lo compare, pero ahora me da un error en el bucle,

Código C++:
Ver original
  1. for(int i= 0; i<numero; i++){ //4.cpp:37:18: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
  2.         if((numero[i]>57) && (numero[i]<48)){          
  3.         return false;
  4.         }
  5.     }

Lo siento por mi ignorancia pero no me aclaro,ni con vuestra excelente ayuda.
Gracias de verdad.
  #12 (permalink)  
Antiguo 18/06/2014, 03:57
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 8 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Bueno, creo que hay que seguir repasando el tema de arrays.
Mira el error:
Cita:
ISO C++ forbids comparison between pointer and integer
Eso quiere decir que estás tratando un puntero como un entero.
en el bucle:
Cita:
for(int i= 0; i<numero; i++)
"i" es un entero, y le estas dando la condición de que se ejecute mientras sea menor que "numero".
Pero claro, "numero" no es un entero, sino la dirección de memoria donde empieza el array de char llamado numero[]. O lo que es igual, un puntero.
Por eso no puedes comparar enteros con punteros, sino con otro entero. El bucle será desde i=0 a i=9, para recorrer los 10 valores del array (desde numero[0] hasta numero[9])

Por otro lado, mira que le estás dando la condición AND (&&). Eso quiere decir que para que se cumpla, numero[i] tiene que ser mayor de 57 y menor de 48 a la vez...y ningún valor te cumplirá tal condición
  #13 (permalink)  
Antiguo 18/06/2014, 06:38
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 2 meses
Puntos: 292
Respuesta: Atascado con ejercicio.

COMO se ANALIZA un ejercicio de estos:

Si la cadena no contiene un número, debe devolver false, en caso contrario debe devolver true, y la cadena debe contener el número incrementado.

>>> significa que debe devolver un boolean (bool):

Cita:
bool Incrementa(char numero[10])
Hacer un programa que contenga una función con el prototipo bool Incrementa(char numero[10]);. La función debe incrementar el número pasado como parámetro en una cadena de caracteres de 9 dígitos.

>>> Como no puede devolver dos cosas (un string y un bool), o devuelve el puntero a una estructura (no es lo que piden) o el string se pasa "por referencia"

Cita:
bool Incrementa(*char numero[10])
Si el número es "999999999", debe devolver "0".

>>> simple comparacion

Cadenas con números de menos de 9 dígitos pueden contener ceros iniciales o no, por ejemplo, la función debe ser capaz de incrementar tanto la cadena "3423", como "00002323".

>>> debe despojar de los ceros iniciales en caso de ser necesario para el casting a entero


La función main llamará a la función Incrementar con diferentes cadenas.

>>> simple... son pruebas

----
Ahora, creo hay un ERROR en el ENUNCIADO porque como decia....... no se pueden devolver un BOOL y un STRING al mismo tiempo asi que el STRING pasa por referencia y eso no esta en el "prototipo" que te pasaron !!

Cita:
bool Incrementa(*char numero[10])
<< no estaba el *char
__________________
Salu2!
  #14 (permalink)  
Antiguo 18/06/2014, 08:50
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 8 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Hola Italico76. No es así exactamente, ya que cuando se pasa un array como parámetro, se pasa el puntero al primero elemento del mismo. Entonces, los cambios que se hagan al array dentro de la función, serán permanentes.

Veamos un ejemplo, y de paso le damos un tirón al ejercicio de jscmanuel. Es algo parecido al enunciado, pero un poco a la inversa:
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. bool Incrementa (char letras[10]);
  5.  
  6. int main()
  7. {
  8.     char cadena[]="ABCDEFGHIJ";
  9.     //char cadena[]="ABCD5FGHIJ"; //introducimos un caracter numerico en la cadena
  10.     if (Incrementa(cadena))
  11.     {
  12.         cout<<cadena;
  13.     }
  14.     else
  15.     {
  16.         cout<<"La cadena sólo ha de tener letras!";
  17.     }
  18.  
  19.     return 0;
  20. }
  21.  
  22. bool Incrementa (char letras[10])
  23. {
  24.     for (int i=0;i<10;i++)
  25.     {
  26.         if (letras[i]>48 && letras[i]<57)
  27.         {
  28.             return false; //salgo de la función retornando false y sin tocar el array
  29.         }
  30.     }
  31.     //si llego hasta aqui realizo el incremento.....
  32.     for (int i=0;i<10;i++)
  33.     {
  34.         letras[i]=letras[i+1];
  35.     }
  36.     return true;
  37. }

(si comentas la primera version de la cadena y descomentas la segunda, retornará false sin llegar a modificar la cadena usada como parámetro)


Bueno, seguramente te ha llamado la atención la forma de pasar el array, cuando normalmente se hace pasando el puntero de forma explícita.
Esta forma, la de pasar un "array[10]" tendrá problemas si consideramos que siempre vamos a pasar un array de 10 elementos, y luego pasamos uno menor. (El ejercicio contempla la posibilidad de pasar por ejemplo la cadena "12324"), pero eso era para mas adelante, cuando ya hubiera resuelto la cuestión fundamental.

Última edición por dehm; 18/06/2014 a las 09:07 Razón: Aclaración a Italico76
  #15 (permalink)  
Antiguo 18/06/2014, 09:40
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 2 meses
Puntos: 292
Respuesta: Atascado con ejercicio.

@dehm : te agradezco no darme duro.... es mi dia 2 con C / C++ y vengo de PHP 5.x donde por defecto los arrays se pasan por valor y los objetos se pasan por referencia por ejemplo.

Una cosa que esta como "rara" es que dice que devuelva un bool (Si la cadena no contiene un número, debe devolver false, en caso contrario debe devolver true) o un "0" (si el número es "999999999", debe devolver "0") y eso no es compatible segun entiendo con un lenguaje como C o C++ .. o se devuelve un tipo u otro... como se resuelve ?
__________________
Salu2!

Última edición por Italico76; 18/06/2014 a las 09:53
  #16 (permalink)  
Antiguo 18/06/2014, 10:09
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 8 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Hola Italico76:

Pues realmente lo que hace la función es retornar false y no hacer nada, o si no se da la condición de false modificar la cadena y retornar true. Al ser los cambios permantentes cuando se manipula la cadena pasada como parámetro, entonces la secuencia de la función es:
1.- ¿Es false? Retorno false y adiós.
2.- ¿No lo era? Manipulo la cadena y retorno true.

Y ya en main obtengo:
O bien un valor false y la cadena sin manipular
O bien un valor true y la cadena manipulada.

P.D. Que yo soy un zoquete, lo que pasa es que este ejercicio lo hice en su momento, y me costó tanto o mas que lo que le está costando a jscmanuel
  #17 (permalink)  
Antiguo 18/06/2014, 10:17
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 2 meses
Puntos: 292
Respuesta: Atascado con ejercicio.

Pero que es eso de si "999999999", debe devolver "0" ? o sea... la firma de la funcion es bool o es char o string ... no puede mutar o si ?
__________________
Salu2!
  #18 (permalink)  
Antiguo 18/06/2014, 11:12
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Atascado con ejercicio.

Cita:
Iniciado por Italico76 Ver Mensaje
Pero que es eso de si "999999999", debe devolver "0" ? o sea... la firma de la funcion es bool o es char o string ... no puede mutar o si ?
Sí, si se puede, solo que se debe hacerr antes del retorno.

Una opción sería:

Código C++:
Ver original
  1. bool incrementar(char numero[N]){
  2. .......................
  3.     if ( strcmp( numero, "999999999" ) == 0 )
  4.       numero[0] = '0', numero[1] = '\0';
  5. ...................
  6. }
Y espero un día más para colgar una posible solución. Me parece que tener a jscmanuel más de una semana con un ejercicio tan simple es más que una pena.

Se aprende luchando algún tiempo para sacar un código, pero un tiempo prudencial. Y si no lo saca al ver la solución aprenderá de sus errores y/o lagunas.... y es una simple opinión personal sin ánimo de entrar en diatribas al respecto.

¡¡¡Saluditos!!!

  #19 (permalink)  
Antiguo 18/06/2014, 11:29
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 2 meses
Puntos: 292
Respuesta: Atascado con ejercicio.

Cita:
Iniciado por leosansan Ver Mensaje
Sí, si se puede, solo que se debe hacerr antes del retorno.

Una opción sería:

Código C++:
Ver original
  1. bool incrementar(char numero[N]){
  2. .......................
  3.     if ( strcmp( numero, "999999999" ) == 0 )
  4.       numero[0] = '0', numero[1] = '\0';
  5. ...................
  6. }
Pues dice DEVOLVER asi que yo interpreté que era el retorno de la funcion y no el array de chars (que pasa por valor)

Creo que mi falta de experiecia en el lenguaje me hizo entender cualquier cosa...... ahora si..... gracias

---
Ya que estoy (aprendiendo y Uds aca ayudando) .... como hago para separar la declaracion de la inicializacion aqui:

Código C:
Ver original
  1. char s[]="552";

No me sale
__________________
Salu2!

Última edición por Italico76; 18/06/2014 a las 11:39
  #20 (permalink)  
Antiguo 18/06/2014, 12:00
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 8 meses
Puntos: 38
Respuesta: Atascado con ejercicio.

Cita:
Ya que estoy (aprendiendo y Uds aca ayudando) .... como hago para separar la declaracion de la inicializacion aqui:
si quieres inicializar despues de declarar no te queda otra que echar mano de un bucle for para asignar cada casilla de la cadena por separado. Y a consecuencia de eso debes dar un valor inicial a s[].
Entonces seria:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main () {
  5.     char s[4];
  6.     s[0] = '5';
  7.     s[1] = '5';
  8.     s[2] = '2';
  9.     s[3] = '\0';
  10.    
  11.     //Esto muestra la ultima casilla que "debe" tener el \0 que indica fin de cadena. No se recomienda usar la ultima posicion de una cadena de caracteres.
  12.     printf("%d",s[3]);
  13.  
  14.     getchar();
  15.     return 0;
  16. }

Supongo que es en c por que si es C++ mejor es usar un string y no tendrías esa limitación.
  #21 (permalink)  
Antiguo 18/06/2014, 12:40
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 2 meses
Puntos: 292
Respuesta: Atascado con ejercicio.

Gracias @vangodp .. en este ejercicio creo complica asi que me va a tocar dejarlo como antes

La verdad queria aprender algo con este ejercicio pero me volvi loco con castings de char* a entero, de const char a char* ... etc! es de locos!

Sera que ya que el compa viene demorado con el ejercicio.....de paso me ayudan a mi tambien a cerrar lagunas ?

Código C:
Ver original
  1. #include <string>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <sstream>
  7.  
  8. using namespace std;
  9.  
  10. // esta me funcionó en g++ pero no me sirve creo
  11. string rellenar_str(string str,char chr='0',int long_esperada=10,bool izq=true)
  12. {
  13.     int l;
  14.     l = strlen(str.c_str());
  15.  
  16.     if (l < long_esperada){
  17.         for (int i=0;i<(long_esperada-l);i++){
  18.             if (izq)
  19.                 str = chr+ str;
  20.             else
  21.                 str +=chr;
  22.         }
  23.     }
  24.  
  25.     return str;
  26. }
  27.  
  28. void rellenar_array_chars(const char str[],char chr='0',int long_esperada=10,bool izq=true)
  29. {
  30.     int l;
  31.     l = strlen(str);
  32.  
  33.     if (l < long_esperada){
  34.         for (int i=0;i<(long_esperada-l);i++){
  35.             if (izq)
  36.                 str = chr+ str;
  37.             else
  38.                 str +=chr;
  39.         }
  40.     }
  41. }
  42.  
  43.  
  44. bool Incrementa(char numero[10])
  45. {
  46.     for (int i=0;i<strlen(numero);i++)
  47.         if (numero[i]<48 || numero[i]>57){        
  48.             cout << "Error : no son solo numeros!" << endl;
  49.             return false;
  50.         }    
  51.  
  52.     int integer;
  53.     string str;
  54.  
  55.     integer=atoi(numero);
  56.     integer++;
  57.  
  58.    
  59.     stringstream ss;
  60.     ss << integer;
  61.     str = ss.str();
  62.  
  63.     const char* char_arr = str.c_str();
  64.  
  65.     rellenar_array_chars(char_arr);
  66.     //cout << integer;
  67.  
  68.     numero =  char_arr; // error: invalid conversion from 'const char*' to 'char*' ???????
  69.  
  70.     if ( strcmp( numero, "999999999" ) == 0 )
  71.       numero[0] = '0', numero[1] = '\0';
  72.  
  73.     return true; // arreglar
  74. }
  75.  
  76.  
  77. int main(void)
  78. {
  79.     char s1[]="0000000552";
  80.     char s2[]="900000173";
  81.     Incrementa(s1);
  82.     Incrementa(s2);
  83.     cout << s1 << endl;
  84.     cout << s2 << endl;
  85.  
  86.  
  87.  
  88. }


No me funciona........ obviamente chilla al hacer:

Código C:
Ver original
  1. numero =  char_arr;

Como se arregla el programa que esta hasta ahora escrito ? (he tomado fragmentos de otros contribuidores )
__________________
Salu2!
  #22 (permalink)  
Antiguo 18/06/2014, 13:19
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Atascado con ejercicio.

¡¡¡La de Dios!!!, amigo Italico76, la has liado parda.


Propongo esta solución , de las muchas posibles:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cctype>  /// para usar la funcion "isdigit"
  3. #include <cstring> /// para usar la funcion "strcmp"
  4. #include <cstdlib> /// para usar la funcion "itoa"
  5. #include <cstdio>  /// para usar la funcion "sprintf"
  6. #define N 10
  7.  
  8. using namespace std;
  9.  
  10. bool incrementar( char numero[N] );
  11.  
  12. int main(){
  13.     char lista[N] = {0};
  14.   for( int i = 0; i < N - 1; i++ ){
  15.     cout << "Ingrese parametro " << i + 1 << " de string: ";
  16.     cin >> lista[i];
  17.   }
  18.     cout  << endl << "Cadena inicial: " << lista << endl;
  19.     if ( !incrementar( lista) )
  20.     cout << "Lo siento la cadena no puede ser tratada." << endl;
  21.     else
  22.     cout << "Cadena incrementada: " << lista << endl;
  23.     return 0;
  24. }
  25.  
  26. bool incrementar(char numero[N]){
  27.   char nueves [N] = {0};
  28.   for( int i=0; i < N - 1; i++ )
  29.     nueves [i] = '9';
  30.   for( int i=0; i < N - 1; i++ )
  31.     if ( !isdigit(numero[i]) )
  32.       return false;
  33.     if ( strcmp ( numero, nueves ) == 0 )
  34.       sprintf( numero, "%d", 0 );
  35.     else
  36.       sprintf( numero, "%d", atoi ( numero ) + 1 );
  37.     return true;
  38. }

Observar que me he curado en salud usando en un #define el tamaño de la cadena de nueves. Sí, sé que este caso es "999999999", pero ¿ y si el guasón del que marcó el ejercicio varía el número de 9?. Pues yo lo tengo fácil, basta cambiar el valor de N en el #define.

Y aquí la función "bool incrementar" con comentarios:

Código C++:
Ver original
  1. bool incrementar(char numero[N]){
  2.   char nueves [N] = {0};
  3.   for( int i=0; i < N - 1; i++ )
  4.     nueves [i] = '9';
  5.   for( int i=0; i < N - 1; i++ )
  6. ///compruebo si los caracteres con todos tipo int
  7.     ///if ( numero[i] < '0' || numero[i] > '9' )...o bien lo que sigue
  8.     if ( !isdigit(numero[i]) )
  9. ///si llega hasta aqui es true y comparo mediante la funcion "strcmp" con la cadena de nueves
  10.     if ( strcmp( numero, nueves ) == 0 )
  11. ///y si coincide copio "0" en la cadena con la funcion "sprintf"
  12.       sprintf( numero, "%d", 0 );
  13. ///si no, ahora viene el incremento del numero
  14. ///"atoi" es una funcion que obtiene un int de una cadena
  15. ///y "sprintf" como dije permite pasar a cadena un int.... y mucho mas!!!
  16.       else
  17.         sprintf( numero, "%d", atoi ( numero ) + 1 );
  18.     return true;
  19. }

¡¡¡Saluditos!!!


Última edición por leosansan; 18/06/2014 a las 13:30
  #23 (permalink)  
Antiguo 18/06/2014, 14:11
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 2 meses
Puntos: 292
Respuesta: Atascado con ejercicio.

@leosansan > gracias por tu aporte..... pero tu si rellenas con '0' hasta 10 caracteres en caso de que la secuencia sea corta ? no veo esa parte
__________________
Salu2!
  #24 (permalink)  
Antiguo 18/06/2014, 14:42
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años
Puntos: 49
Respuesta: Atascado con ejercicio.

Cita:
Iniciado por Italico76 Ver Mensaje
@leosansan > gracias por tu aporte..... pero tu si rellenas con '0' hasta 10 caracteres en caso de que la secuencia sea corta ? no veo esa parte
No acabo de entender lo de la cadena corta, la cadena tiene justo N-1 caracteres que vas introduciendo uno a uno, al menos tal como propone el ejercicio y como yo lo tengo implementado y lo del -1 es porque un caracter lo adsorbe el caracter nulo de fin de cadena.

Supongo que te refieres si la cadena que entras es del tipo: "000123789".

No problem!!!

La función atoi la transforma en el int "123789" de forma automática y ya luego es incrementarla y pasar el int resultante a cadena con sprintf.

Y lo que pide el ejercicio es justamente que si se da ese caso se proceda de esa manera justamente.

Si es otra cosa da la tabarra, entre todos vamos saliendo de dudas.

Por cierto, para ajustarse al ejercicio N debe ser justito 10.

¡¡¡Saluditos!!!

  #25 (permalink)  
Antiguo 18/06/2014, 14:56
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 2 meses
Puntos: 292
Respuesta: Atascado con ejercicio.

Cita:
Iniciado por leosansan Ver Mensaje
No acabo de entender lo de la cadena corta......... para ajustarse al ejercicio N debe ser justito 10.
Lo decia por esto:

Cita:
la función debe ser capaz de incrementar tanto la cadena "3423", como "00002323".


Pues supuse (aunque no lo dice) que debia rellenar para devolver siempre 10 caracteres...... en fin...... este ejercicio no nos resuelve la vida
__________________
Salu2!
  #26 (permalink)  
Antiguo 18/06/2014, 16:54
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 8 meses
Puntos: 38
Respuesta: Atascado con ejercicio.

Supongo que el ejercicio es algo basado en esto:
Entonces cada numero es una especie de contador de 0 a 9 ¿No?
O sea que si tengo un numero de 3 casillas como 999 si le meto uno mas vuelve a 0.
Al menos eso es lo que da a entender.
Es un ejercicio interesante XD.
A ver si saco algo.
Creo que para eso mejor es hacer una tabla de enteros y no de chars.
Empezar a incrementar el ultimo numero de la tabla y cuando llegue a 9 y le sumamos mas uno se pone a cero y y suma uno al anterior.
Digamos que tengo:
009
le sumo uno al 9 y se queda asi:
010

Eso es lo que da a entender que es el ejercicio ¿verdad?
Lo digo por que no he leído "todo" que ya se alarga mucho XD
el caso es que cuando llegue a 999 es normal que vuelva a 0.
pero como se trata de de una tabla y no de enteros reales pues mu raro el ejercicio =D
Justo lo que nos gusta jeje
  #27 (permalink)  
Antiguo 19/06/2014, 03:06
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 8 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Cita:
Iniciado por vangodp Ver Mensaje
Creo que para eso mejor es hacer una tabla de enteros y no de chars.
Pero es que el ejercicio no consiste en sumar un número, sino en modificar un array de chars para simular precisamente esa suma o incremento
  #28 (permalink)  
Antiguo 19/06/2014, 03:12
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 8 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Cita:
Iniciado por Italico76 Ver Mensaje
Lo decia por esto:



Pues supuse (aunque no lo dice) que debia rellenar para devolver siempre 10 caracteres...... en fin...... este ejercicio no nos resuelve la vida
Yo también lo interpreto así. Si paso la cadena "123", la función ha de transformarla en "000000124". (que no devolver, que la función lo único que devuelve es un bool)

Última edición por dehm; 19/06/2014 a las 03:17
  #29 (permalink)  
Antiguo 19/06/2014, 03:41
Avatar de jscmanuel  
Fecha de Ingreso: mayo-2014
Mensajes: 29
Antigüedad: 10 años
Puntos: 0
Respuesta: Atascado con ejercicio.

hola,muchas gracias por toda la ayuda que estáis dando,dehm tenias razón quería meter numero[i] en un grupo imposible ,ya lo entendí.
Código C++:
Ver original
  1. if(numero[i]>48 && numero[i]<57){
y retorna verdadero si es un numero. si no cumple esa condición pasa al incremento.
E creado el incremento
Código C++:
Ver original
  1. for(int i=0;i<10;i++){
  2.                 numero[i] = numero[i+1];
  3.                     }
Pero cuando ejecuto el programa no me detecta el diferente de numero y muestra la cadena con el carácter mal.
Puff, creo que este problema se esta complicando demasiado ya me a enseñado bastantes cosas , cuando sepa mas volveré a por el jejeje.
Y de verdad que Gracias a todos por vuestras opiniones son de mucha ayuda.
  #30 (permalink)  
Antiguo 19/06/2014, 04:08
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 8 meses
Puntos: 10
Respuesta: Atascado con ejercicio.

Una cosilla....has de incluir también el 48 y el 57.
Entonces puedes hacer así:
Código C++:
Ver original
  1. if(numero[i]>=48 && numero[i]<=57)
o así:
Código C++:
Ver original
  1. if(numero[i]>47 && numero[i]<58)

Por otro lado, pienso que es mejor evaluar primero si es false, y luego tratar la cadena si son todos los caracteres numéricos.

Entonces puedes hacer así (buscar la condición contraria):
Código C++:
Ver original
  1. if(!(numero[i]>=48 && numero[i]<=57))
o su equivalente:
Código C++:
Ver original
  1. if(!(numero[i]>47 && numero[i]<58))

O plantear la cuestión en si los números están fuera del rango
Sería ver si el número es menor de 48 O mayor de 57 ( su equivalente con menor-igual y mayor-igual)

Resumiendo:
La cadena es true si:
Código C++:
Ver original
  1. numero[i]>47 && numero[i]<58//seran validos desde el 48 hasta el 57 inclusive
o
Código C++:
Ver original
  1. numero[i]>=48 && numero[i]<=57//seran validos desde el 48 hasta el 57 inclusive

y false si
Código C++:
Ver original
  1. numero[i]<48 || numero[i]>57//seran NO validos desde el 0 hasta el 47 y desde el 58 hasta el final
ó
Código C++:
Ver original
  1. numero[i]<=47 || numero[i]>=58//seran NO validos desde el 0 hasta el 47 y desde el 58 hasta el final
(esta forma es la que tiene menos sentido)

Es importante saber usar los operadores AND y OR en los intervalos que quieras considerar, y no olvidarse de los límites de esos intervalos.

Y por último, esto es equivalente a esto:

Código C++:
Ver original
  1. !(numero[i]>47 && numero[i]<58)
Código C++:
Ver original
  1. numero[i]<48 || numero[i]>57

Considera la condición en la forma que te sea más cómoda, pero empieza evaluando si es false, no si es true.
Saludos!

Última edición por dehm; 19/06/2014 a las 04:16

Etiquetas: atascado, int, numero, programa, string
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:33.