Name : Filein Rommel Leon Birth Year : 1981 Country/City of birth : México/Oaxaca de Juárez Live in : México City. Mail & MSN: fileinleon [at ] gmail [dot] com University : Instituto Tecnológico de Oaxaca Profession : SoftwareDeveloper Hobbies : Photography, Basketball, Movies, Books, Gadgets, Travel, Open Source, Technology. Movies : Knight's Tale, The life is beautiful, August Rush, 7 Dias(Mexican), Matrix, The Pianist. Songs : La chispa adecuada(Heroes del Silencio), One(U2), Somewhere over the rainbow(Israel Kamakawiwo), Chan Chan(Buena Vista Social Club), Mesecina(Goran Bregovic), Something Inside (Jonathan Rhys Meyers). Books : The Alchemist(Paulo Cohelo), Travel to the center of the earth(Julio Verne), The Journeyer (gary Jennings), Iliada(Homero),
Hace unos días me contacto un alumno de un COBAO(Colegio de Bachilleres) de Oaxaca, bachillerato dónde estudié hace algunos ayeres, pidiéndome que le asesorara con la resolución de algunos problemas de programación, por lo que le eché la mano ya que le habían pedido que resolviera algunos problemas simples de programación en C/C++ en su materia de informática y a la edad de 15 ó 16 años muy pocos son duchos con este lenguaje de programación - a menos que sean como Xiam que es un chavo que desde corta edad se le ha dado la programada, linuxeada y demás-.
Por lo que le pedí que me enviara las dudas para ayudarle a resolverlas, cabe mencionar que también tiene años que no programaba en C/C++ pues me he dedicado al desarrollo de aplicaciones web con PHP y AJAX, al igual que desarrollo de aplicaciones para móviles con .Net, por lo que me sirvió resolver estos problemas como recordatorio de C/C++.
Los problemas son los siguientes:
1.- Diseñar un programa que a partir de la fecha introducida por teclado con el formato día, mes, año se obtena el siguiente día considerando el año bisiesto.
int main(int argc, charargv) { char *fecha; if(argc>1){
fecha = malloc(strlen(argv[1]));
strcpy(fecha, argv[1]); }else{ char dato[10]; printf("fecha:");
scanf("%s", dato);
fecha = malloc(strlen(dato));
strcpy(fecha, dato); }
validaFecha(fecha);
getch(); }
validaFecha(char *fecha){ int datos[2]; char *ptr; int count = 0; int error = 0;
ptr = strtok(fecha,"/"); while(ptr != NULL) {
datos[count++] = atoi(ptr);
ptr = strtok(NULL, "/"); } //Enero, Febrero, Marzo, Abril, Mayp, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre if(count!=3){ printf("Error en el formato de fecha...\nHelp :\nFormato del programa\nnextDay dia/mes/anio\n\nEjemplo: nextDay 12/12/2009");
error++; }else{ if(datos[1]>0 && datos[1]<=12){ if( datos[1]==1 || datos[1]==3 || datos[1]==5 || datos[1]==7 || datos[1]==8 || datos[1]==10 || datos[1]==12){ if(datos[0]>0 && datos[0]<=31){ if(datos[0]==31){
datos[0]=1; if(datos[1]<12){
datos[1]++; }else{
datos[1]=1;
datos[2]++; } }else{
datos[0]++; } }else{ printf("Error en el dia de la fecha");
error++; } }else{ if( datos[0]>0 && ((datos[0]<=30 && datos[1]!=2) || ( datos[0]<=29 && datos[1]==2 && datos[2]%4==0) || (datos[0]<=28 && datos[1]==2 && datos[2]%4!=0))){ if(datos[0]==30 && datos[1]!=2){
datos[0]=1;
datos[1]++; }else{ if(datos[1]==2){ if((datos[0]==28 && datos[2]%4!=0) || (datos[0]==29 && datos[2]%4==0)){
datos[0]=1;
datos[1]++; }else{
datos[0]++; } }else{
datos[0]++; } } }else{ printf(" Error en el formato de la fecha introducida ");
error++; } } }else{ printf("%d Error en el mes", datos[1]);
error++; } if(error==0){ printf("Dia siguiente: %d / %d / %d\n", datos[0], datos[1], datos[2]); }
getch(); } }
2.- Obtener el número de combinaciones de m elementos tomado de n en n es: (m/n) = m!/(m!(m-n)!) que permita calcular el numero de combinaciones de (m/n)
int main(int argc, char argv) { int m = 0 ; int n = 0; int result = 0; if(argc>2){
m = atoi(argv[1]);
n = atoi(argv[2]); }else{ printf("m:");scanf("%d", &m); printf("n:");scanf("%d", &n); } if(n<=m){
result = factorial(m)/ ( factorial(n) * factorial(m-n)) ; printf("\nCombinacion de %d elementos tomados de %d : %d", m, n, result); }else{ printf("Error el valor de [n] no puede ser mayor que el valor de [m]"); }
getch(); }
int factorial(int numero){ int i = 1; int value = numero; for(i=1 ;i<numero; i++){
value = value * i ; } return value; }
3.- Diseñar un programa que transforme un numero introducido en formato decimal y lo convierta en notación romana, el número debe ser positivo y no excederse de 3000.
int main(int argc, charargv) { int numero = 0 ; if(argc>1){
numero = atoi(argv[1]); }else{ printf("Numero :");
scanf("%d", &numero); } if(numero>=0 && numero<=3000){
romanos(numero); }else{ printf("Error en el valor del numero introducido"); }
}
void romanos(int numero ){ int residuo = 0; int div = 0; char *a = ""; char *b = ""; char *c = "";
int i = 0; int value = 1000;
char *romano;
romano = (char *)malloc(sizeof(char)*100);
strcpy(romano, "");
while(numero>0 && value>0){
residuo = numero % value; if(residuo<numero){
div = ((numero-residuo)/value); switch(value){ case1000:
a = "M";
b = "/V";
c = "/X"; break; case100:
a = "C";
b = "D";
c= "M"; break; case10:
a = "X";
b = "L";
c = "C"; break; case1:
a = "I";
b = "V";
c = "X"; break; } if(div==9){
strcat(romano, a);
strcat(romano, c); }elseif(div==4){
strcat(romano, a);
strcat(romano, b); }elseif(div<5){ for(i=1;i<=div;i++){
strcat(romano, a); } }else{
strcat(romano, b); for(i=1;i<=(div-5);i++){
strcat(romano, a); } }//fin del si no es menor que 5 }//fin de si residuo menor que numero
numero = residuo;
value = value/10; }//fin del while printf("\nNumero Romano: %s\n", romano);
getch();
}//fin de la funcion
4.- Escribir un procedimiento recursivo que escriba un numero en base 10 a otro número en base entre 2 y 9.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> void getBase(int decimal, int base );
int main(int argc, char argv) { int decimal = 0 ; int base = 0; if(argc>2){
decimal = atoi(argv[1]);
base = atoi(argv[2]); }else{ printf("decimal:");
scanf("%d", &decimal);
printf("base:");
scanf("%d", &base); } if(base>=2 && base <=9){
getBase(decimal,base); }else{ printf("La base debe estar entre 2 y 9"); }
}
void getBase(int decimal, int base ){ //printf("%d::%d", decimal, base); int residuo = 0; int entero = decimal; char *result; char *temp;
result = (char *)malloc(sizeof(char)*100);
strcpy(result, "");
strcpy(temp, "");
while(decimal>=base){
residuo = decimal % base;
itoa(residuo, temp, 10);
strcat(result, temp);
decimal = (decimal-residuo) / base; }
itoa(decimal, temp, 10);
strcat(result, temp);
result = strrev(result); printf("El numero decimal %d en base %d es %s",entero, base, result );
getch(); }
5.- Procedimiento recursivo que permita invertir una cadena.
8.- Suponiendo que existen N ciudades en la red ferroviaria de un pais y que sus nombres están almacenados en un vector llamado Ciudad. Diseñar un programa que lea los nombres de las Ciudades y muestre con que ciudades esté enlazada.
int main(int argc, char argv) { int numCiudades = 0 ; int result = 0; if(argc>1){
numCiudades = atoi(argv[1]); }else{ printf("Ciudades:");
scanf("%d", &numCiudades); }
if(numCiudades>1){
ferroviaria(numCiudades); }else{ printf("Introduzca más de una ciudad"); } }
int ferroviaria(int numCiudades){ int i = 0; int j = 0; char *ciudades[numCiudades]; char ciudad[1024];
strcpy(ciudad, ""); int *rutas = (int *)malloc(sizeof(int)*numCiudades*numCiudades);
for(i=0; i<numCiudades; i++){ printf("\nCiudad [ %d ]", i+1) ;
gets(ciudad);
ciudades[i] = (char *)malloc(strlen(ciudad)*sizeof(char));
strcpy(ciudades[i], ciudad); for(j=0;j<numCiudades;j++){
rutas[(i*numCiudades)+j] = rand()%2;//1 si hay conexion de ruta, 0 no hay ruta de conexión if(rutas[(j*numCiudades)+i]==1|| rutas[(j*numCiudades)+i]==0){
rutas[(i*numCiudades)+j] =rutas[(j*numCiudades)+i]; } } } printf("\nTabla de Ciudades y Rutas\n\t"); for(i= 0; i<numCiudades; i++){ printf("%s\t", ciudades[i]); } printf("\n"); for(i= 0; i<numCiudades; i++){ printf("%s\t", ciudades[i]); for(j= 0; j<numCiudades; j++){ printf("%d\t ", rutas[(i*numCiudades)+j]); } printf("\n"); }
10.- Una empresa de venta de productos por correo desea realizar una estadística de las ventas realizadas de cada uno de los productosa lo largo del año. Distribuye un total de 100 productos, por lo que las ventas se pueden almacenar en una tabla de 100 filas y 12 columnas. Se desea conocer:
a) El total de venta de cada uno de los productos.
b) El total de ventas de cada mes.
c) El producto más vendido de cada mes.
d) El nombre, el mes y la cantidad de producto más vendido.
void ventas(){ int i,j; int *ventasMP = (int *)malloc(sizeof(int)*12*103); int productos = 100; int mes = 12; int totalProducto = 0; int productoMV = 0; int mesMV = 0; int cantidadMV=0; printf("\n Listado de Ventas\n\n"); printf("\n\t\tEne\tFeb\tMar\tAbr\tMay\tJun\tJul\tAgo\tSep\tOct\tNov\tDec\tTotaln"); for(i = 0; i<productos; i++){ printf("\nProducto[%d]\t", i+1);
totalProducto = 0; for(j=0;j<mes;j++){
ventasMP[(i*mes)+j] = rand()%100;//numeros aleatorios entre 0 y 99; printf("%d\t", ventasMP[(i*mes)+j]);
totalProducto += ventasMP[(i*mes)+j];
ventasMP[(100*12)+j]+= ventasMP[(i*mes)+j]; if(ventasMP[(101*12)+j]<=ventasMP[(i*mes)+j]){
ventasMP[(101*12)+j]= ventasMP[(i*mes)+j];
ventasMP[(102*12)+j]= i; } if(cantidadMV<=ventasMP[(i*mes)+j]){
cantidadMV = ventasMP[(i*mes)+j];
mesMV = j;
productoMV = i; } } printf("%d\t", totalProducto); } printf("\nVta/Mes\t\t"); for(i=0;i<mes;i++){ printf("%d\t", ventasMP[(100*12)+i]); } printf("\nProd/Ven\t"); for(i=0;i<mes;i++){ printf("P%d[%d]\t", ventasMP[(102*12)+i], ventasMP[(101*12)+i]); } printf("\n\nProducto mas vendido: %d", productoMV); printf("\nMes: %d", mesMV); printf("\nCantidad: %d", cantidadMV);
getch(); }
11.- Una empresa tiene almacenados a sus vendedores en un registro, por cada vendedor se guarda su DNI, apellidos, nombre, zona, sueldo base, ventas mensuales, total anual y comisión. Las ventas mensuales será un vector de 12 elementos que guardará las ventas realizadas en cada uno de los meses. Total anual será la suma de las ventas mensuales del vendedor. La comisión se calculará aplicando un porcentaje variable al total de venta anual de cada vendedor. Dicho porcentaje variará según las ventas anuales del vendedor, según la siguiente tabla.
hasta 1,500,000.00 0.00 %
más de 1,500,000.00 y hasta 2,150,000.00 13.75
más de 2,150,000.00 y hasta 2,900,000.00 16.50
más de 2,900,000.00 y hasta 3,500,000.00 17.60%
más de 3,350,000.00 18.85%
Dicha tabla se habrá de cargar de un archivo secuencial que contiene tanto el límite superior como el porcentaje.