Foro de elhacker.net

Programación => Ejercicios => Mensaje iniciado por: Cobac en 6 Julio 2004, 06:54 am



Título: Soluciones ejercicios C
Publicado por: Cobac en 6 Julio 2004, 06:54 am
En este tema se irán añadiendo las soluciones a los ejercicios de C,  los usuarios que tengais vuestra solución crear un tema nuevo y pronto será unido y ordenado en este tema.

Si quereís hacer alusión a alguna solución, el titulo del mensaje ponerlo de esta forma:

Citar
100 - C Solución cokeing

asi se ve enseguida el número del ejercicio, el lenguaje y la solución a la que haceis referencia (de ahi lo de poner el nick :P)

salu2


Título: Soluciones ejercicios C 100
Publicado por: Cobac en 6 Julio 2004, 06:55 am
Soluciones al ejercicio 100

codigo de Cokeing:

Código:
/***************************************************/
/****************************** EJ_100 *************/
/***************************************************/
/*                              cokeing@gmail.com  */
/***************************************************/


#include <stdio.h>
main(){

float x;
int y=0;
char sis;

do{
        printf("Introduce temperatura, con F o C adelante. ej: 'F78.3' o 'C25.2' -> ");
        scanf("%c%f",&sis,&x);

        if(sis=='F') {
                x=(5/9.)*(x-32);
                printf("  >> La Temperatura en Celsius es: %1.1f\n\n",x);
                y=1;
        }

        if(sis=='C') {
                x=(x+(160/9.))/(5/9.);
                printf("  >> La Temperatura en Farenheit es: %1.1f\n\n",x);
                y=1;
        }
getchar();
}while(y==0);
}

codigo de Cobac:
Código:
#include <stdio.h>

main()
{
int cat;
float temp, sol;

temp=0, cat=0;

    printf("Escribe temperatura\n");
    scanf("%f", &temp);
   
    printf("1.-De Celsius a Farenheit\n");
    printf("2.-De Farenheit a Celsius\n");
    scanf("%d", &cat);
   
   
    switch(cat){
   
    case 1:
        sol =(temp+(160/9.))/(5/9.);
        printf("Son %.2f grados Farenheit", sol);
    break;
   
    case 2:
        sol = (5/9.)*(temp-32);
        printf("Son %.2f grados Celsius", sol);
    break;
   
    default:
        printf("\n\nAprende a escribir xDD\n");
    break;
   
    }
   
    getchar();
    getchar();
}

Código de kasswed

Código:
#include <stdio.h>

float convertiraC (float grados);
float convertiraF (float grados);

main()
{
      float temperatura;
      char opcion;
      float convertido;
      printf("Introduce una temperatura: ");
      scanf("%f", &temperatura);
      fflush(stdin);
      printf("\nSi la temperatura esta en Celsius pon una 'c', si esta Farenheit, pon una 'f': ");
      scanf("%c", &opcion);
      fflush(stdin);
      if ( (opcion == 'c') || (opcion == 'C') ){
         convertido = convertiraF (temperatura);
         printf("\nLa temperatura en grados Celsius es %.2f y en Farenheit es %.2f", temperatura, convertido);
         }
      else if ((opcion == 'f') || (opcion == 'F')){
         convertido = convertiraC (temperatura);
         printf("\nLa temperatura en grados Farenheit es %.2f y en Celsius es %.2f", temperatura, convertido);
         }
      else printf("\nCaracter incorrecto o paso incorrecto.");
      getchar();
      getchar();
}

float convertiraF (float grados){
    return (grados+(160/9))/(5/9.);
    }
float convertiraC (float grados){
    return (5/9)*(grados-32);
    }


Título: Soluciones ejercicios C 101
Publicado por: Cobac en 7 Julio 2004, 03:48 am
Soluciones al ejercicio 101

Código de SCYUK:

Código:
#include <stdio.h>
main()
{
float total;
int num;
num=0;
total=0;

printf("\nIntroduce el presupuesto que posee tu bolsillo en monedas de un centimo:\n");
scanf("%d",&num);
total=total+(num*0.01);

printf("\nIntroduce el presupuesto que posee tu bolsillo en monedas de dos centimos:\n");
scanf("%d",&num);
total=total+(num*0.02);

printf("\nIntroduce el presupuesto que posee tu bolsillo en monedas de cinco centimos:\n");
scanf("%d",&num);
total=total+(num*0.05);

printf("\nIntroduce el presupuesto que posee tu bolsillo en monedas de diez centimos:\n");
scanf("%d",&num);
total=total+(num*0.10);

printf("\nIntroduce el presupuesto que posee tu bolsillo en monedas de veinte centimos:\n");
scanf("%d",&num);
total=total+(num*0.20);

printf("\nIntroduce el presupuesto que posee tu bolsillo en monedas de cincuenta centimos:\n");
scanf("%d",&num);
total=total+(num*0.50);

printf("\nIntroduce el presupuesto que posee tu bolsillo en monedas de un euro:\n");
scanf("%d",&num);
total=total+(num*1);

printf("\nIntroduce el presupuesto que posee tu bolsillo en monedas de dos euros:\n");
scanf("%d",&num);
total=total+(num*2);

printf("\nIntroduce el presupuesto que posee tu bolsillo en billetes de cinco euros:\n");
scanf("%d",&num);
total=total+(num*5);

printf("\nIntroduce el presupuesto que posee tu bolsillo en billetes de diez euros:\n");
scanf("%d",&num);
total=total+(num*10);

printf("\nIntroduce el presupuesto que posee tu bolsillo en billetes de veinte euros:\n");
scanf("%d",&num);
total=total+(num*20);

printf("\nIntroduce el presupuesto que posee tu bolsillo en billetes de cincuenta euros:\n");
scanf("%d",&num);
total=total+(num*50);


printf("\nIntroduce el presupuesto que posee tu bolsillo en billetes de cien euros:\n");
scanf("%d",&num);
total=total+(num*100);

printf("\nIntroduce el presupuesto que posee tu bolsillo en billetes de doscientos euros:\n");
scanf("%d",&num);
total=total+(num*200);

printf("\nIntroduce el presupuesto que posee tu bolsillo en billetes de quinientos euros:\n");
scanf("%d",&num);
total=total+(num*500);

printf("\nEl total de tu dinero es %f euros.\n",total);
}

Código de Cobac:

Código:
#include <stdio.h>

main()
{
int x=0;
float total=0;
int monedas[]={50000,20000,10000,5000,2000,1000,500,200,100,50,20,10,5,2,1};
int tipomon[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

    for(x=0; x < 15; x++)
    {
        if(monedas[x] >= 100)
        {               
                if(monedas[x] >= 100 && monedas[x] <= 200)
                {
                                printf("Cuantas monedas de %i euros\n", monedas[x]/100);
                                scanf("%i", &tipomon[x]);
                }
                else
                {
                                printf("Cuantos Billetes de %i euros\n", monedas[x]/100);
                                scanf("%i", &tipomon[x]);
                }
        }
        else
        {
                printf("Cuantas monedas de %i centimos\n", monedas[x]);
                scanf("%i", &tipomon[x]);
        }
    }
   
    for(x=0; x < 15; x++)
    {
        total = total + monedas[x]*tipomon[x];
    }
       
    printf("La suma total es: %.2f euros\n\n", total/100);
       
getchar();
getchar();
}

Código de cokeing:

Código:
/***************************************************/
/****************************** EJ_101 *************/
/***************************************************/
/*                              cokeing@gmail.com  */
/***************************************************/

#include <stdio.h>
main(){
float mon;
int billetes[15]={1,2,5,10,20,50,100,200,500,1000,2000,5000,10000,20000,50000};
int x,temp;

for(x=0;x<15;x++){
   printf("Introduce cantidad de la siguiente moneda >> ");
    if(billetes[x]<100) printf("%d centimos: ",billetes[x]);
    else printf("%d euros: ",(billetes[x]/100));
   scanf("%d",&temp);
   mon+=temp*billetes[x];
}

printf("\nTotal >> %1.0f euros",(mon/100));

x=mon/100;
mon=mon-x;
mon=mon/1000;
printf(" y %1.0f centimos.",mon);
}


Título: Soluciones ejercicios C 102
Publicado por: Cobac en 7 Julio 2004, 03:50 am
Soluciones al ejercicio 102


Código de Cobac:

Código:
#include <stdio.h>

main()
{
int num=0, bin[80], x=0, t=0;

    printf("Introduce el numero\n");
    scanf("%i", &num);
   
    //Ya se que esto es trampa, pero asi todos aprendemos xD
   
    printf("\nEn hexadecimal: ");
    printf("%x",num);
   
    for(x=0; num >= 1; x++)
    {
        bin[x] = num%2;
        num = num/2;
    }
   
    printf("\nEn binario: ");
   
    for(t=x-1; t >= 0; t--)
    {
        printf("%i", bin[t]);
    }
   
    printf("\n");
           
getchar();
getchar();
}

Código de Charlie:

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  int dec,bin[24],i,aux,rest;
  char hex[6],let;
  printf ("\t\tPROGRAMA TRANSFORMADOR NUMEROS\n");
  printf ("\t\t******************************\n\n");
  printf ("\t\tA continuacion te pediremos que introduzcas un numero y te\n");
  printf ("\t\tdiremos su valor en decimal y hexadecimal\n\n");
  printf ("\t\tPulsa una tecla para continuar...\n");
  getchar();
  system("clear");
  printf("Introduce un numero en decimal(mayor que 0 y menor que 10.000.000):");
  scanf("%d",&dec);
  fflush(stdin);
  if (dec<0 || dec>10000000) {
    do {
          printf("Numero incorrecto.Introduzca numero valido (0-10.000.000):");
          scanf("%d",&dec);
          fflush(stdin);
          }while (dec<0 || dec>10000000);
  }
  aux=dec;
  for(i=0;i<24;i++) {
    rest=aux%2;
    bin[i]=rest;
    aux=aux/2;
  }
  printf("El numero en binario es: ");
  for (i=23;i>=0;i--) {
    printf("%d ",bin[i]);
  }
  aux=dec;
  for(i=0;i<7;i++) {
    rest=aux%16;
      if(rest==0)
        let='0';
      if(rest==1)
        let='1';
      if(rest==2)
        let='2';
      if(rest==3)
        let='3';
      if(rest==4)
        let='4';
      if(rest==5)
        let='5';
      if(rest==6)
        let='6';
      if(rest==7)
        let='7';
      if(rest==8)
        let='8';
      if(rest==9)
        let='9';
      if(rest==10)
        let='A';
      if(rest==11)
        let='B';
      if(rest==12)
        let='C';
      if(rest==13)
        let='D';
      if(rest==14)
        let='E';
      if(rest==15)
        let='F';
      hex[i]=let;
      aux=aux/16;
  }
  printf("\nEl numero en hexadecimal es: ");
  for (i=6;i>=0;i--) {
    printf("%c ",hex[i]);
  }
  return 0;
}

Código de TheZen:

Código:
/* Ejercicio 102: Escribir un programa que solicite una cantidad
    entera en formato decimal y la convierta a binario y hexadecimal
   Estado: Terminado
*/

#include <stdio.h>

void binario(int num);
void hex(int num);

main()
{
    int num;
    printf("Escribe un numero decimal: ");
    scanf("%d",&num);
    binario(num);
    printf("\n");
    hex(num);
    getchar();
}

void binario(int num)
{
    int bin[32];
    int x=0;
   
    printf("[+] Numero en binario: ");
    while( num!=0 )
    {
        bin[x] = num % 2;
        num /= 2;
        x++;
    }
    x--;
    for( ; x>=0 ; x-- )
    {
        if( (bin[x]==1)||(bin[x]==0) ) printf("%d",bin[x]);
    }
}   

void hex(int num)
{
    int hex[32];
    int x=0;
   
    printf("[+] Numero en hexadecimal: ");
    while( num>0 )
    {
        hex[x] = num % 16;
        num /= 16;
        x++;
    }
    x--;
    for( ; x>=0 ; x-- )
    {
        if(hex[x]==10) printf("A");
        else if(hex[x]==11) printf("B");
        else if(hex[x]==12) printf("C");
        else if(hex[x]==13) printf("D");
        else if(hex[x]==14) printf("E");
        else if(hex[x]==15) printf("F");
        else printf("%d",bin[x]);
    }


Título: Soluciones ejercicios C 103
Publicado por: Cobac en 7 Julio 2004, 03:52 am
Soluciones al ejercicio 103

Código de Cobac:

Código:
#include <stdio.h>
#include <math.h>

main()
{
float raiz=0, sol1=0, sol2=0, A=0, B=0, C=0;

    printf("Siendo Ax^2+Bx+C=0\n");
    printf("Escribe los valores de A, B y C separados por un espacio:\n");
    scanf("%f %f %f", &A, &B, &C);
   
    if(A == 0)
    {
        sol1= (-C)/B;
       
        printf("El valor de X es %.2f\n", sol1);
    }
    else if(B == 0)
    {
        raiz = (-C)/A;
       
        if(raiz < 0)
                printf("ERROR, raiz negativa");
        else
        {       
                raiz = sqrt(raiz);
                printf("Los valores de X son %.2f y %.2f\n\n", raiz, -raiz);
        }
    }
    else if(C == 0)
    {
        sol1 = (-B)/A;
        printf("Los valores de X son 0 y %.2f\n\n", sol1);
    }
    else
    {
        raiz = pow(B,2)-4*A*C;
       
        if(raiz < 0)
                printf("ERROR, raiz negativa");
               
        else
        {
        raiz = sqrt(raiz);
   
        sol1 = (-B+raiz)/(2*A);
   
        sol2 = (-B-raiz)/(2*A);
   
        printf("Los valores son:\nx=%.2f y x=%.2f", sol1, sol2);
        }
    }

getchar();
getchar();
}

Código de TheZen:

Código:
/*
   Ejercicio 103: Escribir un programa que solicite tres números reales A, B y C
   y calcule Ax2+Bx+C=0
   Estado: Terminado
*/


#include <stdio.h>
#include <math.h>

main()
{
    float A,B,C;
    float D, raiz, B2;
    float x1, x2;
   
    printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \n");
    printf(" ~  Programa que calcula la ecuacion:   ~ \n");
    printf(" ~            Ax2+Bx+C=0                ~ \n");
    printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \n\n");
   
    printf(" - Escribe A: ");
    scanf("%f",&A);
    printf(" - Escribe B: ");
    scanf("%f",&B);
    printf(" - Escribe C: ");
    scanf("%f",&C);
   
    B = 0 - B;
    B2 = B*B;
    raiz = B2 - 4 * A * C;
    if( raiz < 0 )
    {
        printf("[!] No tiene solucion porque no se puede hacer la raiz cuadrada de un numro negativo.\n");
        exit( 1 );
    }   
    raiz = sqrt( raiz );
    D = 2*A;
    x1 = (B + raiz) / D;
    x2 = (B - raiz) / D;

    printf(" +------------------+ \n");
    printf("   x1 = %f            \n",x1);
    printf("   x2 = %f            \n",x2);
    printf(" +------------------+ \n");
   
    getchar();
}

Código de kasswed:

Código:
#include <stdio.h>
#include <math.h>

main()
{
      float A, B, C, res1,res2, raiz1, raiz2;
      printf("Introduce A: ");
      scanf("%f", &A);
      fflush(stdin);
      printf("\nIntroduce B: ");
      scanf("%f", &B);
      fflush(stdin);
      printf("\nIntroduce C: ");
      scanf("%f", &C);
      raiz1 = pow(B,2)-(4*A*C);
            if ( raiz1 < 0){
               printf("\nLa raiz es negativa, el programa no puede continuar.");
               getchar();
               getchar();     
               }
            else {
               raiz2 = sqrt(pow(B,2)-(4*A*C));
               res1 = (0-B + raiz2) / (2*A);
               printf("\nx = %f", res1);
               res2 = (0-B - raiz2) / (2*A);
               printf("\nx = %f", res2);
             getchar();
             getchar();
               }
}


Título: Soluciones ejercicios C 104
Publicado por: Cobac en 7 Julio 2004, 03:54 am
Soluciones al ejercicio 104

Código de Cobac:

Código:
#include <stdio.h>

main()
{
int ano=0, rest=0;

    printf("Introduce el año: ");
    scanf("%d", &ano);
   
    if(ano < 0)
        printf("Años negativos no\n");
       
    else
    {
        rest = ano%4;
       
        if(ano%100 == 0 && ano%400 != 0)
                printf("El año %d no es bisiesto\n", ano);
               
        else if(rest == 0 && ano%100 != 0 || (ano%400 == 0 && ano%100 == 0))
                printf("El año %d es bisiesto!!\n", ano);
       
        else
                printf("El año %d no es bisiesto\n", ano);
    }
   
getchar();
getchar();
}


Código de kasswed:

Código:
#include <stdio.h>

main()
{
      int ano;
      printf("Introduce un año: ");
      scanf("%i", &ano);
      fflush(stdin);
      if ( ( ano % 4 == 0) && (ano % 100 != 0) || ano % 400 == 0){
           printf("\nEl año %i es bisiesto.", ano);
           }
      else {
           printf("\nEl año %i no es bisiesto", ano);
           }         
      getchar();
      getchar();
}


Título: Soluciones ejercicios C 105
Publicado por: Cobac en 7 Julio 2004, 03:55 am
Soluciones al ejercicio 105

Código de Cobac:

Código:
#include <stdio.h>

#define CANTIDAD 100

main()
{

int x=0, y=0, num=0, rest=0, t=0, prim[100], cont=0;

    for(x=0; x < CANTIDAD; x++)
    {
        for(y=1; y <= x; y++)
        {
                rest = num%y;
               
                if(num != y && y != 1 && rest != 0)
                        cont++;
        }
       
        if(cont > num-3)
        {
                prim[t] = num;
                t++;
        }
        num++;
        cont=0;
    }
   
    for(x=0; x < t; x++)
        printf("%d ", prim[x]);
   
getchar();
getchar();
}


Título: Soluciones ejercicios C 106
Publicado por: Cobac en 7 Julio 2004, 03:58 am
Soluciones al ejercicio 106

Código de neohex:

Código:
#include <stdio.h>

int main()
{
int i,num,resul;
printf("[+] Introduce un numero del 0 al 9: ");
scanf("%d", &num);
for(i=1;i<=10;i++){
    resul = num*i;
printf("%d x %d = %d\n",num,i,resul);
}
return 0;
}

Código de Mr.Potato:

Código:
#include <stdio.h>

int main() {
int tabla,i;

printf("introduce un numero del 1 al 9:\n");
scanf("%d",&tabla);
if (tabla < 1 || tabla > 9) {
printf("El numero tiene que ser mayor de 1 y menor que 9\n");
}
else {
for(i=1;i<=10;i++) {
printf("%d x %d = %d\n",tabla,i,tabla*i);
}
}
return 0;
}

Código de Cobac:

Código:
#include <stdio.h>

main()
{
int num=0, x=0;

    printf("Introduce un numero entre 1 y 9: ");
    scanf("%d", &num);
   
    if(num < 1 || num > 9)
        printf("Aprende a leer/escribir");
       
    else
    {
        for(x=1; x <= 10; x++)
        {
                printf("%d x %d = %d\n", num, x, num*x);
        }
    }
   
    getchar();
    getchar();
}


Código de 133_mHz_:

Código:
/* Escribir un programa que pregunte un número entero entre uno y 9 y genere la tabla de multiplicar de ese número */

#include <stdlib.h>
#include <stdio.h>

int main()
{

    int a, b, c;
   
    printf("Introduzca un numero (1-9): ");
    scanf("%i", &a);
   
    if(a>9)
    {
        printf("El numero introducido es: %i ", a);
        printf("introduzca un numero menor.\n\n");
    }
       
    else
    {   
        for(b=1;b<11;b++)
        {
                c=a*b;
                printf("%i x %i = %i\n", a, b, c);
        }
    }
    system("pause");
                   
return 0;
}


Código de kasswed:

Código:
#include <stdio.h>

main()
{
      int num, x, res;
      printf("Introduce un numero entre 1 y 9: ");
      scanf("%i", &num);
      if (num > 9 || num < 1){
              printf("\nEl numero introducido es mayor de 9 o menor que uno. El programa no puede continuar.");
              }
      else {
      for (x=1; x<=10; x++){
          printf("\n%i x %i = %i\n", num, x, res = num * x);
          }
          }
      getchar();
      getchar();
}


Título: Soluciones ejercicios C 124
Publicado por: Cobac en 7 Julio 2004, 03:59 am
Soluciones al ejercicio 124

Código de Cobac:

Código:
#include <stdio.h>

main()
{
float producto=0, entregado=0;
int entregar=0, rest=0, x=0;
int monedas[]={50000,20000,10000,5000,2000,1000,500,200,100,50,20,10,5,2,1};
int tipomon[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

    printf("Precio producto\n");
    scanf("%f", &producto);
   
    printf("Total entregado\n");
    scanf("%f", &entregado);
   
    entregado = entregado*100;
    producto = producto*100;
   
    if(entregado < producto)
    {
        printf("Diles que te paguen!!!");
    }
   
    entregar = entregado - producto;
   
    rest = entregar;
   
    for(x=0; rest > 0; x++)
    {
   
        while(rest >= monedas[x])
        {
                tipomon[x] = tipomon[x]+1;
                rest = rest - monedas[x];       
        }
    }
   
    for(x=0; x < 15; x++)
    {
        if(monedas[x] >= 100 && tipomon[x] != 0)
        {               
                if(monedas[x] >= 100 && monedas[x] <= 200)
                {
                                printf("Entregar %i monedas de %i euros\n", tipomon[x], monedas[x]/100);
                }
                else
                {
                                printf("Entregar %i Billetes de %i euros\n", tipomon[x], monedas[x]/100);
                }
        }
        else if(tipomon[x] != 0)
        {
                printf("Entregar %i monedas de %i centimos\n", tipomon[x], monedas[x]);
        }
    }
       
getchar();
getchar();
}


Título: Soluciones ejercicios C 107
Publicado por: Cobac en 7 Julio 2004, 04:00 am
Soluciones al ejercicio 107

Código de Cobac:

Código:
#include <stdio.h>

main()
{
int cant=0, num[80], media=0, x=0, y=0;

    printf("Dime la cantidad de numeros que quieres insertar: ");
    scanf("%d", &cant);
   
    if(cant <= 0)
        printf("Sin comentarios....");
       
    else
    {
        //rellenamos el array con números
       
        for(x=0; x < cant; x++)
        {
                printf("\nInserta el numero %d: ", x+1);
                scanf("%d", &num[x]);
        }
       
        for(x=0; x < cant; x++)
        {
                for(y=0; y < cant; y++)
                {
               
                /* Si ponemos > los ordena de mayor a menor
                   Si ponemos < los ordena de menor a mayor */
                   
                       if(num[x] < num[y])
                       {
                                 media = num[y];
                                 num[y] = num[x];
                                 num[x] = media;
                       }
                }
        }
       
        for(x=0; x < cant; x++)
                printf("\n%d ", num[x]);
    }
   
getchar();
getchar();
}


Título: Soluciones ejercicios C 108
Publicado por: Cobac en 7 Julio 2004, 04:02 am
Soluciones al ejercicio 108

Código de Cobac:

Código:
#include <stdio.h>
#include <stdlib.h>

#define NUMERO 5

main()
{
int x=0, elec=0;

typedef struct {

char nombre[15];

char direccion[15];

int telefono;} persona;

persona cliente[NUMERO];

    for(x=0; x < NUMERO; x++)
    {
        printf("\nIntroduce el nombre del cliente numero %d: ",x+1);
        scanf("%s", &cliente[x].nombre);

        printf("\nIntroduce la direccion del cliente numero %d: ",x+1);
        scanf("%s", &cliente[x].direccion);

        printf("\nIntroduce el telefono del cliente numero %d: ",x+1);
        scanf("%d", &cliente[x].telefono);
    }
   
    system("cls");
   
    do{
   
        printf("\n\nIntroduce el numero de la persona que quieres consultar (cero para salir): ");
        scanf("%d", &elec);
       
        if(elec != 0 && elec <= NUMERO)
        {       
                printf("\nNombre del cliente: %s", cliente[elec-1].nombre);

                printf("\nDireccion del cliente: %s", cliente[elec-1].nombre);
       
                printf("\nTelefono del cliente: %d", cliente[elec-1].nombre);
        }       
   
    }while(elec != 0);
}


Título: Soluciones ejercicios C 113
Publicado por: Cobac en 7 Julio 2004, 04:03 am
Soluciones al ejercicio 113

Código de neohex:

Código:
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MYPORT 4500 //Puerto que se deja a la escucha
#define NUBACK 5 //Numero maximo de conexiones a la espera.

int main()
{
int nSocket;
int nSocket2;
int nListen;
struct sockaddr_in my_dire;
struct sockaddr_in su_dire;
int sin_zero;

if ((nSocket=socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("[-] Socket");
exit(1);
}
my_dire.sin_family = AF_INET;
my_dire.sin_port = htons(MYPORT);
my_dire.sin_addr.s_addr = htonl(INADDR_ANY);
memset(&(my_dire.sin_zero), '\0', 8);
if (bind(nSocket, (struct sockaddr *)&my_dire, sizeof(struct sockaddr)) == -1)
{
perror("[-] Bind");
exit(1);
}
if ((nListen=listen(nSocket, NUBACK)) == -1)
{
perror("[-] Listen");
exit(1);
}
printf("[+] Listen iniciado.\n");
printf("\t-Escuchando el puerto %d.\n", MYPORT);
printf("\t-Esperando una conexion.\n");
sin_zero = sizeof(struct sockaddr_in);
if ((nSocket2=accept(nSocket, (struct sockaddr *)&su_dire, &sin_zero)) == -1)
{
perror("[-] Accept");
exit(1);
}
printf("[+] Conexion realizada.\n");
close(nSocket);
return 0;
}

Código de Mr.Potato:

Código:
#include <stdio.h>
#include <netinet/in.h>

int main() {

struct sockaddr_in saddr;
int hsock;

hsock=socket(AF_INET,SOCK_STREAM,0);
if (hsock<0) {
printf("Error creando el socket\n");
return -1;
}
saddr.sin_family=AF_INET;
saddr.sin_addr.s_addr=INADDR_ANY;
saddr.sin_port=htons(4500);
if (bind(hsock,(struct sockaddr *)&saddr,sizeof(saddr))<0) {
printf("Bind error\n");
return -1;
}
if (listen(hsock,1)<0) {
printf("Listen error\n");
return -1;
}
accept(hsock,0,0);
printf("FIN\n");
return 0;
}


Título: Re: Soluciones ejercicios C
Publicado por: Cobac en 7 Agosto 2005, 21:54 pm
Soluciones ejercicio 119

Código de TheZen:

Código:
/*
   Ejercicio 119
   Realizar un programa que solicite una máscara de subred y devuelva una ip válida.
*/

#include <stdio.h>

main()
{
    char subred[15], ip[15];
    int x[4], z;
   
    printf("+------------------------------------------------------------+\n");
    printf("    Escribe una mascara de subred. Pueden ser de 3 tipos:\n");
    printf("        A) XXX.0.0.0, B) XXX.XXX.0.0, C) XXX.XXX.XXX.0    \n");
    printf("      El programa devolverá una ip dentro de esa subred. \n");
    printf(" -> ");
    scanf("%s",&subred);
   
    sscanf(subred,"%d.%d.%d.%d",&x[0],&x[1],&x[2],&x[3]);
   
    for( z=0 ; z<4 ; z++ )
    {
        if( (x[z]>255) || (x[z]<0) )
        {
            printf("\n  [!] Error: La IP introducida no es correcta.\n");
            exit(1);
        }
    }       
       
    if( x[3] != 0 )
    {
        printf("\n  [!] Error: La IP introducida no corresponde a ningun tipo de subred.\n");
        exit(1);
    }   
   
    srand( time(NULL) );
    if( (x[1]==0) && (x[2]==0) && (x[3]==0) ){
        sprintf(ip,"%d.%d.%d.%d",x[0],rand()%256,rand()%256,rand()%256);
        printf("\n       [*] Subred de tipo A \n");
    }   
    else if( (x[2]==0) && (x[3]==0) ){
        sprintf(ip,"%d.%d.%d.%d",x[0],x[1],rand()%256,rand()%256);
        printf("\n       [*] Subred de tipo B \n");
    }
    else if( x[3]==0 ){
        sprintf(ip,"%d.%d.%d.%d",x[0],x[1],x[2],rand()%256);
        printf("\n       [*] Subred de tipo C \n");
    }
   
    printf("\n       [*] IP Generada: %s [*] \n",ip);
    printf("+------------------------------------------------------------+\n");
   
    getchar();
}


Título: Re: Soluciones ejercicios C
Publicado por: Cobac en 7 Agosto 2005, 21:55 pm
Soluciones ejercicio 125

Código de TheZen:

Código:
/*
   Nombre: b64
   Autor: Thezen
   Mail/msn: putoamo@gmail.com
   Descripcion: Aplicacion que permite Codificar/Descodificar en Base64
                Para codificar, añadirle el parámetro /c y para descodificar
                /d seguido de una cadena.
*/
   

#include <stdio.h>
#include <string.h>
#include <math.h>

int binario[1024];
int btd[8];
int cont=0;

char base64[] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
                  'P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d',
                  'e','f','g','h','i','j','k','l','m','n','o','p','q','r','s',
                  't','u','v','w','x','y','z','0','1','2','3','4','5','6','7',
                  '8','9','+','/' };

void atob(int num, int base); /* Convierte un valor ASCII a binario */
int btod( int base ); /* Convierte un valor binario a decimal */
void codificar(char *clave); /* Codifica una cadena a Base64 */
void descodificar(char *clave); /* Descodifica una cadena en Base64 */

int main(int argc, char *argv[])
{
    printf(" *--------------------------------------------*\n");
    printf("  \\   Codificador/Descodificador de Base64   /\n");
    printf("  /   By: TheZen    -    putoamo@gmail.com   \\ \n");
    printf(" *--------------------------------------------*\n");
   
    if( argc != 3 )
    {
        printf("\n Modo de uso: %s [/c /d] clave. \n",argv[0]);
        printf(" /c [cadena] - Codifica una cadena\n");
        printf(" /d [cadena] - Descodifica una cadena\n");
        exit( 1 );
    }
   
    if( (strcmp(argv[1],"/c")==0) || (strcmp(argv[1],"/C")==0) ) codificar(argv[2]);
    if( (strcmp(argv[1],"/d")==0) || (strcmp(argv[1],"/D")==0) ) descodificar(argv[2]);
   
    printf("\n");
}

/*************************************************************************/

void codificar(char *clave)
{
    int x=0, num, contador, b64, z=0;
    char clave2[1024];
                     
    sprintf(clave2,"%s",clave);
   
    while( 1 )
    {
        num = clave2[x];
        if(num==0) break;
        atob(num,8);
        x++;
        contador++;
    }   
    printf("\n");
    num=0;
    for(x=0;x<=((8*(contador-2)-1));x++)
        num++;
         
    cont=0;
    while( (num%6) != 0 )
        num++;
    num /= 6;
   
    printf("  [*] Codificado a Base64: ");
    for( x=1 ; x<=num ; x++ )
    {
        for( z=0 ; z<=5 ; z++ ){
            btd[z] = binario[cont];
            cont++;
        }   
        b64=btod(6);
        printf("%c",base64[b64]);   
    }
    while( (num%4)!=0 ){
        printf("=");   
        num++;
    }   
}

/*************************************************************************/

void descodificar(char *clave)
{
    char clave2[1024], deci;
    int x=0, z=0, decimal[1024], num, contador=0, dec;
                     
    sprintf(clave2,"%s",clave);
   
    while( clave[z] != '=' )
    {
        if( (clave2[z]==0) || (clave2[z]=='=') ) break;
        for( x=0 ; x<=64 ; x++ )
            if( base64[x] == clave2[z] ) decimal[z] = x;
        z++;
    }
    x=0;
    while( 1 )
    {
        num = decimal[x];
        if(num==0) break;
        atob(num,6);
        x++;
        contador++;
    }   
   
    num = 6*contador;
    num /= 8;
    printf("  [*] Descodificado en Base64: ");
    cont=0;
    for( x=1 ; x<=num ; x++ )
    {
        for( z=0 ; z<=7 ; z++ ){
            btd[z] = binario[cont];
            cont++;
        }   
        dec = btod(8);
        printf("%c",dec,dec);
    }
}   

/**************************************************************************/

void atob(int num, int base)
{
    int bin[base];
    int x=0;
   
    for( x=0 ; x<=(base-1) ; x++ )
    {
        bin[x] = num % 2;
        num /= 2;
    }
    for( x=(base-1) ; x>=0 ; x-- ){
        binario[cont] = bin[x];
        cont++;
    }   
}

/**************************************************************************/

int btod( int base )
{
    int b64=0;
    int x=0,z=0;
   
    for( x=(base-1) ; x>=0 ; x-- ){
        b64 += btd[x] * pow(2,z);
        z++;
    }     
    return b64;
}   

/*************************************************************************/