Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: MessageBoxA en 10 Julio 2014, 23:27 PM

Título: problema con array de punteros a cadenas
Publicado por: MessageBoxA en 10 Julio 2014, 23:27 PM
tengo el problema con esta linea
char *paises_miembros[] = {"Argentina","Belgica","Estados Unidos","Francia","Reino Unido",
"Grecia","Hungria","Italia","Nueva Zelanda","Rusia","Suecia","Japon"};

y es que el compilador me da un error


9 77 C:\Users\Nerys\Desktop\main.cpp [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
Título: Re: problema con array de punteros a cadenas
Publicado por: eferion en 10 Julio 2014, 23:33 PM
el array así declarado apunta a cadenas que se encuentran en una zona de la memoria que es de solo lectura... te está diciendo que tienes que poner el modificador const a paises_miembros.

const char *paises_miembros[] = {"Argentina","Belgica","Estados Unidos","Francia","Reino Unido",
"Grecia","Hungria","Italia","Nueva Zelanda","Rusia","Suecia","Japon"};

Título: Re: problema con array de punteros a cadenas
Publicado por: MessageBoxA en 11 Julio 2014, 08:11 AM
entiendo ya hice la modificacion pero tengo otro problema y no hayo la solucion y es que cuando llamo a la funcion mayor_menor el programa se me congela, dejo lo que llevo hecho

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

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

const char *paises_miembros[] = {"Argentina","Belgica","Estados Unidos","Francia","Reino Unido",
"Grecia","Hungria","Italia","Nueva Zelanda","Rusia","Suecia","Japon"};

const char *paises_postulados[] = {"Japon","Brasil","Suecia","Mexico"};

int contador=0;

void mayor_menor(int array[]);

int main() {



int votos[]={0,0,0,0};

printf("BIENVENIDO AL SISTEMA DE VOTACION PARA LA ELECCION DE LA SEDE DE LOS JUEGOS OLIMPICOS\n");

printf("\npara iniciar las votaciones presiones cualquier tecla...");

getch();


printf("\n\nlos paises miembros del comite son los siguientes: ");



for(contador=0;contador<12;contador++)
{
printf(" %s ",paises_miembros[contador]);
}

getch();

printf("\n\nlos paises postulados son los siguientes: ");

for(contador=0;contador<4;contador++)
{
printf(" %s ",paises_postulados[contador]);
}

getch();


printf("\n\n \t\t\t INICIA PROCESO DE VOTACION");

getch();
contador=0;
int opcion=0;

while(contador<10)
{
opcion=0;
printf("\n\n %s cual de las siguientes opciones elige para que sea la sede de los proximos juegos olimpicos?",paises_miembros[contador]);
printf ("\n\n 1.%s 2.%s 3.%s 4.%s",paises_postulados[0],paises_postulados[1],paises_postulados[2],paises_postulados[3]);
printf("\n elija una opcion del 1 al 4: ");
scanf("%d",&opcion);
if(opcion>0 && opcion<5)
{
votos[opcion-1]=votos[opcion-1]+1;
contador++;
}
else
{
printf("\n\nOPCION INVALIDA!!!");
}

}

  mayor_menor(votos);
 
return 0;
}


void mayor_menor(int array[])
{

  int  mayor,menor,*posicion1=0, *posicion2=0;

mayor=votos[0];

for(contador=1;contador<4;contador++)
{
if (votos[contador]>mayor)
{
mayor=votos[contador];
*posicion1=contador;
}
}

menor=votos[0];

for(contador=1;contador<4;contador++)
{
if (votos[contador]<menor)
{
menor=votos[contador];
*posicion2=contador;
}
}  
  printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[*posicion1], mayor);
 
 
      printf("\n\nEL PAIS CON MENOS VOTOS ES %s con %d votos",paises_postulados[*posicion2],menor);

}
Título: Re: problema con array de punteros a cadenas
Publicado por: CalgaryCorpus en 11 Julio 2014, 13:49 PM
Quitale el * a las variables posicion1 y posicion2. Las usas como indices, asi que son enteros, no punteros.
Título: Re: problema con array de punteros a cadenas
Publicado por: leosansan en 11 Julio 2014, 15:31 PM
Antes que nada debes cambiar la función mayor_menor a algo como esto:

Código (cpp) [Seleccionar]
void mayor_menor(int votos[])

ya que haces uso del array votos en ella.

Y el array votos lo puedes inicializar de forma más simple:

Código (cpp) [Seleccionar]
int votos[10]={0};

Si quieres usar punteros, por lo que sea, en lugar de :

Código (cpp) [Seleccionar]
*posicion1=contador;

deberías hacer:

Código (cpp) [Seleccionar]
posicion1 = &mayor_;

Pero ello se traduce en un error lógico y es que el puntero posicion1 apuntaría siempre a contador, con lo que su valor sería siempre 4.

En su lugar habría que usar unas nuevas variables donde guardar el mayor valor de contador y hacer que el puntero apunte a esa variable. Y lo mismo con la posicion2.

Algo como, y aprovecha el for para calcular tanto el mayor como el menor, en lugar de dos for:

Código (cpp) [Seleccionar]

****************************************
  int mayor_= 0, menor_= 0;
  mayor = votos[0];
  menor = votos[0];
  posicion1 = &mayor_, posicion2 = &menor_;
  for( contador = 1 ; contador < 4 ; contador++ ){
    if ( votos[contador] > mayor){
mayor_= contador ;
mayor = votos[mayor_];
posicion1 = &mayor_;
    }
    else{
menor_= contador ;
menor = votos[menor_];
posicion2 = &menor_;
    }
}
***************************


Pero doctores tiene el foro en punteros y yo no soy uno de ellos, así que es muy posible que lo que propongo sea mejorable.

En cualquier caso la propuesta de CalgaryCorpus es la más razonable, sólo pongo lo anterior si es que sí o sí debes  usar punteros.

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Título: Re: problema con array de punteros a cadenas
Publicado por: CalgaryCorpus en 11 Julio 2014, 16:30 PM
Es superfluo asignar los punteros en cada vuelta.
Si se eliminan esas asignaciones el resultado será el mismo.
Título: Re: problema con array de punteros a cadenas
Publicado por: MessageBoxA en 11 Julio 2014, 16:38 PM
ok me quedo mejor con la segunda sugerencia. ahora como para imprimir el pais que esta en la posicion del mayor y menor??

e intentado de varias formas pero nada

Código (cpp) [Seleccionar]
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[(int)posicion1], mayor);
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[posicion1], mayor);
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[*posicion1], mayor);





Cita de: CalgaryCorpus en 11 Julio 2014, 16:30 PM
Es superfluo asignar los punteros en cada vuelta.
Si se eliminan esas asignaciones el resultado será el mismo.


si eso lo acabo de notar, donde me dices que quite los asteriscos? en la declaracion o en la asignacion dentro del for??
Título: Re: problema con array de punteros a cadenas
Publicado por: leosansan en 11 Julio 2014, 16:43 PM
Cita de: CalgaryCorpus en 11 Julio 2014, 16:30 PM
Es superfluo asignar los punteros en cada vuelta.
Si se eliminan esas asignaciones el resultado será el mismo.


Ya, estoy "totalmente" de acuerdo contigo. Sólo era una opción por si "sí o sí" tenía que usar punteros. No sé, a lo mejor era una tarea en la que obligaban a hacer uso de los mismos.

Si no es así es una redundancia su uso y tu propuesta es más que suficiente.

Cita de: MessageBoxA en 11 Julio 2014, 16:38 PM
ok me quedo mejor con la segunda sugerencia. ahora como para imprimir el pais que esta en la posicion del mayor y menor??

e intentado de varias formas pero nada

Código (cpp) [Seleccionar]
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[(int)posicion1], mayor);
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[posicion1], mayor);
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[*posicion1], mayor);


Sería:

Código (cpp) [Seleccionar]
printf("\n\nEL PAIS GANADOR ES %s con %d votos",paises_postulados[*posicion1], mayor);
  printf("\n\nEL PAIS CON MENOS VOTOS ES %s con %d votos",paises_postulados[*posicion2],menor);


Cita de: MessageBoxA en 11 Julio 2014, 16:40 PM
si eso lo acabo de notar, donde me dices que quite los asteriscos? en la declaracion o en la asignacion dentro del for??

En ese caso de todos los lados.


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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

Título: Re: problema con array de punteros a cadenas
Publicado por: MessageBoxA en 11 Julio 2014, 16:56 PM
agradecido por su colaboracion, ahora piensen en eso... creo que en el segundo for para evaluar el menor tiene un error y es que de manera premeditada asigne votacion de la siguiente manera. japon =7  brazil=2 suecia=1 mexico=0
y me sale bien el del mayor pero en el menor me imprime que el de menor votos es suecia con 1 voto cuando en realidad es mexico
Título: Re: problema con array de punteros a cadenas
Publicado por: leosansan en 11 Julio 2014, 18:13 PM
Cita de: MessageBoxA en 11 Julio 2014, 16:56 PM
............................................
y es que de manera premeditada asigne votacion de la siguiente manera. japon =7  brazil=2 suecia=1 mexico=0
y me sale bien el del mayor pero en el menor me imprime que el de menor votos es suecia con 1 voto cuando en realidad es mexico

Pues a mi con:

Código (cpp) [Seleccionar]
for( contador = 1 ; contador < 4 ; contador++ ){
   if ( votos[contador] > mayor){
     mayor=votos[contador];
    posicion1=contador;
   }
  if ( votos[contador] < menor){
     menor=votos[contador];
     posicion2=contador;
   }
}


me da una solución correcta:

Código (cpp) [Seleccionar]

votos[0]=7
votos[1]=2
votos[2]=1
votos[3]=0

EL PAIS GANADOR ES Japon con 7 votos

EL PAIS CON MENOS VOTOS ES Mexico con 0 votos


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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

EDITADO: Con la perspicaz observación de CalgaryCorpus. ;)
Título: Re: problema con array de punteros a cadenas
Publicado por: CalgaryCorpus en 11 Julio 2014, 18:30 PM
Me debo haber expresado mal: No solo digo que el problema se puede resolver sin usar punteros, y veo que estas de acuerdo, sino que en el codigo propuesto previamente (que repito a continuacion) ...

Código (cpp) [Seleccionar]
 int mayor_= 0, menor_= 0;
 mayor = votos[0];
 menor = votos[0];
 posicion1 = &mayor_, posicion2 = &menor_;
 for( contador = 1 ; contador < 4 ; contador++ ){
   if ( votos[contador] > mayor){
mayor_= contador ;
mayor = votos[mayor_];
posicion1 = &mayor_;
   }
   else{
menor_= contador ;
menor = votos[menor_];
posicion2 = &menor_;
   }
}


La linea 9 y la linea 14 son una repetición de la linea 4. Esas 2 lineas son superfluas. Osea, si decides usar punteros, asignarlos 1 vez (en este caso) sería suficiente.
Título: Re: problema con array de punteros a cadenas
Publicado por: leosansan en 11 Julio 2014, 18:50 PM
Cita de: CalgaryCorpus en 11 Julio 2014, 18:30 PM
Me debo haber expresado ma.l.....................
La linea 9 y la linea 14 son una repetición de la linea 4. Esas 2 lineas son superfluas. Osea, si decides usar punteros, asignarlos 1 vez (en este caso) sería suficiente.


Sorry!, eso pasa por querer aprovechar el código previo.

Efectivamente, están de más (para el caso de  usar punteros):

Código (cpp) [Seleccionar]
int  mayor = 0 , menor = 0 , *posicion1 , *posicion2 ;
 mayor = votos[0];
 menor = votos[0];
 posicion1 = &mayor_, posicion2 = &menor_;
for( contador = 1 ; contador < 4 ; contador++ ){
 if ( votos[contador] > mayor){
   mayor_= contador ;
   mayor = votos[mayor_];
}
 else if ( votos[contador] < menor){
   menor_= contador ;
   menor = votos[menor_];
 }
}


Y gracias por la observación!!!!!, sólo espero no haberla pifiado esta vez.  ;)

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


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

EDITADO: Con la perspicaz observación de CalgaryCorpus. ;)
Título: Re: problema con array de punteros a cadenas
Publicado por: CalgaryCorpus en 11 Julio 2014, 21:39 PM
Creo que el codigo ofrecido tiene un error adicional al hacer una suposición incorrecta. La suposición es esta:
 
No ser mayor que el máximo actual convierte a un numero en el menor del conjunto.

Si los nros fueran { 0, 2, 1, 7 }

La logica del código anterior se seguiría así:

Ademas, el codigo mantiene variables que pueden ser eliminadas.
Lo único necesario, creo yo, es mantener los indices del mayor o menor.

Propongo estas correcciones, imayor e imenor son los indices de los valores mayor y menor. No es necesario guardar el valor mayor o menor, porque eso se obtiene usando el arreglo que se recibe como parametro y esos índices.

#include <stdio.h>

void mayor_menor( int votos[] )
{
   int imayor = 0, imenor = 0;
   int contador = 0;

   for( contador = 1 ; contador < 4 ; contador++ ) {
       if ( votos[contador] > votos[imayor]) {
           imayor = contador ;
       }
       else
       if ( votos[contador] < votos[imenor]) {
           imenor = contador;
       }
   }

   printf( "Valor mayor: %d\n", votos[imayor] );
   printf( "Valor menor: %d\n", votos[imenor] );
}

int main() {
   int votos[] = { 0, 2, 1, 7 };

   mayor_menor( votos );
}


Esto se puede ver en ejecución es este link: http://goo.gl/24qbNK