Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Preciso ayuda con 3 programas para un trabajo

Estas en el tema de Preciso ayuda con 3 programas para un trabajo en el foro de C/C++ en Foros del Web. Muy buenos días a todos, me encuentro en una situación un tanto complicada puesto que me han mandado unos ejercicios los cuales no se resolver, ...
  #1 (permalink)  
Antiguo 09/09/2009, 01:07
 
Fecha de Ingreso: septiembre-2009
Mensajes: 2
Antigüedad: 14 años, 7 meses
Puntos: 0
Preciso ayuda con 3 programas para un trabajo

Muy buenos días a todos, me encuentro en una situación un tanto complicada puesto que me han mandado unos ejercicios los cuales no se resolver, son para un trabajo que tengo que entregar y me gustaria si puede ser el caso que alguien me ayudase con ellos, uso Dev-C++ version 4.9.9.2 y mi sistema operativo es Windows XP, mi dire de hotmail es djjmata, dejo los enunciados aquí, muchisimas gracias por la colaboración de todos de antemano:

1. Desarrollar una función que devuelva como resultado la suma de los n primeros términos de la serie que se muestra a continuación. Dicha función aceptará como parámetro el número de términos a sumar.

n
S = Σ 1 / 2^i
i=1

double serie(unsigned n)
Codificar un programa que acepte por teclado un entero sin signo, lo transfiera como parámetro a la función anterior y muestre por pantalla el resultado devuelto por ésta.

2. Una tabla pitagórica puede representarse como una matriz cuadrada donde a cada elemento de la misma se asigna el producto de sus índices, teniendo en cuenta que los valores de los mismos para la casilla de la primera fila y la primera columna son (1, 1).
1 2 3 4 5 …
1 1 2 3 4 5 …
2 2 4 6 8 10 …
3 3 6 9 12 15 …
4 4 8 12 16 20 …
5 5 10 15 20 25 …
… … … … … … …

- Desarrollar una función que tenga como parámetro de entrada/salida una matriz de enteros sin signo que permita soportar la tabla y como parámetro de entrada el tamaño de la matriz. Se supone que este último no va a ser mayor que cien.

void creapita(unsigned pita[100][100], unsigned n);

- Codificar una función que la imprima la tabla pitagórica que se suministra como primer parámetro de entrada. El tamaño de la tabla se pasa a la función como segundo parámetro y se supone que no va a ser mayor que cien.

void imprimepita(unsigned pita[100][100], unsigned n);

- Escribir un programa principal que solicite mediante el teclado el tamaño de una tabla pitagórica y utilice la primera función de las dos anteriores para crear la tabla, y la segunda función para mostrarla por pantalla. En dicho programa se declarará un array de 100 x 100 enteros sin signo y se supone que el usuario no va a introducir un valor superior a cien como tamaño de la tabla.
Nota importante: El primer índice de un array en lenguaje C es el cero.

3. (Uno muy curioso) Se desea realizar un programa que permita a dos participantes jugar a “tres en raya”. Se pide desarrollar una función en lenguaje C que acepte una matriz cuadrada de orden 3x3 e indique la existencia de tres fichas en línea (horizontal, vertical o diagonal) por parte de cualquiera de los dos jugadores. Aquellas casillas del tablero donde haya una ficha del jugador A tendrán valor -1, las ocupadas por una ficha del jugador B valdrán 1 y, finalmente, las casillas vacías valdrán cero. Esta función es invocada por el programa principal tras cada movimiento de uno de los jugadores. La función devolverá el código que identifica al jugador ganador (1 ó -1) o cero (0) si no hay tres fichas en línea.
unsigned tresenraya(unsigned tabla[3][3]);
  #2 (permalink)  
Antiguo 09/09/2009, 07:21
 
Fecha de Ingreso: septiembre-2009
Ubicación: Burgos
Mensajes: 28
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Preciso ayuda con 3 programas para un trabajo

Si te planto el código sin más no vas a aprender nada de nada... Si al menos pusieses dónde te quedas, o qué es lo que no sabes... Porque no tienen mucha, mucha dificultad... ¿Los has intentado? ¿Qué errores te da? ¿Dónde te atascas?

Aun así te pongo el último.

Código c:
Ver original
  1. #include<stdio.h>
  2.  
  3. enum jugador{A=-1, B=1};
  4.  
  5. unsigned tresenraya(unsigned tabla[3][3], unsigned jug){
  6.     unsigned ganador = 0;
  7.     if(tabla[0][0] == jug){
  8.         if(tabla[1][0] == jug && tabla[2][0] == jug)
  9.             ganador = jug;
  10.         else
  11.             if(tabla[1][1] == jug && tabla[2][2] == jug)
  12.                 ganador = jug;
  13.             else
  14.                 if(tabla[0][1] == jug && tabla[0][2] == jug)
  15.                     ganador = jug;
  16.     }
  17.     if(tabla[1][1] == jug){
  18.         if(tabla[2][0] == jug && tabla[0][2] == jug)
  19.             ganador = jug;
  20.         else
  21.             if(tabla[0][1] == jug && tabla[2][1] == jug)
  22.                 ganador = jug;
  23.             else
  24.                 if(tabla[1][0] == jug && tabla[1][2] == jug)
  25.                     ganador = jug;
  26.     }
  27.     if(tabla[2][2] == jug){
  28.         if(tabla[2][1] == jug && tabla[2][0] == jug)
  29.             ganador = jug;
  30.         else
  31.             if(tabla[1][2] == jug && tabla[0][2] == jug)
  32.                 ganador = jug;
  33.     }
  34.     return ganador;
  35. }
  36.  
  37. void validaJugada(unsigned tabla[3][3], unsigned jugador){
  38.     char c;
  39.     unsigned fil, col;
  40.     if(jugador == A)
  41.         c = 'A';
  42.     else
  43.         c = 'B';
  44.     printf("\nJugador %c introduzca su jugada (fila<espacio>columna): ", c);
  45.     scanf("%u", &fil);
  46.     scanf("%u", &col);
  47.     fflush(stdin);
  48.     -- fil;
  49.     -- col;
  50.     if(tabla[fil][col] != 0)
  51.             fil = 3;
  52.     while(fil<0 || fil>2 || col<0 || col>2){
  53.         printf("\nERROR: Jugada incorrecta. Intentelo de nuevo jugador %c: ", c);
  54.         scanf("%u", &fil);
  55.         scanf("%u", &col);
  56.         fflush(stdin);
  57.         -- fil;
  58.         -- col;
  59.         if(tabla[fil][col] != 0)
  60.             fil = 3;
  61.     }
  62.     tabla[fil][col] = jugador;
  63. }
  64.  
  65. void imprimeTablero(unsigned tabla[3][3]){
  66.     unsigned i, j;
  67.     printf("\n\n  TABLERO DE JUEGO:\n");
  68.     printf("  1 2 3\n");
  69.     for(i=0; i<3; ++i){
  70.         printf("%u ", i+1);
  71.         for(j=0; j<3; ++j)
  72.             if(tabla[i][j] == 1)
  73.                 printf("O ");
  74.             else
  75.                 if(tabla[i][j] == -1)
  76.                     printf("X ");
  77.                 else
  78.                     printf("  ");
  79.         printf("\n");
  80.     }
  81. }
  82.  
  83. int main(){
  84.     unsigned fil, col, jugador, tabla [3][3], i=1;
  85.     char c;
  86.    
  87.     for(fil=0; fil<3; ++fil)
  88.         for(col=0; col<3; ++col)
  89.             tabla[fil][col] = 0;
  90.    
  91.     do{
  92.         jugador = A;
  93.         imprimeTablero(tabla);
  94.         validaJugada(tabla, jugador);
  95.         if(tresenraya(tabla, jugador) == 0){
  96.             if(i<5){
  97.                 jugador = B;
  98.                 imprimeTablero(tabla);
  99.                 validaJugada(tabla, jugador);
  100.             }
  101.             else
  102.                 i = 9;
  103.         }
  104.         ++i;
  105.     }while(tresenraya(tabla, jugador) == 0 && i<6);
  106.    
  107.     imprimeTablero(tabla);
  108.    
  109.     if(i == 10)
  110.         printf("\n\nEmpate, no hay mas movimientos posibles.");
  111.     else
  112.         if(jugador == A)
  113.             printf("\n\nEnhorabuena jugador A, has ganado.");
  114.         else
  115.             printf("\n\nEnhorabuena jugador B, has ganado.");
  116.            
  117.     printf("\n\nPulse <enter> para finalizar...\n");
  118.     c = getchar();
  119.     while(c!='\n'){
  120.         c = getchar();
  121.     }      
  122.     return 0;
  123. }

En el enunciado no ponía nada así que he supuesto el tres en raya básico, en el que no se pueden mover fichas, si sí se pueden mover bastaría con cuando cada uno haya puesto sus tres fichas (3 iteraciones de bucle) crear otro bucle en el que al usuario se le pida primeramente qué ficha desea desplazar (se compruebe si es suya o no) y a qué posición desea desplazarla (y se compruebe si está ocupada o no). Una tontería vamos.

El enunciado no pide ni las funciones validaJugada( ), ni imprimeTablero( ), si las quitas, el rendimiento será mucho mayor y te evitarás muchísimas líneas, disminuyendo hasta el main( ), pero claro, tendrás que ser "adivino" para ver cómo va el juego cuando juegues y pasar de todo si te meten entradas no válidas.

Puestos a validar habría que validar que metiesen carácteres en vez de números, pero bueno, no tengo ganas... xD.

He añadido un parámetro a tresenraya( ) para que no tenga que preguntar cada vez si es 1 o si es -1, sólo debería preguntar si es el último jugador que introdujo la ficha. Si A acaba de meter ficha, ya sabemos que B no ha ganado, lo acabamos de comprobar antes y no ha metido ninguna ficha, qué tontería... Si no te gusta pues le quitas el parámetro y preguntas por ambos.

Estoy totalmente abierto a discusión en cuanto al rendimiento de tresenraya( ), se podría haber metido un booleano "Ganador" para no hacer más preguntas una vez que sabes que hay ganador, pero como dicha situación se va a dar una única vez, no merece la pena meter una pregunta más por cada vez que la llamemos... Hombre, lo que sí está claro es que podríamos haber metido "breaks" a mansalva y la mejora sería increíble, pero soy partidario del C estructurado.

Última edición por JuanLVBR; 09/09/2009 a las 07:32
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:04.