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

#201
Programación C/C++ / Re: Funciones en C++
25 Abril 2014, 08:04 AM
Cita de: LauraD en 25 Abril 2014, 04:13 AM

Tengo que realizar un algoritmo en C++ mediante la implementación de funciones que no reciben y no retornan, el algoritmo esta compuesto por varias opciones por lo que obligatoriamente me piden implementar el condicional "Switch" para ejecutar segun la opcion que requiera el usuario.
...................................
supongo yo que no permite que una función este dentro de otra función,.



Si no reciben ni retornan las variables F,C,Num,etc deben ser declaradas como globales, tal como te indicó engel lex:

Código (cpp) [Seleccionar]

...........................

using namespace std;

int C,F,Num;
..................


y debes retirar todas las declaraciones de las mismas variables en todas las funciones, sólo debe quedar la declaración inicial que te indico arriba.

Por otro lado la función conversión no tiene sentido ya que esa labor se lleva a cabo en el switch de la función opciones: eliminala:


Código (cpp) [Seleccionar]
///conversion ();

De esa forma te queda el comienzo del switch funcionado como:

Código (cpp) [Seleccionar]
void opciones ()
   {

   switch (Num)
   {

   case 1:
        cout<<" Ingrese el valor en grados Celsius que desea convertir "<<endl;
        cin>>C;
        F = (C*9.5+32);
        cout<<" La conversion de "<<C<<" grados celcius a grados farenheit es igual a: "<<F<<endl;
        break;



¡¡¡¡ Saluditos! ..... !!!!



EDITO: Y no, no están permitidas las declaraciones de funciones dentro de otras. Se declaran cada una aparte. Otra cosa es que se pueda llamar a una función desde otra, eso si es posible y es lo normal.
#202
¿Es el mismo amchacon que el de este foro, osea tu?

¡Que fuerte!, me sacas varios años de experiencia xD
#203
Cita de: patilanz en 22 Abril 2014, 07:51 AM
Hola se que para pasar matrices hay que indicar la longitud de la columna pero no se porque ya que en la memoria están organizados uno a continuación del otro. Mi pregunta es como sabe c++ o el compilador el tamaño de las filas ?


El tamaño de las filas no lo sabe el compilador ¡!!¡. Como indicó eferion, es problema del programador atenerse a las dimensiones que previamente se han introducido y, por lo tanto los bloques de memoria que se han reservado para el array,  bien de forma estática o dinámica.

Aquí me surge una duda con el código que pongo a continuación y en el que las posiciones de memoria son consecutivas en el caso de una matriz estática, pero no así con una matriz dinámica. Además la diferencia de 16  es para este compilador, ya que en otros me da 24. ¿Es normal o estoy haciendo algo mal?:


Citar

               MAIN DECLARACION


       1 Direcciones en MAIN Estatico

       &=2686688       &=2686692       &=2686696
       &=2686700       &=2686704       &=2686708
       &=2686712       &=2686716       &=2686720
       &=2686724       &=2686728       &=2686732

       2 Direcciones en MAIN Dinamico

       &=4069016       &=4069020       &=4069024
       &=4069040       &=4069044       &=4069048
       &=4069064       &=4069068       &=4069072
       &=4069088       &=4069092       &=4069096


Y el código dedicado al amigo vangodp con el paso a una función de una matriz estática, observa que tengo dos posibilidades, y de una matriz dinámica, también con dos posibilidades. Tiene la impresión de las direcciones de memoria, con una opción variable, para aclarar ¿? como por un lado se reservan las direcciones de memoria, con la sola declaración de la matriz, y por otro lado como esas posiciones justamente son las que se rellenan y siempre que nos atengamos a las dimensiones correctas en el relleno, si no nos podemos ir más allá de las posiciones de memoria reservadas o machacar las posiciones anteriores de la matriz:

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

#define FIL   4
#define COL   3
#define   N   0 /*prueba y dale un valor positivo o negativo inferior a COL
                 y observa que si es positivo de COL te vas mas alla de las
                 direcciones que estaban reservadas, malo, malo, y si es
                 negativo observa como sobreescribes las posiciones
                 ateriores del array*/


void matriz ( int a0[]/*[FIL]*/[COL-N]){ /* dos opciones*/
 int i=0, j;
 printf ("\n\t\tFUNCION COL(%d)-N(%d)=%d\n\n",COL,N,COL-N);
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++){
     printf ("a0[%d][%d]=%2d  &=%d  ",i,j,a0[i][j],/**(a0+i)+j*/(int)&a0[i][j]);
   }
   putchar('\n');
 }
}

void matriz1 ( int **a1){
 int i=0, j;
 puts ("\n\t\tFUNCION 1\n");
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++){
     printf ("a1[%d][%d]=%2d  &=%d  ",i,j,a1[i][j],(int)&a1[i][j]);
   }
   putchar('\n');
 }
}

void matriz2 ( int *a2[COL]){
 int i=0, j;
 puts ("\n\t\tFUNCION 2\n");
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++){
     printf ("a2[%d][%d]=%2d  &=%d  ",i,j,a2[i][j],(int)&a2[i][j]);
   }
   putchar('\n');
 }
}

int main(){
 int i=0, j,k=0,**a_ ,a[FIL][COL];
 puts ("\n\t\tMAIN DECLARACION\n");
 puts ("\n\t1 Direcciones en MAIN Estatico\n");
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++)
     printf ("\t&=%d  ",(int)&a[i][j]);
   putchar('\n');
 }
 a_ = malloc( FIL * sizeof *a_ );
 for( i = 0; i < FIL; i++ )
   a_[i] = malloc( COL * sizeof **a_ );

 puts ("\n\t2 Direcciones en MAIN Dinamico\n");
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++)
     printf ("\t&=%d  ",(int)&a_[i][j]);
   putchar('\n');
 }
 putchar('\n');
 printf ("\n\t\tMAIN RELLENO COL=%d\n\n",COL);
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++,k++){
   a[i][j]=k;
   printf ("a[%d][%d]=%2d  &=%d  ",i,j,a[i][j],(int)&a[i][j]);
   }
   putchar('\n');
 }
 putchar('\n');
 for (i=0;i<FIL;i++){
   for (j=0;j<COL;j++,k++){
   a_[i][j]=k;
   printf ("a_[%d][%d]=%2d  &=%d  ",i,j,a_[i][j],(int)&a_[i][j]);
   }
   putchar('\n');
 }
 matriz (a);
 putchar('\n');
 matriz1 (a_);
 putchar('\n');
 matriz2 (a_);
 for( i= 0; i<FIL; ++i )
   free(a_[i]);
 free(a_);
 a_ = NULL;
 return 0;
}


Espero no haber metido la pata, al menos he logrado que  no me lance ningún warning y si no ha sido así comprensión por vuestro lado que  la intención ha sido la mejor. ;)


¡¡¡¡ Saluditos! ..... !!!!



#204

Como ya te comentaron, te sobra la librería <cmath> y te faltan la <cstlib> y <ctime> para el uso de rand y time, además de <iomanip> por si quieres que salgan separados una cierta distancia los 1 de los -1 y un k%25 para agruparlos en la salida de 25 en 25 y que no salgan un montón de 1 y -1 unos debajo de otros. Por no hablar de que no inicializas la semilla de los números aleatorios:

Código (cpp) [Seleccionar]
srand((unsigned) time(NULL));

Por otro lado haces e=100 y después declaras u[e], es decir podrías haber hecho directamente u[100]. Pero si la idea es poder variar la dimensión del array, mejor usar un:

Código (cpp) [Seleccionar]
#define E   100

Y así sólo tienes que cambiar el valor de E en un solo sitio.

Mi propuesta coincide con una de las propuestas por eferion, sólo que espaciando los 1 y -1 y una salida en bloques de 25 en 25:


Código (cpp) [Seleccionar]
for(int i=0; i< E;i++,k++){
    if (k%25==0)
      cout<<endl;
    u[i]=-1+2*(rand()%2);
    cout<<setw(3)<<u[i];
  }


¡¡¡¡ Saluditos! ..... !!!!




#205
A ver si me logro explicar, ya que ni las imágenes parecen creibles.

Código (cpp) [Seleccionar]
if (frase[i]==' ')

es decir en la posición "i" hay un espacio. ¿Qué hago?.

Código (cpp) [Seleccionar]
frase[(i++) +1]=

cojo la posición "(i++)+1", es decir la posición "i+1" y "a continuación" (==> lo cual implica incremento de la "i)" hago:

Código (cpp) [Seleccionar]
=tolower(frase[i]);

donde la "i" que aparece debe haberse incrementado por el post-incremento previo y es ya la posición implícita "i+1".

Espero que haya quedado meridianamenteclara mi explicación.

Y para más claridad las imágenes que colgué en el mensaje anterior.

Y sí, las saqué del Code::Blocks 13.12 y ya me parecía excesivo colgar más.

Conclusión, a mi si me funciona así y a ti te funciona de la otra manera. :silbar:

Tampoco quiero hacer de este tema una controversia  sobre compiladores y demás. Sólo puse las imágenes para que quedará constancia que a mi si me funcionaba.




#206
Ya lo dicen, más vale una imagen.....




De lo que no me cabe duda es de que usan el Dev-C++, ¿o no?.

Y yo no sólo uso Code::Blocks, también uso PellesC que es un purista y más, pero ya sabemos que Dev-C++ es lo que es ..... decepcionante, al menos para mi, pero vamos que no quiero empezar una diatriba sobre el tema. :)

Y sí, el incremento que hago es digamos que arriesgado, por algo me lanza un warning, pero eso lo hace más emocionante. :)


Pero nada, si te ha funcionado con el +1 a ponerlo y todos tan felices
.

¡¡¡¡ Saluditos! ..... !!!!


#207
Cita de: Blaster en 21 Abril 2014, 19:12 PM
Para que la salida sea la correcta, en la llamada a la función toupper esta linea:

Código (cpp) [Seleccionar]
frase[(i++)+1] = toupper(frase[i]);

De esta forma tu estas pasando en cada llamada a la función toupper el indice del caracter espacio, obteniendo asi resultados no deseados en la salida lo correcto seria

Código (cpp) [Seleccionar]
frase[(i++)+1] = toupper(frase[i+1]);

Un gusto volver a pasar aqui..

Saludos



Pues va a ser que no. He aquí una salida a tu idea:

Citar
La frase capitalizada es: I Oove Hhis Aame

Process returned 0 (0x0)   execution time

El motivo es que en frase[ i ], a la izquierda de toupper, se post-incrementa la variable i y al encontrase con el toupper a su derecha ya está incrementada dando mi código el resultado correcto, mientras el tuyo se pasa de caracter. ;)

¡¡¡¡ Saluditos! ..... !!!!


#208


Creo que se podría hacer sin variable adicional, sin más que touppear el siguiente caracter a espacio, incrementando a un tiempo el índice y tampoco creo necesario indicar explicitamente el caracter nulo en el for. Algo como:

Código (cpp) [Seleccionar]

........................
  int i;
  char frase[]="i love This GAME";
  frase[0]=toupper(frase[0]);
  for (i=1;frase[i];i++)
    if (frase[i]==' ')
      frase[(i++) +1]=toupper(frase[i]);
    else
      frase[i]=tolower(frase[i]);
  printf("La frase capitalizada es: %s\n",frase);
......................................


Citar
La frase capitalizada es: I Love This Game

Process returned 0 (0x0)   execution time

¡¡¡¡ Saluditos! ..... !!!!


#209
Si dejas un espacio en blanco antes del segundo scanf se soluciona ese problema.

Por cierrto, te falta la librería <cstdio> y en el segundo scanf es %f o %g, no &f.

Te dejo el código corregido:


Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>
#include <cstdio>
using namespace std;

int main(int argc, char *argv[])
{

      int a;
      float b;

      printf("introduzca un numero entero \t\n");
      scanf("%d", &a);
      printf("el numero que introujo es %d \t\n", a);

      printf("introduzca un numero decimal \t\n");
      scanf(" %f", &b);
      printf("el numero que introujo es %g \t\n", b);

      printf("Los numero que introdujo son %d y %g\n", a, b);

    system("PAUSE");
    return EXIT_SUCCESS;
}


Y es una mezcla de C y C++ no muy conveniente.

¡¡¡¡ Saluditos! ..... !!!!


#210
Sólo unos pequeños detalles previos:

* <iostream> sin el .h

* <cstring> sin el .h

* <cstdio> sin el .h

* main es int y como tal ha de tener su correspondiente return.

* contletras+1 no hace nada, sólo suma 1 a contletraspero no lo almacena en el mismo.

Esto último hace que la flauta haya sonado ya que *buffer siempre apuntará al primer caracter de la cadena buffer y como contletras siempre es cero, ya que no se incrementa, pues da la casualidad de que siempre apuntará al último caracter introducido y el código aparenta funcionar bien.

Pero supongamos que te has dado cuenta y que corriges la expresión contletras+1  por la correcta de contletras++, ¡horror!, ahora sólo sale el primer caracter que escribes, intentas meter leosansan y en pantalla sólo aparece lllllllllll. Curioso que al corregir un error nos demos cuenta del otro error, el de que el return ahora si funciona y como el contador se incrementa el return devuelve lo que tiene que devolver: el primer caracter.

Don´t worry, be happy!, eso se resuelve haciendo que el return de la función emite devuelva justo el último caracter.

Y para hacerlo bien, lo primero es colocar contletras++ donde debe ir: al comienzo dela función e inicializandolo a -1, porque si lo dejas donde está el return devolvería un valor más allá de donde has llegado a llenar el array bufletras y eso no estaría bien, no no.

Ahora funciona O.K:

Código (cpp) [Seleccionar]
#include<conio.h>
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

char bufletras[25];
int contletras=-1;
int num, lon;

char emite(int numero){
 contletras++;
 bufletras[contletras]=numero;
 return bufletras[contletras];
}
int main(){

cout<<"Escriba su nombre: "<<endl;
 do{
 num=getch();
if(num>='a' && num<='z')
     cout<<emite(num);
  else if(num>='A' && num<='Z')
    cout<<emite(num);
  else if(num==0x20)//space
   cout<<emite(num);
   else if(num==0x8)  //de la tecla backspace
     contletras--;
  }while(num!=13); //enter
  cout<< endl<<"Este es su nombre: "<<bufletras;
  return 0;
}


Creo que esto responde a tu otro tema del por qué sólo te imprime en pantalla el primer caracter que introduces pareciendo que getch no hace su función de vaciar su contenido en cada llamada a la misma.

De todas formas, y por si acaso, si la única finalidad de la función era pasar num a char bastaba con usar:


Código (cpp) [Seleccionar]
char emite(int numero){

  return numero;
}


EDITO: Y ya puestos te activo el backspace para eliminar un caracter introducido por error de la cadena final, que no de la pantalla ya que para ello tendría que hacer uso de gotoxy y no sé si es lo que quieres.:

Código (cpp) [Seleccionar]
else if(num==0x8) //de la tecla backspace
 contletras--;


Bueno por si acaso si lo quieras y suponiendo que tu conio.h tiene activada la opcion gotoxy, si no prueba con la conio2.h. Ahora corrige hasta lo que se ve en la pantalla:

Código (cpp) [Seleccionar]
else if(num==0x8) { //de la tecla backspace
 gotoxy(contletras+1,2);
 contletras--;
}


o su equivalente en windows.h:

Código (cpp) [Seleccionar]
.................
#include <windows.h>
........................
int gotoxy(int x, int y);
................................
   else if(num==0x8) { //de la tecla backspace
     gotoxy (contletras,1);
     contletras--;
   }
return 0;
}

int gotoxy(int x, int y)
{
  COORD coord;
  HANDLE h_stdout;
  coord.X = x;
  coord.Y = y;
  if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
     return 0;
  if (SetConsoleCursorPosition(h_stdout, coord) == 0)
     return 0;
  return 1;
}




¡¡¡¡ Saluditos! ..... !!!!