Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - leosansan

#801

Tienes varios errores comprensibles en este arranque con los arrays:

* El primer índice o bien no pones nada o, mejor pones el número de palabras que contiene el array capitulo1, 5 en este caso.

* El segundo índice no está mal ya que no se peca por exceso, pero penaliza el uso de la memoria y en este caso, como la palabra más larga es de 6 caracteres habrá que poner 7, por lo que te explique de tener en cuenta al caracter nulo de todo fin de cadena.

* En los for se te fue la olla  ;) al poner fil=0 y col=0 cuando los índices son i y j, por lo que será i=0 y j=0.

* En el caso de arrys de cadenas mejor que pensar en filas y columnas, algo típico en los arrayas bidimensionales numéricos aunque en sí no esté mal, es pensar en posición de la cadena y caracter de dicha cadena.

* Al usar la función strlen no le pusiste el argumento de la misma, fíjate en el código para verlo mejor.

* Haces un uso excesivo de las llaves. Cuando un for, if o compañía sólo tiene una instrucción como "cuerpo" te la puedes  y debes ahorrar, sólo enmaraña la lectura del código. Supongo que es una buena costumbre adquirida de python, como el indentar siempre el código para una buena comprensión y fácil lectura.

* Tienes un punto y coma de más al final de los for, dentro del paréntesis.

* Al final te olvidaste de la instrucción para imprimir los resultados. He aquí la salida:


Código (cpp) [Seleccionar]
pincel ---->pin
cinc ---->c
cincel ---->cin
pipa ---->p
papel ---->pa


Y con tanto rollo casi me olvido de ponerte una posible solución, se podría mejorar con el uso de otras funciones de la librería string, pero estamos a lo que estamos, el uso de arrays:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>

int main(){
   int i,j;
   char capitulo1[5][7] = {"pincel", "cinc", "cincel", "pipa", "papel"};
   char cap1[5][7]={0};
   for (i= 0; i<5; i++)
       for (j = 0; j<strlen(capitulo1[i])-3; j++)
               cap1[i][j] = capitulo1[i][j];
               for (i = 0; i<5; i++)
       printf("%s ---->%s\n",capitulo1[i],cap1[i]);
   return 0;
}


Una variante para que imprima en cap1 un número de letras en función de la longitud de la cadena y así no salgan cadenas de una sola letra sería:

Código (cpp) [Seleccionar]
pincel ---->pin
cinc ---->ci
cinceles ---->cinc
pipa ---->pi
termometro ---->termo


Para esta variante del código:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <string.h>

int main(){
   int i,j,longitud;
   char capitulo1[5][11] = {"pincel", "cinc", "cinceles", "pipa", "termometro"};
   char cap1[5][11]={0};
   for (i= 0; i<5; i++){
       longitud=strlen(capitulo1[i])/2;
       for (j = 0;j<longitud; j++)
               cap1[i][j] = capitulo1[i][j];
   }
   for (i = 0; i<5; i++)
       printf("%s ---->%s\n",capitulo1[i],cap1[i]);
   return 0;
}


Espero no haberte agobiado con tantas sugerencias de un tirón pero sabes que para cualquier otra duda o sugerencia, aquí estamos para darte un empujoncito. ¡Ánimos! ;-)

Saluditos!. .... ...
#802
Cita de: amchacon en 17 Mayo 2013, 18:50 PM
Ojo goto si que tiene sus usos (al igual que las variables globales). Por ejemplo si tenemos un montón de bucles anidados y queremos forzar su repetición en caso de error:

Código (cpp) [Seleccionar]

repetir:

for (int i = 0; i < 30; i++)
  for (int j = 0; j < 30; j++)
     for (int k = 0; k < 30; k++)
        for (int l = 0; l < 30; l++)
            if (Matriz[i][j][k][l] == ERROR)
                     goto repetir;



En caso de error en la introducción de un dato siempre podemos recurrir a :

Código (cpp) [Seleccionar]
for (int i = 0; i < 30; i++)
  for (int j = 0; j < 30; j++)
     for (int k = 0; k < 30; k++)
        for (int l = 0; l < 30; l++)
            if (Matriz[i][j][k][l] == ERROR){
               puts("error");
               l--;
               }


Citar
También podría servir para forzar la salida en caso de que encontremos el resultado (recordemos que un break solo serviría para el primer for).

Y si quisiéramos salir, ya que con un break no se puede, podemos recurrir al uso de banderas o flags, tantas como deseemos, como ejemplo esta salida de un triple bucle:

Código (cpp) [Seleccionar]
a[0][0][0]= 10
a[0][0][1]= 12
a[0][0][2]= 15
Sali de los bucles


del código de muestra que pongo a continuación:

Código (cpp) [Seleccionar]
#include <stdio.h>

int main()
{
int i,j,k,flag=0,a[30][30][30];
       for (i=0;i<30 && flag==0;i++)
for (j=0;j<30 && flag==0;j++)
for (k=0;k<30 && flag==0;k++){
printf("a[%d][%d][%d]= ",i,j,k);
                               scanf("%d",&a[i][j][k]);
                               if (a[i][j][k]==15)
                                  flag++;
}

   puts("Sali de los bucles");
   return 0;
}


Y combinando flags y while o Do-While podemos hacer virguerias. Todo es cuestión de imaginación.

Todo lo dicho anteriormente no es una crítica al uso del goto, por algo está implementado en el lenguaje, sino a su abuso o uso innecesario en determinadas situaciones que con un poco de habilidad nos evita su uso y los posibles "efectos colaterales" que pueda originar si no se está al loro de dónde poner las etiquetas etc.

Resumiendo, yo lo uso en determinadas situaciones, aunque siempre le busco la vuelta para no tener que usarlo.

Saluditos!...... ...
#803
Cita de: Caster en 18 Mayo 2013, 18:34 PM
Otra duda que me surge, tu declaras el array capitulo de la siguiente manera:

char capitulo1[15][20]

Donde 15 sería el número de filas y 20 el número de columnas, si es así, tendría que ser al reves creo:

char capitulo1[20][15]

20 sería el número máximo de palabras, y 15 el número máximo de carácteres por palabra.


Justo al revés de lo que dices y como yo te pongo en el ejemplo. El primer índice hace referencia al número de palabras y el segundo al de caracteres, que te recuerdo es uno más de la palabra más larga para tener en cuenta el caracter nulo.

Un ejemplo podría ser:

Código (cpp) [Seleccionar]
char oficina[3][5] = {"0210","0441","0462"};

donde como ves el primer índice igual a 3 cuenta las oficinas, en este caso determinadas por el número de sucursal, y el segundo 5 al tamaño, donde obsevaras que aunque todas las las oficinas son de cuatro caracteres, la dimensión es cinco por  lo que te comenté de tener en cuenta al caracter nulo.

Saluditos!. .....
#804
Cita de: Caster en 18 Mayo 2013, 14:26 PM
..................................
y si trato con varios capítulos no se tienen porque crear arrays multidimensionales, se usa un array bidimensional por cada capítulo y solucionado.


Esa es una opción totalmente válida, aunque a mi entender poco eficiente por los múltiples arrays que habría que usar, uno por capítulo,ni te cuento los que tendrías si fuera una novela rusa.  :laugh:
Mientras en el array tridimensional podrías meter todos los capítulos y su manejo y referencia es más breve e inmediata.

Pero como te comente al principio no es mala idea empezar con arrays bidimensionales.

Saluditos!..... ..
#805
Sólo se me ha ocurrido un sistema para evitar los caracteres no numéricos, dejando option como int en todo el sistema de archivos. Mezcla funciones usuales en C pero que las comparte el C++ y lo mejor de todo es que el sistema funciona. Por cierto, fíjate que yo uso "cls" para limpiar la pantalla, posiblemente tengas que cambiarlos a clear, están en el primer fichero:

helpmain.cpp

Código (cpp) [Seleccionar]

#include "helpclass.h"
#include <iostream>
#include <cstdlib> //Para system()
#include <cstdio> //Para getchar();

using namespace std;

int main() {
Help h;
char ch;
int option,cont;
bool continuar = true;

do {
system("cls");
option = h.getoption();
cout << option << endl; //borrar
h.showmenu();
       do{
           cont=0;
           cout << "Introduce opcion de 0 a 6: ";
           cont=scanf("%d",&option);
           while( (ch = getchar()) != '\n' );
       }while(cont==0);
if(h.isvalid(option)) {
system("cls");
continuar = h.helpon(option);
cout << "Pulsa ENTER para continuar ...";
getchar();
getchar();
}
else {
cout << "Por favor, introduzca valor valido" << endl;
}
} while(continuar);


return 0;
}


helpclass.cpp

Código (cpp) [Seleccionar]

#include "helpclass.h"
#include <iostream>
#include <cstdlib> //Para system()
#include <cstdio>

using namespace std;

Help::Help() {
setoption(1);
}

int Help::getoption() {
return _option;
}

void Help::setoption(int option) {
_option = option;
}

void Help::showmenu() {
cout << endl << "Sistema de ayuda en modo texto en la consola" << endl << endl;
cout << "0.- Se mostrara la ultima ayuda" << endl;
cout << "1.- if" << endl;
cout << "2.- switch" << endl;
cout << "3.- for" << endl;
cout << "4.- while" << endl;
cout << "5.- do-while" << endl;
cout << "6.- Salir del programa" << endl << endl;
}

bool Help::helpon(int option) {
setoption(option);
switch(option) {
case 0: option = getoption();
break;
case 1: cout << endl << "Bucle if" << endl << endl;
cout << "    if(condition)" << endl;
cout << "    {" << endl;
cout << "        statements;" << endl;
cout << "    }" << endl << endl << endl;
break;
case 2:  cout << endl << "Bucle switch" << endl << endl;
cout << "    switch(expression)" << endl;
cout << "    {" << endl;
cout << "        case constant-expression:" << endl;
cout << "            statements;" << endl;
cout << "            break; //optional" << endl;
cout << "        case constant-expression:" << endl;
cout << "            statements;" << endl;
cout << "            break; //optional" << endl << endl;
cout << "        // you can have any number of case statements." << endl;
    cout << "        default : //Optional" << endl;
cout << "            statements;" << endl;
cout << "    }" << endl << endl;
break;
case 3: cout << endl << "Bucle for" << endl << endl;
cout << "    for(init; condition; increment)" << endl;
cout << "    {" << endl;
cout << "        statements;" << endl;
cout << "    }" << endl << endl;
break;
case 4: cout << endl << "Bucle while" << endl << endl;
cout << "    while(condition)" << endl;
cout << "    {" << endl;
cout << "        statements;" << endl;
cout << "    }" << endl << endl;
break;
case 5: cout << endl << "Bucle do-while" << endl << endl;
cout << "    do" << endl;
cout << "    {" << endl;
cout << "        statements;" << endl;
cout << "    } while(contidion);" << endl << endl;
break;
default: return false;
}
return true;
}

bool Help::isvalid(int option) {
if(option < 0 || option > 6) {
return false;
}
//No haría falta el else, porque si se cumple bucle if, sale de la funcion
//devolviendo false, si no se cumple, no entra y al final devuelve true;
return true;
}



helpclass.h

Código (cpp) [Seleccionar]
#ifndef __HELPCLASS_H__
#define __HELPCLASS_H__

class Help {
private:
int _option;
public:
Help();
int getoption();
void setoption(int option);
void showmenu();
bool helpon(int option);
bool isvalid(int option);
};

#endif


Como ves el cambio es muy sutil en el primer fichero, pero cumple con su cometido. Pruébalo y ya me diras.

Saluditos!. ....
#806
Cita de: Caster en 17 Mayo 2013, 14:26 PM
No me había fijado en eso, el tampoco se debió de fijar y solo copió las condiciones. Tal y como lo pusiste debería de funcionar.

Saludos

Eso creo yo, por eso le he reeditado el primer mensaje con un zoom.

¡Hasta lueguito¡ .....
#807
Cita de: Caster en 17 Mayo 2013, 14:19 PM
Yo creo que la solución sería cambiar el tipo de opción, en vez de ponerlo como int, ponlo como char.

Saludos


En la función que le pase estaba como char.

Ya he reeditado el mensaje y le pongo un código de prueba que usa ese sistema y funciona O.K.

Saluditos!. ....
#808
Cita de: grodomio en 17 Mayo 2013, 13:39 PM
Hola leosansan,

no veo la diferencia, lo que has hecho ha sido invertir las condiciones y los returns.

Sigue aceptando caracteres no numéricos como válidas.


Como te lo he puesto si introduces un numero fuera de 0 y 6, que retorna true es decir lo acepta, o bien introduces un caracter no numérico, al no estar entre 0 y 6 retorna false, es decir, lo rechazaría.

Pero igual estoy "nublado" como el día. :P

Por ejemplo una salida a lo que propones:

Código (cpp) [Seleccionar]
Introduzca un  numero entre 0 y 6 :
3
3 es aceptado
Introduzca un  numero entre 0 y 6 :
6
6 es aceptado
Introduzca un  numero entre 0 y 6 :
8
8 es rechazado
Introduzca un  numero entre 0 y 6 :
a
a es rechazado
Introduzca un  numero entre 0 y 6 :


con el siguiente código de testeo:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char option;
    do{
        printf("Introduzca un  numero entre 0 y 6 :\n");
        scanf(" %c",&option);
        if (option>='0' && option<'7')
            printf("%c es aceptado\n",option);
        else
        printf("%c es rechazado\n",option);
    }while(1);
    return EXIT_SUCCESS;
}


Saluditos!. ... .  

[/size]
#809
Cita de: grodomio en 17 Mayo 2013, 12:47 PM
Hola, tengo que hacer un método de una clase que compruebe si un valor introducido es válido o no.
Ese valor proviene de un menú que tiene las opciones desde 0 hasta 6 incluidas.

Con el código que pongo a continuación controlo los valores numéricos, pero no se cómo evitar que un usuario introduzca una letra por ejemplo.

bool Help::isvalid(int option) {
if(option < '0' || option > '6') {
return false;
}
return true;
}


Espero vuesta ayuda, gracias.

Cámbiala a:

Citarbool Help::isvalid(char option) {
   if(option >= '0' && option< '7') {
      return true;
   }
   return false;
}

Observa que opcion debe ser char, que en pricipio debía serlo porque tienes en las condiciones '1' y '6' que son caracteres y no enteros, que entonces serían en la condición 1 y 6 sin las comillas.

Saluditos!. ....  
#810
Cita de: CCross en 17 Mayo 2013, 02:07 AM

En este caso segun entiendo la funcion printf imprime inversamente
los residuos resultante de la division, aprovecha esa propiedad de
imprimir el bit mas significativo primero y el LBS al ultimo siendo el
primero en originarse, podria alguien explicarme como esto es posible..


Pues una forma es ir guardando en un array y luego imprimirlo al revés, o bien lo pasa a binario con la función "itoa":

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#define MAX 100

int main()
{
    int j,num,num0,resto,i=0,binario[MAX],bin[MAX];
    printf("Introduzca un numero : ");
    scanf("%d",&num);
    num0=num;
    while(num>=1){
        resto=num%2;
        binario[i]=resto;
        i++;
        num=num/2;
        printf("%d",resto);
    }
    puts("\n");
    for (j=i-1;j>=0;j--)
        printf("%d ",binario[j]);
    itoa (num0,bin,2);
    printf ("\n\n%d en binario: %s\n\n",num0,bin);
    return 0;
}


Saluditos!. .... ..