You are on page 1of 34

Diferencias entre C y C++

Guardado en: Artculos el 21 de septiembre del 2011

Me han estado llegando comentarios y correos con dudas, correcciones y todo tipo de insultos (no, eso ltimo no) y decid responder todos ellos con este post en el que aclarar lo que es C y lo que es C++ y sus diferencias. C fue creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell como evolucin del anterior lenguaje B, a su vez basado en BCPL. C++, por su parte, fue creado a mediados de los aos 1980 por Bjarne Stroustrup. La intencin de su creacin fue el extender al exitoso lenguaje de programacin C con mecanismos que permitan la manipulacin de objetos. As que C es el lenguaje original, mientras que C++ es una ampliacin de C , por eso el ++. A mi cuando me ensearon a programar me dijeron que iba a aprender a programar en C+ +, pero en verdad me ensearon nicamente C, as que muchos profesores en realidad no saben lo que es programar en C++. Veamos un hola mundo en los dos programas: En C
1 2 3 4 5 6 7 #include<stdio.h> int main() { printf ("Hola Mundo"); return 0; }

En C++
1 2 3 4 5 6 7 8 9 #include<iostream> using namespace std; int main() { cout << "Hola mundo"; return 0; }

Para el tipo de programas que se estarn mostrando en este blog la diferencia ms importante es la entrada y salida de datos. As que veamos un ejemplo de entrada y salida de datos de cada programa: En C
1 2 3 4 5 6 7 8 9 #include<stdio.h> int main() { int radio; float area, perimetro; // SALIDA: mensaje un pantalla printf("Introduce el radio del circulo: ");

10 11 12 13 14 15 16 17 18 19 20 21 22 23 }

//ENTRADA: recibir dato desde teclado scanf("%d", &radio); // calculos area = 3.1416 * radio * radio; perimetro = 3.1416 * radio * 2; //SALIDA: resultado en pantalla printf("El area es %.2f y el perimetro %.2f", area, perimetro); getch(); return 0;

En C++
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 radio; float area, perimetro; // SALIDA: mensaje un pantalla cout << "Introduce el radio del circulo: "; //ENTRADA: recibir dato desde teclado cin >> radio; // calculos area = 3.1416 * radio * radio; perimetro = 3.1416 * radio * 2; //SALIDA: resultado en pantalla cout << "El area es " << area << " y el perimetro " << perimetro; cin.get();cin.get(); return 0; }

Lo que not al hacer estos dos programitas es que pedir un dato en C++ es mucho mucho ms simple que en C. Sin embargo, el asunto de los << y >> puede llegar a asustar a los recin iniciados en la programacin. Pedir un dato en C
scanf("modificador", &nombre de la variable);

Pedir un dato en C++


cin >> nombre de la variable;

Mostrar un dato en C
printf("Dato: modificador", nombre de la variable);

Mostrar un dato en C++


cout << "Dato: " << nombre de la variable;

Los modificadores son los siguientes: %d para int, %f para float, %s para string, %c para char.

Libreras en C++
Por simple convencin las libreras en C terminan en .h (punto hache). Todas las libreras de C sirven para C++, sin embargo, tambin por convencin, se elimina la terminacin .h y mejor se agrega c al principio. Libreria en C Librera en C++ math.h string.h time.h etcetera. cmath cstring ctime

El namespace
C como lenguaje tiene un conjunto de palabras reservadas, como por ejemplo: if, for, while, int, float, C++ es una ampliacin, por lo tanto tiene que agregar nuevas palabras reservadas. stas palabras reservadas estn en un namespace (espacio de nombres). En especfico cout y cin estn el namespace std (standard). Si no declararamos que vamos a usar el namespace std (using namespace std;), cada vez que quisieramos usar cout, tendramos que escribir std::cout. Espero que a partir de ahora pueden identificar si un programa est en C o en C++. Tambin espero estar publicando mis programas en ambos lenguajes a partir de ahora.
21 Comentarios

#define en C++, cmo s y cmo no


Guardado en: Curso el 28 de agosto del 2011Etiquetas: bsico, define

El mayor objetivo de este post es darles a conocer una de las cosas que C++ permite hacer pero que nadie en su sano juicio debera de hacer. Y para que se los enseo entonces? Pues para que si algn da lo ven en un cdigo ajeno sepan qu pinch_ est pasando. Bueno, antes que nada, #define sirve para dos cosas: definir una constante o crear un macro. Los macros pueden llegar a ser algo difcil de entender, ahora slo veremos el asunto de las constantes. El asunto aqu es que si yo pongo (fuera del main) una lnea as: significa que cada vez que escribamos PI en nuestro programa, C++ lo interpretar como 3.14159265. Es una simple sustitucin.
#define <aqu va el nombre> <despus de un espacio va el valor>

#define PI 3.14159265

Pero el asunto es que se puedes hacer algunas cosas bastantes feas con esta propiedad. Vean este programa:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

#include<iostream> using namespace std; #define #define #define #define #define #define PI 3.14159265 NOF_CHAR 50 pause cin.get();cin.get(); ct cout cn cin false true

int main() { char name[NOF_CHAR] = {0}; ct << "Enter your name: "; cn >> name; ct << "Bye " << name << "." << endl; if(false) ct << "P.S. Pi = " << PI; pause }

Tenemos 6 definiciones, ordenadas en su nivel de aceptabilidad: #define PI 3.14159265 y #define NOF_CHAR 50, stos ejemplifican el uso primario de #define: guardan un valor que es constante durante toda la ejecucin del programa. #define pause cin.get();cin.get();, sta ya empieza a ser no aceptable pero podemos darla por buena porque nos ayuda a leer mejor nuestro cdigo. Ya sabemos que al escribircin.get();cin.get(); nuestro programa se pausa al igual que con un getch(), pero al usar este #define escribiremos en lugar de eso simplemente pause. #define ct cout y #define cn cin, totalmente inaceptables. Algunas personas usan este tipo de #defines para escribir menos, pero de verdad que (en la gran mayora de los casos) no vale la pena el ahorro de caracteres, slo estamos haciendo nuestro cdigo menos entendible para otras personas. #define false true, este es mas bien como una broma ( y es increble que funcione en verdad), pero si se usa en serio es como una rayada de madre. Si ejecutan el cdigo vern que s se muestra la lnea donde se imprime PI an que est dentro de un if al que nunca se debera de entrar y porqu s entra? porque false es true. As que ya saben cmo s y cmo no usar un #define en C++, y ya no estn indefensos ante programadores con malos hbitos.

11 Comentarios

Nuevo: Curso de C++


Guardado en: Blog el 18 de agosto del 2011

Segn Google Analytics estn regresando las visitas, que raro que coincida con el inicio de clases verdad? :D pero bueno, afortunadamente yo s me preocupe por este blog en vacaciones. Como ya repet dos veces, esto es un blog, lo que significa que los posts mas recientes son los que aparecen al principio. Adems, cuando inici este blog mi propsito era ir avanzando en dificultad conforme al tiempo, no lo he cumplido mucho pero an as los posts sobre los temas ms bsicos estn enterrados debajo de los ms recientes. As que me tom un tiempo para echarme un clavado de panza en el Codex de WordPress y crear una forma diferente de navegar en el blog.

Entonces as es como inauguro (siendo las 19:30 del dia ah no verdad? ) el Curso de C++. Todo lo que tienen que hacer es ir a este ndice y comenzar a leer: Curso de C++, ndice. Luego pueden simplemente dar clic en el link Siguiente que aparecer en la barra lateral (->). As que espero que les sea de utilidad, si les gusta presmanlo, si tienen un amigo que siempre les anda preguntando pues mndenlo aqu y lbrense de l.
15 Comentarios

Code::Blocks, un IDE moderno para C++


Guardado en: Blog el 12 de julio del 2011Etiquetas: ide

Yo hace un buen rato que no uso Dev-C++ para programar, y sin embargo vi que aqu en la barra lateral an est el link hacia el post donde se los recomiendo. As que ahora les voy a recomendar el IDE que uso actualmente Code::Blocks.

Code::Blocks tiene bastante ventajas respecto a otros IDES:

Aspecto moderno. A quin le gusta programar a pantalla completa en consola con fuente amarilla sobre fondo azul hoy en da?

Multiplataforma. Windows XP/Vista/7, Mac OS X, Linux. Rpido. Est escrito en C++. Open Source. Eso significa muchas cosas, pero lo importante es que es gratis. Pestaas. Puedes tener muchos archivos abiertos. Lo pueden descargar aqu: Download Code::Blocks. Asegrense de descargar la versin que trae el compilador incluido, el que dice mingw. Si de plano nunca han manejado este tipo de software, tal vez les sean tiles estos consejos: Para hacer un programa pequeo (lo que sea que no necesite mas de dos archivos) no se compliquen creando proyectos. Simplemente vayan a: File/New/Empy File. Luego guarden el archivo con extensin .cpp, preferentemente antes de empezar a programar (si no lo guardan no tendrn diferentes colores en su cdigo (Sintax Highlighting)). Hay tres botones relacionados con correr el programa: Build, Run y Build and Run. El primero solo construye el programa pero no lo corre, el segundo solo lo corre y el tercero los construye y los corre. As que cuando queramos probar nuestro programa el botn indicado es Build and Run, pero si no hemos hecho ningn cambio y queremos volver a probarlo es ms rpido Run.

23 Comentarios

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 ahi corrgeme:

1 llenar 1000 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 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<cstdlib> #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
14 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.
13 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 #include<iostream> using namespace std;

3 4 int main() 5 { 6 float cambio; int cambioint, m10=0, m5=0, m2=0, m1=0, m50c=0; 7 do 8 { 9 cout << "Cambio?: "; cin >> cambio; 10 cambioint = (int)cambio; 11 }while((cambio - cambioint) != 0 && (cambio - cambioint) != 0.50); 12 while(cambio != 0) 13 { 14 if(cambio>=10) 15 { 16 m10++; 17 cambio-=10; 18 } 19 else if(cambio>=5) 20 { 21 m5++; 22 cambio-=5; 23 } 24 else if(cambio>=2) 25 { 26 m2++; 27 cambio-=2; 28 } 29 else if(cambio>=1) 30 { 31 m1++; 32 cambio-=1; 33 } 34 else if(cambio>=0.5) 35 { 36 m50c++; 37 cambio-=0.5; 38 } 39 } 40 cout << m10 << ", " << m5 << ", " << m2 << ", " << m1 << ", " << m50c; 41 }

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.
25 Comentarios

Cuando inicializar las variables en cero y cuando no


Guardado en: Curso el 14 de enero del 2011Etiquetas: variables

Cuando empec a aprender a programar en c++ (creo que uno nunca acaba) me ensearon que siempre hay que inicializar en cero o en algn otro valor las variables, porque si no, pueden tomar valores raros que podran arruinar nuestro programa. Vamos a ver si la leyenda es cierta:

1 2 3 4 5 6 7 8

#include<iostream> using namespace std; int main() { int var1; cout << var1; }

Pues con mi compilador s lo es, una variable sin inicializar toma valores raros. Pero si se han fijado en mis programas, yo no siempre inicializo mis variables, por qu? Pues porque no siempre es necesario. La regla es bastante simple: Si la primera instruccin en la que usamos nuestra variable es de asignacin, no es necesario inicializarla. Por ejemplo:
cin >> var1; // no es necesario inicializarla var2 = 14; // no es necesario inicializarla cout << var3; // es necesario inicializarla var4 = cos(45); // no es necesario inicializarla var5++; // es necesario inicializarla if(var6 != 7) // es necesario inicializarla cin.getline(var7); // no es necesario inicializarla

Podemos seguir inicializando todas las variables que usemos, pero si nicamente inicializamos las necesarias vamos a dar la impresin de que sabemos lo que estamos haciendo XD

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 << "Hola" << endl;

Sleep(2000); cout <<

"Hace dos segundos te 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 #include<windows.h> 2 #include<iostream> 3 using namespace std; 4 5 int main() 6 { 7 int s; 8 cout << "Segundos?: "; cin >> s; 9 for(int i=0; i<=79; i++) 10 cout << "_"; 11 for(int i=0; i<=79; i++) 12 { 13 cout << "="; 14 Sleep(s*1000/80); 15 } 16 } 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.
12 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 #include<string.h> #include<iostream> using namespace std; int len, n=0;

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

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 } 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 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #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 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 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #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++) { 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 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int cnt,i=0,ii,res,nc=0,np=0; 7 cout << "Introduce la cantidad de numeros: "; cin >> cnt; 8 while(np!=cnt)

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 }

{ 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

No se hacen proyectos finales


Guardado en: Blog el 15 de diciembre del 2010Etiquetas: comentarios

Bueno pues lo dej muy claro en el ttulo no? pero lo repito, no se hacen proyectos finales. Cuando cree este blog lo hice pensando en ayudar a todos los estudiantes de programacin en c++ que necesitan algn empujn para lograr hacer sus propios programas. Tengo pruebas para decir que casi nunca me niego a hacer programas pequeos que me piden por correo o por comentarios, pero cuando me llegan correos pidiendo que les haga un programa que lleve el control del inventario de un almacn registrando cada entrada y salida de producto pidiendo tipo, cantidad, numero de control, precio imprimiendo al final del da el reporte.. y que adems haga los clculos para. en formato de y con 7 mens con con un apartado de ayuda. para maana por favor pues ni les respondo. La verdad es que no se vale. Durante todo el ao estuvieron haciendo programas sencillos con los que era totalmente vlido pedir ayuda, pero no, piden ayuda hasta el final del semestre cuando les encargan un proyecto final. Recuerden que yo tambin soy un estudiante y en estos das tambin estuve ocupadsimo con tareas y trabajos. Por eso no haba publicado nada. Pero ya estoy de vacaciones!, as que ya voy a tener un poco ms de tiempo para atender mis blogs :)
34 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

Convertir segundos a horas, minutos y segundos


Guardado en: Programas el 23 de noviembre del 2010Etiquetas: operadores

Como les promet en el post anterior, en este post vamos a hablar sobre un programa que usa losoperadores compuestos de manera muy til: convierte los segundos en horas minutos y segundos. El programa es este:
#include <iostream> using namespace std; int main() { int sec, hr, min; cout << "Introduce los segundos: "; cin >> sec; cout << sec << " segundos son "; hr = sec / (60*60); sec %= 60*60; min = sec / 60; sec %= 60; cout << hr << " horas " << min << " minutos y " << sec << " segundos" << endl; }

Primero dividimos los segundos sec entre 60*60 (3600) para obtener los horas y lo guardamos en hr. Noten que la variable sec no cambia. Luego obtenemos el residuo de dividir sec / 60*60 (es lo que el operador % hace ) y lo guardamos en la misma variable. En este paso s modificamos la variable sec, ahora contiene los segundos iniciales menos las horas que ya obtuvimos en el paso anterior. Ahora dividimos nuevamente la variable sec / 60 para obtener los minutos y lo guardamos en hr. La variable sec no cambia. Luego obtenemos el residuo de dividir sec / 60 (es lo que el operador % hace ) y lo guardamos en la misma variable. En este paso s modificamos la variable sec, ahora contiene los segundos iniciales menos las horas menos los minutos. Ya slo mostramos las tres variable y listo. Ahora, si somos de los que nos preocupamos por el lenguaje, veremos que a veces hay errores de ortografa como 1 minutos. Para solucionar eso slo necesitamos unos cuantos ifs:
#include <iostream> using namespace std; int main() { int sec, hr, min; cout << "Introduce los segundos: "; cin >> sec; cout << sec << " segundos son "; hr = sec / (60*60); sec %= 60*60; min = sec / 60;

sec %= 60; cout << hr << " hora"; if(hr != 1) cout << "s"; cout << " " << min << " minuto"; if(min != 1) cout << "s"; cout << " y " << sec << " segundo"; if(sec != 1) cout << "s";

32 Comentarios

Operadores compuestos en C++


Guardado en: Curso el 20 de noviembre del 2010Etiquetas: operadores, sencillos

Los operadores (en cualquier lenguaje de programacin ) son los smbolos que permiten hacerle una operacin a una o ms variables. Los ms conocidos son los operadores aritmticos: + Suma - Resta * Multiplicacin / Divisin % Mdulo (residuo de la divisin) Otros son los lgicos (&&, ||), los relacionales (<, >, !=, ==), etc. Pero en este post, como dice el ttulo, vamos a ver los operadores compuestos en c++. Cmo haramos para sumarle a una variable int, por ejemplo, 3 unidades? Alguien que nunca hubiera programado escribira algo as:
mivar + 3;

Sabemos que eso no es vlido porque una suma retorna un valor ( el resultado) y ese valor tiene que ser almacenado en una variable. En el cdigo anterior ese valor no se almacena en ninguna variable, por lo tanto ERROR. Sabiendo esto ltimo podemos escribir esto:
mivar = mivar + 3;

En la variable mivar, guardamos el contenido de esa misma variable ms tres. Todo bien no? eso es perfectamente vlido y normal, sin embargo los operadores compuestos nos permiten hacer lo mismo con menos cdigo:
mivar += 3;

Como ven est inspirado en hacer que lo-primero-que-se-nos-ocurre sea posible. As tenemos que:
mivar = mivar + mivar = mivar mivar = mivar * mivar = mivar / 3; es lo mismo que 3; es 3; es 3; es mivar /= lo lo lo 3; mismo mismo mismo que mivar que mivar que mivar += -= *= 3; 3; 3;

Bueno, para ver un poco de la utilidad de estos operadores y hacindole un favor a un tal Victor, vamos a ver un programa que imprima los mltiplos de un cierto nmero (introducido por el usuario) que haya desde 1 hasta otro cierto nmero ( introducido por el usuario): #include<iostream> using namespace std; int main() { int num, lims, m=0; cout << "Numero?: "; cin >> num;

cout << "Limite superior?: "; cin >> lims; while(lims >= (m+=num)) { cout << m << ", "; }

Primero pedimos el nmero del cual queremos obtener mltiplos (num), luego el lmite superior (lims).m obtendr el valor de los mltiplos y lo tenemos que igualar a 0 al inicio. Luego tenemos un ciclo while. En espaol dice: Me mantendr ejecutando mientras el lims sea mayor o igual a m ms num. Dentro del ciclo mostramos la variable m. Si, por ejemplo, num = 3, entonces la instruccin n+=num se desarrolla as:
m = 0;

m+=num; -----> m+=num; -----> m+=num; -----> etc, etc.

m= m= m=

m m m

+ + +

num; -----> m = 0 + 3; -----> m num; -----> m = 3 + 3; -----> m num; -----> m = 6 + 3; -----> m

= = =

3; 6; 9;

Aqu podra poner un otro programa an ms til para usar los operadores compuestos, pero mejor lo dejo para el siguiente post. Ah y si t eres Victor, entonces tal vez te interese este post: Cmo contar el nmero de veces que sucede algo.

Tipos de funciones en C++


Guardado en: Curso el 13 de noviembre del 2010Etiquetas: funciones

Los tipos de funciones en c++ son 4, aunque en realidad son las combinaciones de las 2 cosas que una funcin puede hacer. Si andan perdidos en cuanto a funciones les recomiendo leer mi post anterior:Funciones en C++. Una funcin, como les deca, puede hacer (o no) dos cosas: 1 Recibir datos y 2 Retornar datos. De esto surgen los cuatro tipos de funciones: 1. No reciben ni retornan 2. Reciben y no retornan 3. No reciben y retornan 4. Reciben y retornan Vamos a hacer un programa que sume dos nmeros, usando los cuatro tipos de funciones:

No reciben ni retornan
Las ms sencillas. Para usarlas slo tenemos que saber cmo crearlas y cmo llamarlas. Una funcin se crea de esta forma general:
tipo nombre(){}

El tipo se refiere al tipo de dato ( int, float, void, char) y en las funciones que no retornan siempre es void. El nombre es el nombre de la funcin: cualquiera que empiece con una letra, que sea significativo y que no sea una palabra reservada. Para llamarlas slo hay que escribir el nombre de la funcin seguido de sus parntesis y un punto y coma (;).
nombre();

As nuestro programa sera:


#include<iostream> using namespace std; void sumar() { int num1, num2, r; cout << "Numero 1: "; cin >> num1; cout << "Numero 2: "; cin >> num2; r = num1 + num2; cout << "La suma es " << r; } int main() { sumar(); }

Como ven, todo lo que habramos puesto en nuestro main mejor los pusimos en una funcin y desde el main la llamamos. Una funcin siempre, siempre, siempre tiene que ir antes del main. Una funcin de este tipo que hemos usado muchas veces es getch();

Reciben y No Retornan
Cmo haramos para pedir los dos nmeros en el main y que la funcin haga la suma? Para eso tenemos que hacer una funcin capaz de recibir datos, entonces la sintaxis cambia un poco:
tipo nombre(tipo_var1 nombre_var1, tipo_var2 nombre_var2){}

tipo y nombre se refieren a lo mismo y como no retorna el tipo siempre es void. Dentro del parntesis tenemos otros aspectos: tipo_var1 se refiere al tipo de la variable que nuestra funcin va a recibir. nombre_var1 se refiere al nombre de esa variable.

Si queremos recibir una variable hasta ah es suficiente, si queremos otra variable ponemos una coma (,) y declaramos la siguiente variable. Para llamar la funcin hay que poner la variables que vamos a enviar dentro del parntesis en el mismo orden en que las declaramos en la funcin:
nombre(var1, var2);

Nuestro programa quedara as:


#include<iostream> using namespace std; void sumar(int num1, int num2) { int r; r = num1 + num2; cout << "La suma es " << r; } int main() { int num1, num2; cout << "Numero 1: "; cin >> num1; cout << "Numero 2: "; cin >> num2; sumar(num1, num2); }

Pedimos los dos nmeros en el main, los enviamos a la funcin, sta los suma y los muestra. Una funcin de este tipo que hemos usado muchas veces es el odiado por muchos, amados por otros,gotoxy(x,y);

Retornan y No Reciben
Y si ahora queremos lo contrario? Pedir los nmeros en la funcin, pero mostrar el resultado en el main. Para eso necesitamos una funcin que retorne. Recibir es enviar datos del main a la funcin. Retornar es enviar datos de la funcin al main. Para retornar datos hay que hacer dos cosas: no usar void como tipo y usar return. De forma general:
tipo nombre() { return var; }

El tipo tiene que ser del tipo de variable que queremos retornar, si nuestra variable retorna una variable int, pues el tipo de la funcin es int. Para indicar qu variable estamos retornando usaremos la palabra return seguido de la variable. Usualmente esto va al final de la funcin. Para llamar a la funcin hay que preparar un colchn en donde caiga la variable que est retornando.
var = nombre();

La variable que est retornando nuestra funcin se va a almacenar en la variable var. Este es un buen momento para recordarles que las variables declaradas entre dos llaves {} nicamente existen entre esas dos llaves. O sea que la variable var de la funcin no es

la misma que la variable var de la funcin; sin embargo la var del main est adquiriendo el valor de la var del main. Un poco confuso lo se, no se preocupen. Nuestro programa quedara as:
#include<iostream> using namespace std; int sumar() { int num1, num2, r; cout << "Numero 1: "; cin >> num1; cout << "Numero 2: "; cin >> num2; r = num1 + num2; return r; } int main() { int r; r = sumar(); cout << "La suma es " << r; }

A alguien se le ocurre una funcin conocida de este tipo?

Reciben y Retornan
Ahora queremos que nuestra funcin nicamente sume, el main se va a encargar de pedir los nmeros y sumar los resultados. Para eso necesitamos que nuestra funcin reciba las variables y adems retorne el resultado. Wow! Es acaso eso posible? Claro que s. Es slo cuestin de combinar las funciones que reciben y no retornan con las que retornan y no reciben. Nuestro programa quedara as:
#include<iostream> using namespace std; int sumar(int num1, int num2) { int r; r = num1 + num2; return r; } int main() { int num1, num2, r; cout << "Numero 1: "; cin >> num1; cout << "Numero 2: "; cin >> num2; r = sumar(num1, num2); cout << "La suma es " << r; }

Las funciones de la librera math.h son en su mayora de este tipo. sqrt(); pow(); sin(); En principio puede parecer que las funciones sirven nicamente para organizar el cdigo, lo cual es cierto, pero no slo eso. Se imaginan si tuviramos que escribir todo el cdigo detrs de un simplegotoxy();? Ah verdad Bueno, no me iba a quedar tranquilo si no les mostraba la versin optimizada de la ltima funcin:
#include<iostream> using namespace std; int sumar(int num1, int num2) { return num1 + num2; } int main() { int num1, num2; cout << "Numero 1: "; cin >> num1; cout << "Numero 2: "; cin >> num2; cout << "La suma es " << sumar(num1, num2); }

:D
39 Comentarios

Funciones en C++
Guardado en: Curso el 6 de noviembre del 2010Etiquetas: funciones

Supongo que ya es hora de retomar el blog y ponerme a hablar de funciones en c++. Una funcin es un pedazo de cdigo fuera del main, con un nombre y que puede ser llamado desde otra parte de nuestro programa. Imagnense que estn entrenando a su perro a hacerse el muertito. Cada vez que ustedes dicen muertito, el perro se tira de espaldas en el suelo, cierra los ojos y saca la lengua. En programacin, elcontenido de la funcin sera tirarse de espaldas, cerrar los ojos y sacar la lengua; el nombre de la funcin sera muertito; y cada vez que nosotros decimos muertito estamos llamando a la funcin. Nuestra funcin sera algo as:
void muertito() { Perro.Tirarse(posicion='espalda'); Perro[OjoDer].Cerrar(); Perro[OjoIzq].Cerrar(); Perro[Lengua].Sacar(); }

Jajaja, bueno, bueno. Ya en serio vamos a hacer un clsico Hola Mundo pero usando una funcin:
#include<iostream> using namespace std; void hola()

cout << "Hola Mundo!"; } int main() { hola(); }

Como ven, esta funcin es muy estpida. No nos beneficia en nada y nos hace escribir ms cdigo del necesario, pero nos sirve para ver cmo acta una funcin: al momento de llamar a la funcin, el compilador se brinca a la funcin, la ejecuta y cuando termina, vuelve al punto desde donde brinc. Si pudieran leerle la mente a un compilador, este dira: Linea 1. Incluir la librera iostream. OK Linea 2. Usar el namespace estndar. OK Linea 3. Oh! una funcin llamada hola, la recordar. Linea 4. Llave. Parte de la funcin. Ignorar Linea 5. Imprimir Hola Mundo!. Parte de la funcin. Ignorar Linea 6. Llave. Parte de la funcin. Ignorar Linea 7. Por fin el main! Linea 8. Llave. Entrar Linea 9. Esta funcin se me hace conocida oh s ya recuerdo. Ejecutar lineas 4, 5 y 6 Linea 10. Llave. Salir Ahora veamos una funcin que s nos es til:
#include<iostream> using namespace std; void hola(char nombre[50]) { cout << "Hola " << nombre << "!"; } int main() { char nombre[50]; cout << "Cual es tu nombre?: "; cin.getline(nombre, 50, '\n'); hola(nombre); }

Primero pedimos un nombre, lo guardamos en una variable y se le mandamos a la funcin para que lo muestre. No se preocupen, si nunca haban visto una funcin tal vez no entiendan la sintaxis, pero el objetivo de este post es que sepan qu es una funcin y para qu se puede usar. En el siguiente post voy a explicar la sintaxis de los cuatro tipos de funciones en c++.
11 Comentarios

Cmo pasar una matriz o arreglo como parmetro a una funcin

Guardado en: Programas el 28 de octubre del 2010Etiquetas: arreglos, funciones

Bueno, casi creo que nunca he hablado de matrices, parmetros o funciones en este blog, pero este post es una peticin de Rodrigo que me dijo por email que tena problemas con su tarea porque no sabecmo pasar una matriz como parmetro a una funcin en c++. Es algo sencillo, pero difcil de deducir. Veamos. Si tu arreglo es de una dimensin
int matriz[4];

void

la la el

forma
fx(int

de

declarar
m[4])

la llamar

funcin
{

es

la funcin

siguiente:
}

...cdigo...

Y
fx(matriz);

forma arreglo pues


fx(int

de es

la dos lo
{

sera:

Si
int

de es

dimensiones
matriz[4][3];

void

mismo:
...cdigo... }

m[4][3])

Y
fx(matriz);

la la

forma

de funcin se

llamar retorna declara

la

funcin una

sera: matriz
matriz[4];

Si
int

void fx(int

normal:
matriz[4]; }

m[4])

return

la

forma

de

llamar

la

funcin

sera:

matriz[4] = fx(matriz);

Este programa pide tres nmeros, los almacena en una matriz, le suma 1 a cada elemento y los muestra, usando para cada accin una funcin. As que tenemos funciones que reciben matrices y que retornan matrices. Chquenlo.
#include<iostream> using namespace std; void pedir(int matriz[3], int len) { for(int i=0; i<=len; i++) { cout << "Numero " << i+1 << ":? "; cin >> matriz[i]; } } int sumar(int matriz[3], int len) { for(int i=0; i<=len; i++) matriz[i]++; return matriz[3]; } void mostrar(int matriz[3], int len) { for(int i=0; i<=len; i++) cout << matriz[i] << " "; }

int main() { int matriz[3]={0}, len = sizeof(matriz)/sizeof(int); pedir(matriz, len-1); matriz[3] = sumar(matriz, len-1); mostrar(matriz, len-1); return 0; }
16 Comentarios

Grfica de Seno y Coseno en C++


Guardado en: Programas el 4 de octubre del 2010Etiquetas: gotoxy, math, seno coseno

Juand a travs de un comentario me pidi ayuda con un programa que grafique utilizando gotoxy las grficas de seno y coseno en c++. El programa me pareci interesante y, aunque tuve que desempolvar el Borland C++ que usaba en la prepa, lo hice feo, pero lo hice. A mi parecer, para graficar por ejemplo la funcin seno, hacen falta 3 pasos: 1. Hacer un ciclo de 0 a 360 (con aumentos de 5 queda muy bien ) con for, algo muy normal. 2. Calcular, obviamente, el seno de cada valor. Para esto la librera math.h nos regala la funcin sin(). Su uso es el obvio, pero el asunto es que todas las funciones trigonomtricas que usa c++ trabajan en radianes. Es decir que primero tendremos que convertir nuestro ngulo en radianes y luego ya sacar el seno. Si la variable i contiene el ngulo y tenemos ya definida la constante PI, la funcin quedara as:
sin(i/180*PI)

3. Luego viene la parte ms rara, convertir ese valor en un entero que pueda meter como coordenada en un gotoxy. Si tenemos una variable int y y la igualamos a nuestra funcin anterior podra quedar bien si multiplicamos por 10:
int x, y; y = sin(i/180*PI)*10; gotoxy(x,y);

Nos quedara nuestra grfica en una escala 1:10, pero al correr el programa veremos que hay muchos valores de seno que son 10 ( por el redondeo) y por lo tanto la grfica se ve achatada. Para mejorar un poco eso (de todos modos queda un poco fea) podemos usar la funcin ceil() incluida tambin en la librera math.h que nos redondea los decimales. Y esta vez multiplicamos por 20, redondeamos, dividimos entre 2 y convertimos a int. Nos vuelve a quedar escala 1:10 (o 10:1 ? no se) pero ya no hay tantas cantidades amontonadas en el 10 y -10.

El programa ya listo para graficar seno est aqu abajo, obviamente para graficar coseno slo hay que cambiar la funcin sin por cos, y copiar, pegar y hacer un men no debe ser difcil.
#include<stdio.h> #include<conio.h> #include<math.h> #define PI 3.14159265 int main() { int x=2, y; for(float i=0; i<=360; i+=5) { y = ceil(sin(i/180*PI)*20)/2; gotoxy(x, 12-y);printf("o"); x++; } getch(); } return 0;

29 Comentarios

Calcular ngulos de un tringulo en C++


Guardado en: Programas el 3 de octubre del 2010Etiquetas: math, tringulos

En el post anterior vimos cmo saber si un tringulo es rectngulo, acutngulo u obtusngulo en C++, y les anticip que hara una nueva versin del mismo programa pero que nos calculara adems los ngulos del tringulo. El programa es este.
#include<math.h> #include<iostream> using namespace std;

#define PI 3.14159265 // nuNcA cAmbieZz we!! int main() { float a, b, c, A, B, C; cout << "Introduce lado a: "; cin >> a; cout << "Introduce lado b: "; cin >> b; cout << "Introduce lado c: "; cin >> c; A = acos((b*b+c*c-a*a)/(2*b*c))*180/PI; B = acos((a*a+c*c-b*b)/(2*a*c))*180/PI; C = acos((a*a+b*b-c*c)/(2*a*b))*180/PI; if(A == 90 || B == 90 || C == 90) cout << "El triangulo es rectangulo. "; if(A < 90 && B < 90 && C < 90) cout << "El triangulo es acutangulo. "; if(A > 90 || B > 90 || C > 90) cout << "El triangulo es obtusangulo. "; cout << "\nY sus angulos son: A:" << A << " , B:" << B << " y C:" << C;

cin.get();cin.get();
}

Para calcular los ngulos utilizamos la ley de cosenos, de hecho en el anterior tambin lo utilizamos pero no completamente (la ley de cosenos es una ampliacin del teorema de pitgoras). La ley de cosenos la vemos comnmente como:
a2 =

b2 +

c2 -2(b*c)*cos(A)

Si
cos(A)

la
=

despejamos
(b +
2

en
c 2

cos(A),
a)
2

nos
/

queda:
2(b*c)

Si
A

despejamos
=

(o

sea
c2 -

el

ngulo),
a2 /

obtenemos:
2(b*c))

arccos(b2 +

Que es lo que utilizamos calcular los ngulos, lamentablemente la funcin que nos da C+ + en su libreramath.h, acos() nos devuelve el resultado en radianes. Para convertirlo a grados solo tenemos que multiplicar el resultado por 180/PI. Ahora que ya tenemos los tres ngulos de nuestro tringulo, es facilsimo saber cuando es cada tipo de tringulo. La funcin acos() est en la librera math.h y sirve para encontrar el arco coseno. En esta librera hay muchas funciones muy tiles: math.h Otro detalle sencillo pero que no habamos visto es el asunto de PI. Al principio del programa nos encontramos con:
#define PI 3.14159265

Esto significa que estamos declarando una constante con el nombre PI y con un valor de 3.14159265. Una constante, como su nombre lo indica, nunca cambia a lo largo del programa. Bueno, pues fue un programa bastante entretenido, me gust hacerlo :)
9 Comentarios

Saber si un tringulo es rectngulo, acutngulo u obtusngulo en C++


Guardado en: Programas el 3 de octubre del 2010Etiquetas: tringulos

Emanuel por medio de un comentario me pidi ayuda para hacer un programa en c+ + que nos dijera si un tringulo es rectngulo, acutngulo u obtusngulo pidiendo solamente los lados. El programa me pareci interesante de hacer y pues lo hice :) El programa resulta bastante sencillo, pero para deducir cmo hacerlo est un poco complicado. Veamos la siguiente imgen:

El tringulo 1 es un clsico tringulo rectngulo. Si aumentramos el lado c de 5 a 6 obviamente el ngulo aumentara y por lo tanto sera un tringulo obtusngulo (2). Si

por el contrario, disminuyramos el lado de c 5 a 4, el ngulo disminuira y por lo tanto sera un tringulo acutngulo (3). Sabiendo esto veamos cmo se comporta Pitgoras en cada caso ( o sea no l, su teorema): Si despejamos su famoso teorema obtenemos que a2 + b2 c2 = 0. Veamos como se comporta este teorema en nuestro tringulo 1:
32 + 42 52 = 0

Listo!, ya sabemos que el tringulo es rectngulo, porque el teorema de Pitgoras slo sirve para tringulos rectngulos. Ahora con el tringulo 2 (obtusngulo):
32 + 42 62 = -11

Un nmero negativo! Con los tringulos obtusngulos el teorema de Pitgoras da nmeros negativos. Y por ltimo el tringulo 3 (acutngulo):
32 + 42 42 = 9

Un nmero positivo! Con los tringulos acutngulos el teorema de Pitgoras da nmeros positivos. Ahora que ya sabemos cmo identificar cada tringulo nos surge otro problema: El usuario slo va a introducir tres lados cualquiera, cmo saber cual es a, cual es b y cual es c? Pues no hay forma de saberlo, hay que hacer cada paso tres veces tomando el teorema como a2 + b2 c2, luego a2 + c2 b2 y al final b2 + c2 a2. Ahora si, veamos el programa: #include<iostream>
using namespace std;

int main()
{ int a, b, c, A, B, C; cout << "Introduce lado 1: "; cin >> a; cout << "Introduce lado 2: "; cin >> b; cout << "Introduce lado 3: "; cin >> c; A = (b*b+c*c-a*a); B = (a*a+c*c-b*b); C = (a*a+b*b-c*c); if(A == 0 || B == 0 || C == 0) cout << "El triangulo es rectangulo. "; if(A > 0 && B > 0 && C > 0) cout << "El triangulo es acutangulo. "; if(A < 0 || B < 0 || C < 0) cout << "El triangulo es obtusangulo. "; }

La nica parte no explicada es la de las condiciones. Si en cualquiera de los tres formas de tomar el teorema nos resulta 0 es rectngulo, por lo tanto se usa ||. Para ser acutngulo, las tres formas del teorema deben ser mayores a 0, se usa &&. Con una sola forma del teorema que resulte menor a 0 es obtusngulo, se usa ||. Para mayor informacin de esos operadores leer esto: Operadores lgicos es C++.

Cmo ven el programita? Est sencillo no? Tal vez despus haga una modificacin para que adems te calcule los ngulos del tringulo.
15 Comentarios

Cmo contar el nmero de veces que sucede algo


Guardado en: Prctica el 27 de septiembre del 2010Etiquetas: primos, variables

Bueno, en esta ocasin vamos a ayudarle a un comentarista de este blog con sus problemas, el me ha pedido un programa que cuente la cantidad de nmeros primos que hay en un rango, no se ha conformado con saber si un nmero es primo o no o con saber cmo mostrar los nmeros primos en un rango , as que le vamos a ayudar con la nica parte de su programa que le falta: saber cmo contar el nmero de veces que sucede algo. Para esto vamos a usar una variable tipo int (entero) que va a ir aumentando una unidad cada vez que ocurra ese algo que queremos contar. Veamos como funcionara un contador dentro de un ciclo: #include<iostream>
using namespace std;

int main()
{ int contador=0; for(int i=0; i<10; i++) contador++; }

cout << contador;

Obviamente esto muestra un 10 en pantalla. Porque la variable contador aumenta una unidad cada vez que el ciclo da una vuelta.
contador++; es lo mismo que contador = contador + 1;

Ahora veamos como funciona si agregamos una condicin: #include<iostream>


using namespace std;

int main()
{ int contador=0; for(int i=0; i<10; i++) { if(i==5) contador++; }

cout << contador;


}

Esto obviamente muestra en pantalla un 1, porque solo una vez i vale 5. Ahora con una condicin ms complicada: #include<iostream>
using namespace std;

int main()
{ int contador=0; for(int i=0; i<10; i++) { if(i%2==0) contador++; }

cout << contador;

Con el operador % se obtiene el residuo de la divisin de los dos nmeros entre los que est. Si la condicin es que i/2 tenga residuo un de 0, significa que estamos dejando pasar slo los nmeros pares, por lo que deber mostrarse en pantalla un 5. Qu fcil no?, ahora nuestro amigo ya tiene todo lo necesario para armar su programa.
3 Comentarios

Funcin delay() en C++


Guardado en: Programas el 24 de septiembre del 2010Etiquetas: funciones, time

Una funcin a veces til a veces no mucho es el delay(), sirve para hacer una pausa de n segundos. En algunos compiladores Borland esta funcin se incluye en la librera conio.h pero como aqu estamos del lado del software libre vamos a hacer nosotros mismos esta funcin. Primero veamos cmo se usa:
delay(variable_tipo_int);

es
int delay(secs);

decir:
secs=10;

o
delay(numero_entero);

es
delay(12);

decir: claro,
i =

Y
void for(int }

la
secs);

funcin
secs) time(NULL) !=

es
i;

esta:
{ time(NULL));

delay(int (time(NULL) +

La funcin time(NULL) nos devuelve el segundo exacto en que estamos. Si le sumamos cierta cantidad de segundos obtenemos una fecha en el futuro. En cada vuelta del ciclo se checa si esa fecha en el futuro es diferente a la fecha actual. En cuanto las dos fechas son iguales el ciclo acaba y el programa contina. Veamos como se usa en un programa en c++: #include<time.h> #include<iostream>
using namespace std; void delay(int secs) { }

for(int i = (time(NULL) + secs); time(NULL) != i; time(NULL));

int main()
{ int sec; cout << "Segundos a pausar?: "; cin >> sec;

delay(sec);

Para poder usar la funcin delay de esta forma es necesario ponerla en todos los programas en donde necesitemos usarla (ahora me doy cuenta que no he escrito mucho sobre funciones) e incluir siempre la librera #include<time.h> o #include<ctime>.
13 Comentarios

You might also like