/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Pequeña consulta.

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Iced_R



Registrado: 29 Jun 2006
Mensajes: 11

MensajePublicado: 24/11/2007 6:15 pm
Título: Pequeña consulta.

Bueno, he estado todo el dia trabajando en un programa y pues, ya estoy medio bloqueado, la cosa es sencilla(pero ya no doy mas para pensar Very Happy).

necesito ingresar elementos(numeros enteros) a una matriz de 3x3, pero validar que los numeros no se repitan, todo esto a base de punteros.

un abrazo y desde ya gracias por su atencion Very Happy.
Volver arriba
digies



Registrado: 18 Nov 2005
Mensajes: 377
Ubicación: Cono Sur

MensajePublicado: 25/11/2007 5:14 am
Título:

Hola

Sería conveniente que coloques el código hasta donde hiciste así te orientamos.

Un saludo
Volver arriba
Iced_R



Registrado: 29 Jun 2006
Mensajes: 11

MensajePublicado: 25/11/2007 7:52 am
Título:

oh, disculpas.

aqui esta el codigo.

Código:
/*relizar una matriz de 3x3 que el ususario llene,
y al final diga si acerto al cuadrado magico,
esto es que columnas sumen 15, filas sumen 15
y diagonales sumen 15, no se puede ingresar dos
veces un mismo numero, ni sobreescribir en una misma posicion.*/

#include<stdio.h>
#include<conio.h>

int llenar(int matriz[3][3], int i);
void mostrar(int matriz[3][3],int i,int j);
void suma_diagonales(int matriz[3][3], int i);
void suma(int matriz[3][3], int i);

void main()
{
clrscr();
int matriz[3][3]={NULL},i,j;
printf("ingrese valores a la matriz, solo pueden ser valores entre 1 y 9,\n y no deben repetirse los valores");
llenar(matriz,i);
mostrar(matriz,i,j);
suma_diagonales(matriz,i);
suma(matriz,i);
getch();
}

int llenar(int matriz[3][3], int i)
{
int *p;
p=matriz[0];
for(i=0;i<9;i++)
{
printf("\n ingrese valor en posicion[%d]: \n",i+1);
scanf("%d",p);
if(*p>9||*p<1)
{
printf("\n\n error, valor deberia ser entre 1 y 9");
break;
}
p++;
}
return(*p);
}

void mostrar(int matriz[3][3],int i,int j)
{
clrscr();
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("%d",matriz[i][j]);
}
}
getch();
}

void suma_diagonales(int matriz[3][3], int i)
{
int *p,s=0,ss=0;
p=matriz[0];
for(i=0;i<3;i++)
{
s=*p+s;
p=p+4;
}
p=matriz[0];
p=p+2;
for(i=0;i<3;i++)
{
ss=*p+ss;
p=p+2;
}
printf("\n\n el valor de la diagonal principal es: %d",s);
printf("\n\n el valor de la diagonal secundaria es: %d",ss);
}

void suma(int matriz[3][3], int i)
{
int j,s1=0,s2=0,s3=0,sc1=0,sc2=0,sc3=0,*p;
p=matriz[0];
for(i=0;i<3;i++)
{
s1=*p+s1;
p=p+1;
}
p=matriz[1];
for(i=0;i<3;i++)
{
s2=*p+s2;
p=p+1;
}
p=matriz[2];
for(i=0;i<3;i++)
{
s3=*p+s3;
p=p+1;
}
for(i=0;i<1;i++)
{
p=matriz[0];
p=p+i;
for(j=0;j<3;j++)
{
sc1=*p+sc1;
p=p+3;
}
}
for(i=1;i<2;i++)
{
p=matriz[0];
p=p+i;
for(j=0;j<3;j++)
{
sc2=*p+sc2;
p=p+3;
}
}
for(i=2;i<3;i++)
{
p=matriz[0];
p=p+i;
for(j=0;j<3;j++)
{
sc3=*p+sc3;
p=p+3;
}
}
printf("\n\n el valor de la primera fila es: %d",s1);
printf("\n\n el valor de la segunda fila es: %d",s2);
printf("\n\n el valor de la tercera fila es: %d",s3);
printf("\n\n el valor de la primera columna es: %d",sc1);
printf("\n\n el valor de la segunda columna es: %d",sc2);
printf("\n\n el valor de la tercera columna es: %d",sc3);
}


lo que me falta en si, es validar la entrada, que los numeros no se repitan.

algunas otras cosillas, pero eso lo hare ahora, si me reslta lo posteo ^^

un abrazo.


P.D.: se me olvidaba, estoy trabajando con el compilador turbo C++.
Volver arriba
david_celta



Registrado: 02 Jun 2005
Mensajes: 151

MensajePublicado: 25/11/2007 6:07 pm
Título:

Código:

int llenar(int matriz[3][3], int i);


Tienes que pasar la matriz por referencia para que se puedan guardar los datos al salir de la funcion (o al retornar de la funcion)

Código:

int matriz[3][3]={NULL},i,j;
printf("ingrese valores a la matriz, solo pueden ser valores entre 1 y 9,\n y no deben repetirse los valores");
llenar(matriz,i);


Eso esta en el main, el valor de i no existe puesto que lo declaras pero no le asignas ningun valor ¿que valor de i llega a la funcion?

Otra cosa (mas aparte) que veo es que si el usuario falla no le das opcion de que rectifique, deberias tener en cuenta eso (quiza con un else se arregle)
_________________
In all your fantasies,
you always knew
that man and mystery...

...were both in you...
Volver arriba
Iced_R



Registrado: 29 Jun 2006
Mensajes: 11

MensajePublicado: 25/11/2007 6:18 pm
Título:

emmm... mi código funciona

De todas maneras, gracias por la acotación... pero ya lo tenía visto y esta arreglado lo del usuario, ese es solo un esquema del programa ^^

ahora si me pudiesen ayudar en la validacion, lo agradeceria mas ^^.
Volver arriba
david_celta



Registrado: 02 Jun 2005
Mensajes: 151

MensajePublicado: 25/11/2007 6:44 pm
Título:

Perdon, creo que estoy con sueño, ignora la respuesta anterior que te di.

Bueno lo de la validacion podrias hacerlo despues que ingresas toda la matriz o mientras las vas ingresando (quiza la segunda sea mas eficiente)

Tienes que usar un puntero auxiliar que vaya junto al puntero que usas para ingresar los valores, por ejemplo un puntero q, una vez que ingresas un valor, el puntero q tendras que hacerlo retroceder para ir validando que el nuevo numero no se encuentre ya en el arreglo

Mas o menos algo asi se me ocurre hmmmm a ver (no se si funcione):

int *inicio=p;
int *q=p;
int no_repetido;

for(i=0;i<9;i++)
{
no_repetido=1;
printf("\n ingrese valor en posicion[%d]: \n",i+1);
scanf("%d",p);

if(*p>9||*p<1)
{
printf("\n\n error, valor deberia ser entre 1 y 9");
}

p++;

while(q!=inicio)
{
if(*p==*q)
no_repetido=0;//esta repetido

q--;
}

if(no_repetido)
q=p;//se puede continuar ingresando valores
else
//algo que indique al usuario que se ha repetido un valor
}


Bueno mas o menos algo asi es la idea
_________________
In all your fantasies,
you always knew
that man and mystery...

...were both in you...
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3837
Ubicación: Mexico

MensajePublicado: 26/11/2007 10:00 am
Título:

En este caso donde el rango de valores es pequeño (1 a 9) la forma mas sencilla y eficiente de verificar si un numero ya ha sido utilizado es mediante dos arrays:

* El primer array seria el principal, un array de arrays (la matriz de tres por tres) donde se trataria de generar el cuadrado magico.

* El otro array seria un array soporte de (por sencillez) dies elementos de tipo char, el primer elemento con indice cero no se utilizaria mientras que los restantes con indices 1 a 9 indicarian si el numero (1 a 9 respectivamente) ya esta en uso (mediante el valor 1) o no (mediante el valor 0).

Lo que debes hacer al inicio de tu programa es declarar los arrays e inicializar el array de soporte (de nombre por ejemplo "en_uso") con el valor cero para todos sus elementos indicando asi que todos estos (los numeros 1 a 9) no estan en uso.

En el bucle principal de tu programa pides los numeros al usuario (almacenando este por ejemplo en la variable "numero") y primero verificas si el valor de "en _uso[numero]" es cero mediante una sentencia de seleccion "if", por ejemplo:
Código:
if (!en_uso[numero]){

   /*
   ** Numero no utilizado proceso normal
   */
   
   /* Marcar el numero como "numero en uso" */
   en_uso[numero] = 1;
   
   /* ... etc ... */

}else {

   /* manejo de error: el numero ya esta siendo utilizado */

}


A grandes rasgos esa es la idea.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Iced_R



Registrado: 29 Jun 2006
Mensajes: 11

MensajePublicado: 26/11/2007 1:32 pm
Título:

muchisimoas gracias chicos por sus aportes, ahora a lo mio Very Happy
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com