elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Matriz con puntos de silla (lenguaje C)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Matriz con puntos de silla (lenguaje C)  (Leído 14,029 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Matriz con puntos de silla (lenguaje C)
« en: 12 Agosto 2014, 19:54 pm »

Hola gente.
Tengo un error con la validación de datos en este programa y por más que práctico no logro dar con la tecla.-
Debo reconocer que puedo estar cometiendo un error que ya debería resolver por mi mismo pero me pase 2 días de 8 horas cada uno para hacer que funcionara la matriz de punto de silla y cuando lo logré (bueno creo que lo logré porque lo corrí más de 50 veces y nunca me sale la tabla con la coincidencia) me aparece este error que deseo que me ayuden a resolver porque quiero dejar perfectamente establecida la forma correcta de utilizar fgets.-

Código
  1. /*
  2. Se dice que una matriz tiene un punto de silla si alguna posición de la matriz
  3. es el menor valor de su fila, y a la vez el mayor de su columna.-
  4. */
  5.  
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<string.h>
  9. #include<time.h>  
  10. #include <ctype.h>
  11.  
  12. #define MAX_VECTOR 2
  13. #define MAX_F_C 10
  14.  
  15.  
  16. void verificaFil(int *intFil);
  17. void verificaCol(int *intFil);
  18. void ingreso(int matriz[], int intFil, int intCol);
  19. void puntoDeSilla(int matriz[], int intFil, int intCol);
  20.  
  21.  
  22. int main(void){
  23. int intFil=0, intCol=0, *matriz=NULL;
  24.  
  25. printf("\n\n ===== El programa le mostrara los puntos de silla (si los hay) =====\n\n");
  26. verificaFil(&intFil);
  27. verificaCol(&intCol);
  28. matriz = malloc(intFil * intCol * sizeof(int));
  29.  
  30. ingreso(matriz, intFil, intCol);
  31.  
  32. puntoDeSilla(matriz, intFil, intCol);
  33.  
  34. free(matriz);
  35. printf("\n\n");
  36. return 0;
  37. }
  38.  
  39. void verificaFil(int *intFil){
  40. char charFil[MAX_F_C+1]={'\0'}, *p=NULL;
  41. unsigned int ch=0, i=0, ok=0;
  42.  
  43. do{
  44. printf(" Ingrese un entero para establecer la cantidad de filas (m%cximo %d)......:", 160,MAX_F_C);
  45. fgets(charFil,  MAX_F_C, stdin);
  46.  
  47. if((p=strchr(charFil, '\n'))!=0){
  48. *p='\0';
  49. }
  50. else{
  51. while((ch = getchar()) !='\n' && ch!=EOF);
  52. }
  53.  
  54. ok=0;
  55. for(; charFil[i]; i++){
  56. if(!isdigit(charFil[i])){
  57. ok++;
  58. }
  59. }
  60. if(ok==0){
  61. *intFil = atoi(charFil);
  62. (*intFil == 0 || *intFil > MAX_F_C) ? ok=1 : ok;
  63. }
  64. }while(ok !=0);
  65. }
  66.  
  67. void verificaCol(int *intCol){
  68. char charCol[MAX_F_C+1]={'\0'}, *p=NULL;
  69. unsigned int ch=0, i=0, ok=0;
  70.  
  71. printf("\n");
  72. do{
  73. printf(" Ingrese un entero para establecer la cantidad de columnas (m%cximo %d)...:", 160,MAX_F_C);
  74. fgets(charCol,  MAX_F_C, stdin);
  75.  
  76. if((p=strchr(charCol, '\n'))!=0){
  77. *p='\0';
  78. }
  79. else{
  80. while((ch = getchar()) !='\n' && ch!=EOF);
  81. }
  82.  
  83. ok=0;
  84. for(; charCol[i]; i++){
  85. if(!isdigit(charCol[i])){
  86. ok++;
  87. }
  88. }
  89.  
  90. if(ok==0){
  91. *intCol = atoi(charCol);
  92. (*intCol == 0 || *intCol > MAX_F_C) ? ok=1 : ok;
  93. }
  94. }while(ok !=0);
  95. }
  96.  
  97. void ingreso(int matriz[], int intFil, int intCol){
  98. unsigned int hora = time(NULL), i=0, j=0, indice=0;
  99. srand(hora);  
  100.  
  101. for(; i < intFil; i++){
  102. for(j=0; j < intCol; j++){
  103. indice = i * intCol + j;
  104. matriz[indice] = rand ()% 100;
  105. }
  106. }
  107.  
  108. printf("\n");
  109. for(i=0; i<intFil; i++){
  110. for(j=0; j<intCol; j++){
  111. indice = i * intCol + j;
  112. printf(" %3d", matriz[indice]);
  113. }
  114. if(j%intCol==0) printf("\n");
  115. }
  116.  
  117. }
  118.  
  119. void puntoDeSilla(int matriz[], int intFil, int intCol){
  120. int i, j, elMenor=0, colMen=0, indice=0, noPds;
  121.  
  122. for(i = 0; i < intFil; i++){
  123. noPds = 0;
  124. indice = intCol * i;
  125. elMenor=matriz[indice];
  126. colMen =  indice-(intCol*i);
  127.  
  128. for(j=0; j < intCol; j++){
  129. if(matriz[indice] < elMenor){
  130. elMenor = matriz[indice];
  131. colMen =  indice-(intCol*i);
  132. }
  133. indice++;
  134. }
  135.  
  136. for(j=0; j < intFil; j++){
  137. indice = j * intCol + colMen;
  138. if(matriz[indice] > elMenor){
  139. noPds++;
  140. }
  141. }
  142. if(noPds == 0)
  143. printf("\n en la fila %d columna %d hay punto de silla", i, colMen);
  144. }
  145. }

  Uno de los ingresos incorrectos:
  Ingreso…: -4 (incorrecto)
  Ingreso…: aa (incorrecto)
  Ingreso…: 11 (incorrecto)
  Ingreso…: -4 (correcto)

Bueno espero que me puedan ayudar y no vacilen en cambiar todo lo que deseen cambiar de mi código, es así como puedo aprender cosas que no están en los manuales.- 
   
Saludos y un gran abrazo
Daniel.


En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Matriz con puntos de silla (lenguaje C)
« Respuesta #1 en: 12 Agosto 2014, 20:31 pm »

  Uno de los ingresos incorrectos:
  Ingreso…: -4 (incorrecto)
  Ingreso…: aa (incorrecto)
  Ingreso…: 11 (incorrecto)
  Ingreso…: -4 (correcto)

En las funciones tanto VerificaCol() y VerificaFil() la variable i la debes inicializar a cero dentro del for:

Código
  1. for(i = 0; charCol[i]; i++)
  2.  if (!isdigit(charCol[i]))
  3.    ok++;

Saludos


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Matriz con puntos de silla (lenguaje C)
« Respuesta #2 en: 12 Agosto 2014, 21:05 pm »

.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Matriz con puntos de silla (lenguaje C)
« Respuesta #3 en: 12 Agosto 2014, 21:06 pm »

Hola Blaster.
Muchas gracias ahora funciona correctamente, yo inicializaba la variable i en 0 fuera del bucle sólo que funcionaba si el primer ingreso era correcto pero de no ser así valía cada vez más.-
Una cosa que descubrí es que haciendo una tabla de 1 fila y x columnas el programa funciona correctamente.-
Sólo me resta que alguien me diga que parte del código haría de otra manera, por lo menos para aprender algo más de los expertos.-       

Saludos.
Daniel
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Matriz con puntos de silla (lenguaje C)
« Respuesta #4 en: 12 Agosto 2014, 21:45 pm »

Hola gente.
Tengo un error con la validación de datos en este programa y por más que práctico no logro dar con la tecla.-
Debo reconocer que puedo estar cometiendo un error que ya debería resolver por mi mismo pero me pase 2 días de 8 horas cada uno para hacer que funcionara la matriz de punto de silla y cuando lo logré (bueno creo que lo logré porque lo corrí más de 50 veces y nunca me sale la tabla con la coincidencia) me aparece este error que deseo que me ayuden a resolver porque quiero dejar perfectamente establecida la forma correcta de utilizar fgets.-
..........................................

Bienvenido otra vez amigo Daniel.

El código funciona perfecto pero pretender que de forma aleatoria te salga un punto de silla es mucho pedir.  :o

Te aconsejo introducir a mano una matriz que sepas que tiene punto de silla y así compruebas que el código funciona O.K.

Cambia a:

Código
  1. void ingreso(int matriz[], int intFil, int intCol){
  2. unsigned int hora = time(NULL), i=0, j=0, indice=0;
  3. srand(hora);
  4.  
  5. for(; i < intFil; i++){
  6. for(j=0; j < intCol; j++){
  7. indice = i * intCol + j;
  8. printf("Introduzca la posicion %d, %d: ", i+1, j+1);
  9. scanf ("%d",&matriz[indice]);
  10. //matriz[indice] = rand ()% 100;
  11. }
  12. }
  13. printf("\n");
  14. for(i=0; i<intFil; i++){
  15. for(j=0; j<intCol; j++){
  16. indice = i * intCol + j;
  17. printf(" %3d", matriz[indice]);
  18. }
  19. if(j%intCol==0) printf("\n");
  20. }
  21. }

e introduce como ejemplo de matriz con punto de silla:

Código
  1.    1       2       3
  2.    2       3       4
  3.    1       5       2

Y de paso cambia, para que el resultado sea más chachi en la función puntoDeSilla:

Código
  1. printf("\n en la fila %d columna %d hay punto de silla", i+1, colMen+1);

Veras como sí que detecta el punto de silla en la fila 2 y columna 1, con los cambios que te he mencionado, claro.  ;)

Lo dicho, un fuerte saludo Daniel de tu amigo León.

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




Sorry!, ya han contestado mientras escribía esto.
« Última modificación: 12 Agosto 2014, 21:47 pm por leosansan » En línea

kutcher

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: Matriz con puntos de silla (lenguaje C)
« Respuesta #5 en: 12 Agosto 2014, 22:23 pm »

Para ser un punto de silla debe cumplir una de estas dos condiciones:

1) Dentro de la fila son mínimos y dentro de la columna son máximos
2) Dentro de la fila son máximos y dentro de la columna son mínimos

En tu función solo verificas el primer punto si al generarse una matriz con estos elementos:

Código
  1. 2, 5, 12,
  2. 3, 2, 25,
  3. 8, 1, 20

Donde en la fila 0 y columna 2 existe un punto de silla, el cual el programa no procesa

« Última modificación: 12 Agosto 2014, 22:26 pm por kutcher » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Matriz con puntos de silla (lenguaje C)
« Respuesta #6 en: 13 Agosto 2014, 00:09 am »

Para ser un punto de silla debe cumplir una de estas dos condiciones:

1) Dentro de la fila son mínimos y dentro de la columna son máximos
2) Dentro de la fila son máximos y dentro de la columna son mínimos


Me debo estar quedando obsoleto, ¡los años no pasan en balde!.

Yo me quedé en la definición primera como punto de silla , para nada la segunda. Sniff!!!!!...¿o tal vez esté en lo cierto?.  :silbar:

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


« Última modificación: 13 Agosto 2014, 00:11 am por leosansan » En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Matriz con puntos de silla (lenguaje C)
« Respuesta #7 en: 13 Agosto 2014, 03:41 am »

Hola Leo.
Amigo, muchas gracias por estar siempre allí con tus aportes, lo que propones de ingresar los datos a mano es lo correcto simplemente me resultaba tedioso luego de estar 2 días con lo mismo.-
Kutcher, gracias por responder, el siguiente es el enunciado del manual con el cual estoy estudiando, por eso lo hice de esa manera, pero me suena que mientras buscaba información en internet, en algunos sitios dice algo como eso, desconozco todavía si es válido de las dos maneras.-     



Saludos.
Daniel
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Matriz con puntos de silla (lenguaje C)
« Respuesta #8 en: 13 Agosto 2014, 14:01 pm »

Yo diría que la definición de Kutcher es la real. Pero si ese ejercicio te lo manda un profesor o algo así, pregúntale a él.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Matriz con puntos de silla (lenguaje C)
« Respuesta #9 en: 13 Agosto 2014, 16:29 pm »

Hola Ivance96.
Gracias por tu aporte, no tengo a quien consultar, tengo 62 años y soy un autodidacta que aprende y mucho gracias a Uds.
Por lo que pude consultar hasta el momento adhiero a lo que decis.-

Saludos.
Daniel
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Mala impresión en matriz de puntos.
Programación Visual Basic
Impersecuto 1 1,791 Último mensaje 10 Mayo 2007, 17:40 pm
por CeLaYa
Impresora de Matriz de Puntos y JasperReport (Java)
Java
softdonet 2 8,172 Último mensaje 12 Noviembre 2011, 16:49 pm
por softdonet
Cambio de silla
Foro Libre
kaiserr 0 1,505 Último mensaje 24 Agosto 2012, 04:07 am
por kaiserr
Explicación de un ejercicio de matriz unidad en lenguaje Java.
Java
proview 2 2,697 Último mensaje 4 Marzo 2013, 00:00 am
por proview
punto silla de una matriz
Programación C/C++
criser20 5 8,756 Último mensaje 5 Abril 2014, 22:26 pm
por leosansan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines