| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Iced_R
Registrado: 29 Jun 2006 Mensajes: 11
| Publicado: 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 ).
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 . |
| | Volver arriba | |  | digies
Registrado: 18 Nov 2005 Mensajes: 377 Ubicación: Cono Sur
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 26/11/2007 1:32 pm | | | Título: |
| muchisimoas gracias chicos por sus aportes, ahora a lo mio  |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |