Вы находитесь на странице: 1из 15

Cdigo C++

Blog Acerca Autor Contacto


Busca

Categoras: Artculos Blog Curso Prctica Programas Teora

Bienvenidos!
Cdigo C++ es un blog sobre programacin en C++. En l encontrars ejemplos, programas y toda clase de ayuda para tus tareas de programacin.

Recibe mis artculos


Va RSS Va email

o o

Para Novatos
Porqu programar en C++? Hola Mundo en C++ IDE recomendado, Code::Blocks

Problema comn
Tu progama corre pero al presionar enter se cierra sin mostrar los resultados?, slo agregacin.get();cin.get(); antes de la llave de cierre del main.

o o o

Posts Recientes
Diferencias entre C y C++ #define en C++, cmo s y cmo no Nuevo: Curso de C++ Code::Blocks, un IDE moderno para C++ Aprender ingls, en C++!?

Tags
while variables tringulos tipos de datos timestring.h signos seno

sencillos recursividadrecuadros rand punteros promedios primos porcentajespascal operadores medio mat rices math iostreaminfinito if else hanoi gotoxy goto funciones forfibonacci factorial dev
coseno c++ descargas conio.hcondiciones compiladores comentarios

cicloscadenas bsico burbuja borland binario ascii a

rreglos

o o

Comentarios
ra: Hola saludos. Tengo un problema con mi codeblock y el compilad[...] ra: // saludos, seriaalgo asi // esto suma empezando del 3 #include[...] Hctor: La suma de qu vectores? Puedes aclarar ms acerca del problema[...] THEbatzuk: Hola, muchas gracias por tu comentario. Siendo sincero, al tiempo[...]

Links tiles
C plus plus

o o

C++ Reference El rincon del C

Sitios Amigos
Ejemplos de Java

Archivo
septiembre 2011 agosto 2011 julio 2011 mayo 2011 abril 2011 febrero 2011 enero 2011 diciembre 2010 noviembre 2010 octubre 2010 septiembre 2010 agosto 2010 noviembre 2009 octubre 2009 septiembre 2009 agosto 2009

Posts guardados en "Programas":

Aprender ingls, en C++!?


Guardado en: Programas el 20 de mayo del 2011Etiquetas: matrices, rand

Me cont SetRoot a travs de un comentario que se le ocurri hacer un programa en C++ que nos ayudar a aprender palabras en ingls, en sus propias palabras:
Se me ocurrio hacer un programa para aprender ingles y creo que los tiros tambien van por 1 ahi llenar 1000 corrgeme: palabras

2 agruparlas por alguna relacion como emociones articulos y otros(para esto quisiera usar una matriz para acceder a ella mas facil aunque 2 matrices tambien creo q me van :s con punteros y eso ,s) 3 ejecucion: con un par de cases hacer un menu que me permita lanzar 20 palabras al azar(con sran o ran creo + time) con su significado y despues que me permita hacer un tipo de examen o test con esas mismas palabras desordenadas que cada acierto valga algo para ganar puntos y asi involucrar a los amigos y familiares

Me gust la idea de hacer un pequeo bosquejo de su idea porque precisamente se necesita usar el cdigo de mi ltimo post: Nmeros aleatorios sin repetir en C++. As que mi algoritmo es algo as: 1. Crear una matriz tipo string de N filas y 2 columnas, la primera columna son las palabras en ingls; la segunda, en espaol. 2. Pedir el nmero de palabras que el usuario quiera memorizar. 3. Obtener ese nmero de palabras aleatoriamente y mostrarlas. 4. Borrar las palabras y empezar a preguntar el significado de cada una. 5. Comparar la respuesta del usuario con la respuesta correcta. 6. Calcular su calificacin y mostrarla. El cdigo es este:
1 #include<cstdlib>

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

#include<ctime> #include<iostream> using namespace std; int nofw; #define N 8 // numero de pares de palabras en la matriz bool checkrep(int n, int num[]) { for(int i=0; i<nofw; i++) if(n == num[i]) return true; return false; } int main() { srand(time(NULL)); string ans, words[N][2] = {{"hi", "hola"}, {"house", "casa"}, {"water", "agua"}, {"roof", "techo"}, {"chair", "silla"}, {"loudspeaker", "bocina"}, {"screen", "pantalla"}, {"money", "dinero"}}; int n, correct=0, wrong=0; cout << "Numero de palabras?: "; cin >> nofw; // obtener 'nofw' palabras aleatoriamente de nuestra matriz int num[nofw]; for(int i=0; i<nofw; i++) { do n = rand() % N; while(checkrep(n, num)); num[i] = n; cout << words[n][0] << " -> " << words[n][1] << endl; } cin.get(); cin.get(); system("cls"); // preguntar el significado de cada palabra for(int i=0; i<nofw; i++) { cout << words[num[i]][0] << " = "; cin >> ans; if(ans == words[num[i]][1]) { correct++; cout << ">> Bien :)\n\n"; } else { wrong++; cout << ">> Mal :(\n\n"; } } cout << "Tuviste un " << (float)correct / (float)nofw * 100 << "% de respuestas correctas."; cin.get(); cin.get(); }

Como dije antes, es slo un bosquejo, pero tal vez sea el punto de partida para un buen proyecto. Para optimizarlo creo que se deberan agregar algunas cosas:

Obtener los pares de palabras desde una base de datos Ordenarlas por categoras

Que no importe si la respuesta est en maysculas o minsculas Mejorar la interaccin con el usuario
15 Comentarios

Nmeros aleatorios sin repetir en C++


Guardado en: Programas el 1 de abril del 2011Etiquetas: bool, rand, while

Ya hemos visto cmo obtener nmero aleatorios en c++, pero tarde o temprano surge la necesidad degenerar nmeros aleatorios pero sin que se repitan. Podra ser til para varias cosas como por ejemplo, ordenar de manera aleatoria elementos de una lista, formas grupos aleatorios, barajear cartas, etc. As que en algoritmo quedara algo as: 1. Crear una matriz y dejarla vaca. 2. Obtener un nmero aleatorio. 3. Checar si ese nmero existe en la matriz. Si si, regresar al paso 2. Si no, guardar el numero en la matriz. As que el programa es este:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include<cstdlib> #include<ctime> #include<iostream> using namespace std; bool checkrep(int n, int num[]) { for(int i=0; i<10; i++) if(n == num[i]) return true; return false; } int main() { srand(time(NULL)); int n, num[10]; for(int i=0; i<10; i++) { do n = 1 + rand() % 10; while(checkrep(n, num)); num[i] = n; cout << num[i] << " "; } }

Primero que nada, <cstdlib> es la forma correcta de incluir la librera <stdlib.h> en c++, igual con <ctime>. Como ven, usamos una funcin bool (que retorna falso o verdadero) para checar si el nmero aleatorio ya existe en nuestra matriz. Si cualquiera de los nmeros es igual a nuestro nmero aleatorio n, la funcin retorna true, por lo que el ciclo do-while desde el cual llamamos la funcin tendr que repetirse una vez ms y hasta que la funcin retorne false. Cuando se logra salir del ciclo do-while, guardamos nuestra n en el lugar de la matriz que corresponda, lo mostramos en pantalla y continumos con la siguiente posicin de la matriz.

Otra cosa. Para decirnos si un nmero est repetido en la matriz, la funcin checkrep() necesita obviamente dos cosas, el nmero aleatorio y la matriz. As que le envimos como parmetros nuestra matriz y nuestro nmero aleatorio.
16 Comentarios

Devolver cambio en C++


Guardado en: Programas el 10 de febrero del 2011Etiquetas: if else, while

Han pagado algn recibo en una mquina automtica y se han preguntado cmo ser el programa que les devuelve el cambio? Lo ms seguro es que no, pero pues resulta que el profesor de Miguel ngel le encarg un programa que simulara eso, en sus propias palabras: Supn que una maquina de monedas de 10,5,2,1 y 50 centavos. Debes escribir un programa que decida cuantas monedas dar de cambio, dando prioridad las de mayor denominacin. Debe recibir como entrada la cantidad de dar a cambio. Ejemplo: para $40.50 ser 4 de 10, 0 de 5, 0 de 2, 0 de 1 y 1 de 50 centavos.

As que el primer problema se presenta con la entrada cmo hacer que el usuario introduzca slo cantidades como $50 o $43.50 y no cantidades como $23.45 o $9.70? Lo que se me ocurri es pedir la cantidad en una variable float (cambio), en otra variable convertir esa cantidad a tipo int (cambioint). En ese proceso se perder la parte decimal del nmero, as que si la resta cambio cambioint es igual a 0 o igual a 0.50, la cantidad que introdujo el usuario es correcta. La otra parte es sencilla, slo se necesita ver si la variable cambio es mayor que 10. Si si, se le restan 10 a la variable y se aumenta un contador. Luego se hace lo mismo con las dems monedas. Pero bueno, el programa es este:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include<iostream> using namespace std; int main() { float cambio; int cambioint, m10=0, m5=0, m2=0, m1=0, m50c=0; do { cout << "Cambio?: "; cin >> cambio; cambioint = (int)cambio; }while((cambio - cambioint) != 0 && (cambio - cambioint) != 0.50); while(cambio != 0) { if(cambio>=10) {

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 }

m10++; cambio-=10; } else if(cambio>=5) { m5++; cambio-=5; } else if(cambio>=2) { m2++; cambio-=2; } else if(cambio>=1) { m1++; cambio-=1; } else if(cambio>=0.5) { m50c++; cambio-=0.5; } } cout << m10 << ", " << m5 << ", " << m2 << ", " << m1 << ", " << m50c;

Solo le faltara darle un poco de formato a la salida, pero pues ya es cuestin de gustos y ya saben, cualquier duda aqu estn los comentarios abajo.
27 Comentarios

Simular una Progress Bar en C++


Guardado en: Programas el 13 de enero del 2011Etiquetas: time

Una progress bar es la barrita, generalmente verde, que aparece en sistemas operativos e infinidad de programas cuando algo se est cargando. Hoy no nos vamos a meter en asuntos de cargar archivos o algo, nicamente vamos a ver el principio bsico sobre el que operan estas barras. Nuestro programa slo pedir una cantidad en segundos, que ser el tiempo que durar en llenarse nuestra progress bar. A la ventana donde se ejecutan nuestros programas le caben 80 caracteres de largo, as que vamos a decir que nuestra progress bar tiene una resolucin de 80. El nico problema es saber cunto durar cada unidad de esas 80 para que en total se acumule el tiempo indicado.

La funcin delay() o Sleep()


Si en su IDE pueden usar la librera conio.h, entonces van a usar la funcin delay(). Si no, vamos a tener que agregar la librera windows.h y usar la funcin Sleep() (as con mayscula). Ambas funciones hacen exactamente lo mismo: paran el programa durante una cierta cantidad de tiempo en milisegundos. Por ejemplo:
cout Sleep(2000); cout << << "Hace "Hola" dos segundos << te endl; salud!";

Se muestra 'Hola', se pausa 2 segundos y se muestra 'Hace dos segundos te salud!'

Para

los

que

usan

conio.h,

sera

algo

as:

printf("Hola\n"); delay(2000); printf("Hace dos segundos te salud!");

Ahora s, para saber cuanto tiempo durar cada unidad de nuestra barra tenemos primero que convertir los segundos a milisegundos (s*1000), luego dividirlos entre la resolucin de la barra (s*1000/80). As que nuestro programa queda as:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include<windows.h> #include<iostream> using namespace std; int main() { int s; cout << "Segundos?: "; cin >> s; for(int i=0; i<=79; i++) cout << "_"; for(int i=0; i<=79; i++) { cout << "="; Sleep(s*1000/80); } }

El primer ciclo es solo por esttica, para ver hasta donde va a llenar la barra. El segundo es el que imprime la barra con sus respectivas pausas.
13 Comentarios

Saber si es palndromo o no, de forma recursiva 2da parte


Guardado en: Programas el 10 de enero del 2011Etiquetas: cadenas, string.h

Pues la idea que se me ocurri en el otro post result ser ms sencilla de lo que me imagin, y ahora s la funcin recursiva se ve mucho mejor, ya es mucho ms que un ciclo disfrazado. Coment extensivamente el cdigo, as que aqu est:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include<string.h> #include<iostream> using namespace std; int len, n=0; string chk4palindrosity(string thestr) { if(thestr[0] == thestr[thestr.length() - 1]) // comparar primer caracter con ultimo { n++; if(n == len / 2) // si el numero de veces que la comparacin ha sido cierta es... return "Si es palindromo!"; // igual a la mitad de los caracters, es palindromo thestr.erase(0, 1); // borramos primer caracter thestr.erase(thestr.length() - 1, 1); // borramos ultimo return chk4palindrosity(thestr); // llamamos a la funcin con el string recortado

20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

} else // si una de las comparaciones no es cierta, no es palndromo return "No es palindromo"; } int main() { char inputf[50]={0}, input[50], *parte; cout<<"Introduce un palindromo: "; cin.getline(input, '\n'); parte = strtok(input, " "); // strcat(inputf, parte); // while((parte = strtok(NULL, " ")) != NULL) // strcat(inputf, parte); // quitar espacios del array string thestr(inputf); // convertir array en string para facilitar operaciones len = thestr.length(); // obtener longuitud del string if(len == 1) cout << "Si es palindromo!"; else cout << chk4palindrosity(thestr); // llamar a la funcion e imprimir lo que retorne cin.get(); }

Lo que hace la funcin recursiva es comparar el primer caracter con el ltimo, si son iguales recortarlos y llamarse; si no, no es palndromo. Cualquier duda ya saben que los comentarios estn abiertos.
4 Comentarios

Saber si es palndromo o no, de forma recursiva


Guardado en: Programas el 8 de enero del 2011Etiquetas: cadenas, string.h

Hace unos das me pidieron por correo un programa que nos dijera si un string es palndromo o no, pero usando una funcin recursiva. Me pareci interesante aunque raro que pidieran hacerlo de forma recursiva. Tal vez recuerden que ya haba publicado aqu una forma de saber si un string es palndromo o no, el cual he descubierto (ahora que hice este otro) que no es muy eficiente. Bueno pues el cdigo es este:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include<string.h> #include<iostream> using namespace std; char cadenaf[50]={0}; int len, n=0; string chk4palindrosity(int c) { if(cadenaf[c] == cadenaf[len-1-c]) { n++; if(n == len/2) return "Si es palindromo!"; return chk4palindrosity(c+1); } else

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

return "No es palindromo"; } int main() { char cadena[50],*parte; cout<<"Introduce un palindromo: "; cin.getline(cadena,50,'\n'); parte = strtok(cadena," "); // strcat(cadenaf,parte); // while((parte = strtok(NULL," ")) != NULL) // strcat(cadenaf,parte); // quitar espacios del string len = strlen(cadenaf); cout << chk4palindrosity(0); cin.get(); }

La verdad es que es la funcin es recursiva de puro milagro. Lo que hice fue transformar el ciclo que checaba que los caracteres fueran iguales en una funcin en la que se aumenta una variable cada vez que se llama a s misma. El cdigo ahora es ms eficiente por dos simples razones: 1. Se detiene y da el resultado a la primera comparacin de caracteres que no sean iguales. Si el primer y el ltimo caracter no son iguales, no es palndromo y ya no sigue analizando los dems. 2. Slo checa la mitad de los caracteres. Si la mitad de los caracteres corresponden a la configuracin de un palndromo, ya no hay porqu seguir analizando la otra mitad. Tal vez una mejor manera de hacerlo sera con una funcin que recibiera el string a analizar, comparar el primer y ltimo caracter: si no, no es; si si, eliminar el primer y ltimo caracter y volver a llamar a la funcin. Esto hasta que el numero de comparaciones ciertas sea igual a la mitad de la longitud inicial del string. Alguien se anima a hacerlo?
3 Comentarios

Imprimir determinados nmeros primos


Guardado en: Programas el 19 de diciembre del 2010Etiquetas: primos

Sobre nmeros primos he escrito bastantes programas y me he dado cuenta de que los profesores de programacin tienen cierta fijacin con ellos. Pero bueno, el programa de hoy imprime la cantidad de nmeros primos que el usuario quiera y es interesante porque es un buen ejemplo de la utilidad de losciclos infinitos, que ya habamos visto antes. Ok, el cdigo es este:
1 2 3 4 5 6 7 8 9 10 11 #include<iostream> using namespace std; int main() { int cnt,i=0,ii,res,nc=0,np=0; cout << "Introduce la cantidad de numeros: "; cin >> cnt; for(;;) { i++; for(ii=1;ii<=i;ii++)

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 }

{ res=i%ii; if(res==0) nc=nc+1; } if(nc==2) { cout << i << " "; np++; } nc=0; if(np==cnt) break; }

Si tienen problemas para entender cmo obtuvimos los nmeros primos, deberan darle una revisada a estos posts: Saber si es primo o no y Primos en un rango. Lo que hicimos es que todo el programa estuviera dentro de un ciclo infinito que se detendr cuando nuestra variable que se aumenta cada vez que obtenemos un numero primo np sea igual a la variable con la cantidad deseada de nmeros primos cnt. Pero recuerden que donde podemos usar un ciclo infinito, queda mucho mejor un ciclo while:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include<iostream> using namespace std; int main() { int cnt,i=0,ii,res,nc=0,np=0; cout << "Introduce la cantidad de numeros: "; cin >> cnt; while(np!=cnt) { i++; for(ii=1;ii<=i;ii++) { res=i%ii; if(res==0) nc=nc+1; } if(nc==2) { cout << i << " "; np++; } nc=0; } }

nicamente ponemos la palabra while en lugar de for, copiamos la condicin que condicionaba (s, lo se) el break y la pegamos dentro de los parntesis del while pero de manera contraria (de == a != o de < a >).
10 Comentarios

Clasificar nmeros en C++


Guardado en: Programas el 26 de noviembre del 2010Etiquetas: matrices, rand

Por medio de un comentario Gaby me pidi un programa que: Genere 10 nmeros aleatorios del 0 al 50 y los clasifique en 2 rangos: menores que 10 y mayores que 10 pero menores que 20.

A nosotros nos sirve para practicar el uso de nmeros random, de matrices y de ciclos. El programa es este:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include<stdlib.h> #include<ctime> #include<iostream> using namespace std; int main() { int numrnd[10], cls1[10]={0}, cls2[10]={0}, ct1=0, ct2=0; srand(time(NULL)); cout << "Los numeros: "; for(int i=0; i<=9; i++) { numrnd[i] = rand() % 51; cout << numrnd[i] << ", "; if(numrnd[i] < 10) { cls1[ct1] = numrnd[i]; ct1++; } if(numrnd[i] > 10 && numrnd[i] < 20) { cls2[ct2] = numrnd[i]; ct2++; } } cout << endl << "Menores que 10: "; for(int i=0; i<ct1; i++) cout << cls1[i] << ", "; cout << endl << "Mayores que 10 y menores que 20: "; for(int i=0; i<ct2; i++) cout << cls2[i] << ", "; }

Para dudas respecto a la generacin de nmeros random est este post: Obtener nmeros aleatorios en C++. Para dudas respecto a la declaracin y uso de matrices est este otro post: Ah nunca he escrito sobre matrices!, voy a tener que ponerme a ello. Para dudas con respecto a los ciclos for, s tengo un post: Ciclos for en C++. Tenemos 3 matrices, en la primera guardamos nuestros 10 nmeros aleatorios, en la segunda los nmeros que queden en la primera clasificacin (menores que 10) y en la tercera los que queden en la segunda clasificacin. As que lo que hacemos es ir traspasando los valores de la primera matriz a las otras dos segn su valor. Para esto tenemos que llevar en el mismo ciclo 3 cuentas diferentes, una para cada matriz. Las variable ct1 y ct2 se encargan de ir cambiando los ndices de las matrices cls1 y cls2respectivamente, por lo que slo deben aumentar cuando en realidad sea necesario. Despus lo nico necesario es mostrar nuestras dos matrices. Como cada matriz puede tener un nmero de elementos diferentes cada vez, tenemos que hacer dos ciclos, uno para cada matriz con ct1 o ct2como lmite. Como ltima aclaracin slo digo que, tal como dice el problema, el nmero 10 nunca va a quedar clasificado en algn rango porque el 10 no es menor que 1o y tampoco es mayor que 10.
12 Comentarios

Pginas: 1 2 3 4 5 Siguiente

Cdigo C++ 2010 | Gestionado con Wordpress | Bajo una licencia Creative CommonsPoltica de privacidad

Re: El ahorcado en Lenguaje C Respuesta #5 en: 3 Septiembre 2008, 18:02 fijense este... es un poco ms animado xD: Cdigo 1. #include <stdio.h> 2. #include <stdlib.h> 3. #include <string.h> 4. #include <time.h> 5. 6. #define N 12 7. char txt[9]; 8. char datos[N][9]={ 9. "anteojo","avioneta","zapallo","martir", 10. "espejo","anzuelo","heciano","tripode", 11. "insecto","agujero","carnada","cabeza"}; 12. 13. char dibuj[9][7]={ 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. }; 24. 25. struct pst{ 26. 27. int pos; char part[5]; O"},{4," /"},{4,"|"}, |"},{6," /"},{6," \\"}}; "____", "| "| "|", "|", "|", "|", "|", "------" |", |",

28. }parts[7]={{3," 29. {4,"\\"},{5," 30.

31. int main(int argc, char *argv[]) 32. { 33. 34. 35. 36. 37. 38. m=strlen(datos[o]);p=m-2; srand(time(NULL)); o=rand()%N; int n,m,o,p,i,j,r,eq=0;char lc,tmp[10];

39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. } 76. system("PAUSE"); return 0; if(!p)printf("\nPalabra: %s - Ganaste cara de Naco!!!\n\n",txt); else if(eq>=7)printf("\nJAJA!!! Loooooser!!!\n\n"); else printf("\nK c's Pap??? Recatate!!!\n\n"); if(p>0){ printf("\nPalabra: %s - Ingrese 1 letra (* para terminar): ",txt); scanf("%10s",&tmp); }lc=tmp[0]; system("cls"); }while(lc!='*'&&p); if(eq>=7)break; } } for(i=0;i<9;i++)printf("%s\n",dibuj[i]); } if(r==p){ strcat(dibuj[parts[eq].pos],parts[eq].part); eq++; for(j=0;j<strlen(tmp);j++){ lc=tmp[j];r=p; for(n=1;n<m-1;n++) if(datos[o][n]==lc){ txt[n]=lc;datos[o][n]='_';p--; do{ txt[0]=datos[o][0];txt[m-1]=datos[o][m-1]; for(n=1;n<m-1;n++)txt[n]='_';txt[m]=0; printf("Ahorcatesss!!! Vr. 1.0\n\n");tmp[0]=0; for(i=0;i<9;i++)printf("%s\n",dibuj[i]);

Вам также может понравиться