Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - HRSLASH

#1
Hola foreros. Tengo este codigo y lo que quiero es que devuelva 1 si el simbolo pasado a la funcion es alguno de los definidos arriba. Habia pensado en hacerle un corrimiento de bits dependiendo la posicion del bit encendido. por ej >> (int)sqrt(0x3FF % sym + 1) pero el problema es que este metodo no funciona con algunas constantes.. como puedo saber la posicion del bit encendido para moverlo y que si el argumento concuerde con alguna constante devuelva 1?



#define BACKSLASH 0x0001
#define SLASH     0x0002
#define COLON     0x0004
#define ASTERISK  0x0008
#define QUESTION  0x0010
#define QUOTES    0x0020
#define LESS      0x0040
#define GREATER   0x0080
#define PIPE      0x0100

int is_symbol(int sym)
{
    return ((BACKSLASH | SLASH | COLON | ASTERISK | QUESTION | QUOTES | LESS | GREATER | PIPE) & sym);
}



Gracias de antemano!  :D
#2
Programación C/C++ / Problema con realloc - c
5 Noviembre 2012, 01:51 AM
Hola foreros! asi como dice el titulo, estoy teniendo problemas al usar esta funcion, cada vez que ejecuto el programa el sistema lo aborta ya que alega que le estoy pasando un puntero invalido a realloc, he intentado varias cosas pero no hay caso, el error persiste.. Aca el codigo:


char *borrar_espacios(const char *s)
{
char *temp = NULL;
int i;

temp = (char *) malloc(sizeof(char));
for (i = 0; *s != '\0'; ++s)
if (!isspace(*s)){
temp = (char *) realloc(temp, sizeof(char));
*temp = *s, ++temp, ++i;
}
*temp = '\n';
return temp - i;
}


Gracias de antemano!  :D
#3
Programación C/C++ / Consulta punteros (C)
28 Agosto 2012, 06:37 AM
Hola gente! he aquí la consulta:
Tengo un sector de n unsigned char en la memoria reservado con malloc y para manejar los datos del sector uso otro puntero q apunte al inicio pero lo declaro como unsigned short pq quiero extraer los datos de a 2 bytes, he aqui la cuestion, cuando hago avanzar el puntero obviamente lo hace de a dos bytes, en ciertos casos quiero hacerlo avanzar de a un byte por lo que hago lo sig p = (unsigned char *)p + 1 , que funciona, pero el compilador me lanza la advertencia de que estoy asignando punteros de tipo incompatible lo cual es razonable. Hay alguna manera de hacerlo correctamente??
#4
Hola foreros!! Subo aqui un problema que tengo en un programa que estoy haciendo (no se si puede hacerse lo que quiero, hasta el momento no pude). El tema es el sig. desde una funcion llamo a otra que dentro declara un array estatico de punteros y muestre el dato relacionado con la posicion que le estoy pasando, el por que de declararlo estatico es para que no lo tenga que crear cada vez q vuelvo a entrar ya que la necesito en un bucle. Ahora quiero borrar el array estatico de la memoria ya q una vez salido del bucle no lo necesito mas, por eso devuelvo la direccion del array, pero cuando uso free() con la direccion de memoria devuelta en la funcion llamadora me tira error de memoria y aborta el programa. Repito, no se si se puede hacer lo que pretendo, por eso queria consultarlo con uds. Dejo aqui un ejemplo de lo que estoy tratando de lograr (No es el programa que estoy haciendo). Espero rtas y Gracias!! :)



void funcion1()
{
     int i;
     void *ptr = NULL;

     for (i = 0; i < 5; i++){
         if (ptr == NULL)
                 ptr = funcion2(i);
         else
                 funcion2(i);
     }

     free(ptr);
}

void *funcion2(int par)
{
     static char *str[] = {
     "UNO",
     "DOS",
     "TRES",
     "CUATRO",
     "CINCO"
     };

     printf("%s\n", str[par]);

     return &str;
}

#5
Hola foreros! dejo aqui un programa q hice basado en los graficos de tortuga. El programa recibe comandos q luego interpreta para dibujar sobre una matriz. Espero comentarios y sugerencias.
Saludos!

Código (cpp) [Seleccionar]


#include <iostream>
#include <iomanip>
using namespace std;

const int floor_size = 20;

void mainMenu(void);
void turtleGraphics(int [][floor_size], int []);

int main(void)
{
    const int max_command = 256;

    int floor[floor_size][floor_size] = {{false},{false}};
    int command[max_command] = {false};

mainMenu();

    cout << "\nEnter commands(max " << max_command << "): ";
    int i = 0;
    while (command[i - 1] != 9){
        cin >> command[i];
        i++;
    }
cout << "\n" << endl;
turtleGraphics(floor, command);

    return 0;
}

void mainMenu(void)
{
cout << "*****" << setw(20) << "Turtle Graphics" << setw(10) << "*****" << endl;
cout << "\nCommand" << setw(20) << "Meaning" << endl;
cout << setw(7) << "1" << setw(20) << "Pen up" << endl;
cout << setw(7) << "2" << setw(20) << "Pen down" << endl;
cout << setw(7) << "3" << setw(20) << "Turn right" << endl;
cout << setw(7) << "4" << setw(20) << "Turn left" << endl;
cout << setw(7) << "5,10" << setw(20) << "Move forward 10"
<< "\n" << setw(27) << "spaces (or a number" << "\n"
<< setw(27) << "other than 10)" << endl;
cout << setw(7) << "6" << setw(20) << "Print the" << "\n"
<< setw(15) << floor_size << "-by-" << floor_size
<< " array" << endl;
cout << setw(7) << "9" << setw(20) << "End of data" << "\n"
<< setw(27) << "(sentinel)" << endl;
}

void turtleGraphics(int flr[][floor_size], int cmd[])
{
int coord_x = 0, coord_y = 0, move = 0,
row, column, i = 0;
bool pen = false;

while (cmd[i] != 9){
//Uncoment next line to show coord_x and coord_y
//cout << "X: " << coord_x << "\nY: " << coord_y << endl;
switch(cmd[i]){
case 1: //Don't write
pen = false;
break;
case 2: //Write
pen = true;
break;
case 3: //Turn rigth
if (move == 3)
move = 0;
else
move++;
break;
case 4: //Turn left
if (move == 0)
move = 3;
else
move--;
break;
case 5: // Move turtle
i++;
switch(move){ //Nested switch (control direction)
case 0: //Move down
if ((cmd[i] + coord_y) > floor_size) //Check if it is in floor limits
cmd[i] = floor_size - coord_y - 1; //If not, set move to the limit

for (row = coord_y; row < (cmd[i] + coord_y); row++)
for (column = coord_x; column < coord_x + 1; column++)
flr[row][column] = pen;
coord_y = row;
break;
case 1: //Move rigth
if ((cmd[i] + coord_x) > floor_size) //Check if it is in floor limits
cmd[i] = floor_size - coord_x - 1; //If not, set move to the limit

for (row = coord_y; row < coord_y + 1; row++)
for (column = coord_x; column < (cmd[i] + coord_x); column++)
flr[row][column] = pen;
coord_x = column;
break;
case 2: //Move up
if (cmd[i] > coord_y) //Check if it is in floor limits
cmd[i] = floor_size - 1; //If not, set move to the limit

for (row = coord_y; row > (coord_y - cmd[i]); row--)
for (column = coord_x; column < coord_x + 1; column++)
flr[row][column] = pen;
coord_y = row;
break;
case 3: //Move left
if (cmd[i] > coord_x) //Check if it is in floor limits
cmd[i] = floor_size - 1; //If not, set move to the limit

for (row = coord_y; row < coord_y + 1; row++)
for (column = coord_x; column > (coord_x - cmd[i]); column--)
flr[row][column] = pen;
coord_x = column;
break;
default:
;
} //End nested switch
break;
case 6: // Print floor
for (int i = 0; i < 20; i++){
for (int j = 0; j < 20; j++){
if (flr[i][j] == true)
cout << setw(2) << "*";
else
cout << setw(2) << " ";
}
cout << endl;
}
break;
default:
;
}
i++;
}
}

#6
Hola gente del foro!! Estoy teniendo un problema para ordenar una lista simple, se q directamente podria insertar los nodos en forma ordenada, pero lo q quiero es ordenarlo al final para hacer un algoritmo q me ordene la lista.. El problema es q no se pq no me lo ordena correctamente.. No puedo encontrar el error.. usando un puntero auxiliar quiero extraer numeros de la lista e ir insertandolos ordenadamente en otra.. Espero q puedan ayudarme pq estoy volviendome loco..
aqui el codigo..


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

struct nodo{
    char data;
    struct nodo *nextPtr;
};

typedef struct nodo NODO;
typedef NODO *NODOPTR;

void insertNodo(NODOPTR *, char);
char deleteNodo(NODOPTR *, char);
int listLength(NODOPTR);
void ordenarAscendente(NODOPTR *, NODOPTR *);
void printLista(NODOPTR);

main()
{
    NODOPTR startPtr = NULL, startPtr2 = NULL;
    char value;
    int choice;

    printf("Ingrese una opcion: ");
    scanf("%d", &choice);

    while (choice != 4){
        switch (choice){
            case 1:
                printf("Ingrese una letra: ");
                scanf("%s", &value);
                insertNodo(&startPtr, value);
                printLista(startPtr);
                break;
            case 2:
                printf("Ingrese una letra para borrar: ");
                scanf("%s", &value);
                deleteNodo(&startPtr, value);
                printLista(startPtr);
                break;
            case 3:
                if(listLength(startPtr) == NULL)
                    printf("La lista no contiene elementos\n");
                else
                    printf("La lista contiene %d elementos\n", listLength(startPtr));
                break;
            default:
                printf("Opcion inexistente");
        }
        printf("Ingrese una opcion: ");
        scanf("%d", &choice);
    }

    ordenarAscendente(&startPtr, &startPtr2);
    printLista(startPtr2);

    return 0;
}





void insertNodo(NODOPTR *sPtr, char val)
{
    NODOPTR newPtr, previousPtr, currentPtr;

    newPtr = (NODO*)malloc(sizeof(NODO));

    if (newPtr != NULL){
        newPtr -> data = val;
        newPtr -> nextPtr = NULL;

        previousPtr = NULL;
        currentPtr = *sPtr;

        while (currentPtr != NULL){
            previousPtr = currentPtr;
            currentPtr = currentPtr -> nextPtr;
        }

        if (previousPtr == NULL){
            newPtr -> nextPtr = *sPtr;
            *sPtr = newPtr;
        }

        else{
            previousPtr -> nextPtr = newPtr;
            newPtr -> nextPtr = currentPtr;
        }
    }
    else
        printf("%s not inserted. Insuficient space", val);
}

char deleteNodo(NODOPTR *sPtr, char val)
{
    NODOPTR previousPtr, currentPtr, tempPtr;

    if (val == (*sPtr) -> data){
        tempPtr = *sPtr;
        *sPtr = (*sPtr) -> nextPtr;
        free(tempPtr);
        return val;
    }
    else{
        previousPtr = *sPtr;
        currentPtr = (*sPtr) -> nextPtr;

        while(currentPtr != NULL && currentPtr -> data != val){
            previousPtr = currentPtr;
            currentPtr = currentPtr -> nextPtr;
        }
        if(currentPtr != NULL){
            tempPtr = currentPtr;
            previousPtr -> nextPtr = currentPtr -> nextPtr;
            free(tempPtr);
            return val;
        }
    }

    return '\0';
}

int listLength(NODOPTR currentPtr)
{
    int cont = 0;

    if (currentPtr == NULL)
        return NULL;
    else{
        while (currentPtr != NULL){
            cont++;
            currentPtr = currentPtr -> nextPtr;
        }
    }

    return cont;
}

void ordenarAscendente(NODOPTR *sPtr, NODOPTR *sPtr2)
{
    NODOPTR auxPtr, previousPtr, currentPtr, tempPtr;

    //auxPtr = *sPtr;

    if (*sPtr == NULL)
        printf("No hay elementos en la lista\n");
    else{
        while (*sPtr != NULL){
            tempPtr = *sPtr;

            previousPtr = NULL;
            currentPtr = *sPtr2;

            while (currentPtr != NULL && tempPtr -> data > currentPtr -> data){
                previousPtr = currentPtr;
                currentPtr = currentPtr -> nextPtr;
                }

            if (previousPtr == NULL){
                tempPtr -> nextPtr = *sPtr2;
                *sPtr2 = tempPtr;
            }
            else{
                previousPtr -> nextPtr = tempPtr;
                tempPtr -> nextPtr = currentPtr;
            }

            free(tempPtr);
            *sPtr = (*sPtr) -> nextPtr;
        }
    }
}

void printLista(NODOPTR currentPtr)
{
    if (currentPtr == NULL)
        printf("La lista esta vacia");
    else{
        while (currentPtr != NULL){
            printf("|%c|->", currentPtr -> data);
            currentPtr = currentPtr -> nextPtr;
        }
    }
    printf("NULL\n");
}


Saludos!!
#7
Hola gente del foro!! Comparto un programita q hice q simula, como dice el titulo, la famosa carrera entre la tortuga y la liebre.. lo q represento en los vectores correspondientes a cada animal, son las acciones de los mismos en la carrera, q pueden ser avanzar, retroceder o quedarse dormido segun el num aleatorio q salga.. cuando ambos competidores compartan el mismo cuadro la tortuga mordera a la liebre.. y ovbiamente ganara el q 1ro llegue a la meta..
Bueno espero comentarios y sugerencias!!
Saludos!!

P.D: el codigo lo hice en linux por lo tanto el system("clear") tira error si no se ejecuta en ese OS


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 71

int printRace(int [][SIZE], int, int, int);

main()
{
    srand(time(NULL));
    int row, column, raceTrack[3][SIZE];
    int tortoise = 1, hare = 1, finish;

    printf("BANG!!%63s%ds\nAND THEY 'RE OFF!!\n\n", "Time: ", 0);
    finish = printRace(raceTrack, tortoise, hare, SIZE);

    if (finish == 1)
        printf("\nTORTOISE WINS\n");
    else if (finish == 2)
        printf("\nHare wins\n");
    else
        printf("\nIt's a tie\n");


    return 0;
}





int printRace(int rt[][SIZE], int t, int h, int size)
{
    void wait(int);

    int tortoiseArray[10] = {3, 3, 3, 3, 3, -6, -6, 1, 1, 1};
    int hareArray[10] = {0, 0, 9, 9, -12, 1, 1, 1, -2, -2};
    int timer = 1, row, column;

    while (t < size - 1 && h < size - 1){
        for (row = 1; row < 3; row++){
            for (column = 1; column < size; column++){
                if (t != h || t == 1){
                    if (row == 1 && column == t)
                        printf("%c", 'T');
                    else if (row == 2 && column == h)
                        printf("%c", 'H');
                    else
                        printf("_");
                }
                else{
                    if (row == 1 && column == t)
                        printf("%c", 'T');
                    else if (row == 2 && column == h)
                        printf("%s", "OUCH!!!");
                    else
                        printf("_");
                }
            }
            printf("\n");
        }
        t += tortoiseArray[rand() % 10];
        h += hareArray[rand() % 10];
        if (t < 1)
            t = 1;
        if (h < 1)
            h = 1;
        if (t > size - 1)
            t = size - 1;
        if (h > size - 1)
            h = size - 1;
        wait(1);
        printf("%69s%ds","Time: ", timer++);
        system("clear");
        printf("\n\n\n");
    }

    for (row = 1; row < 3; row++){
        for (column = 1; column < size; column++){
            if (row == 1 && column == t)
                printf("%c", 'T');
            else if (row == 2 && column == h)
                printf("%c", 'H');
            else
                printf("_");
        }
        printf("\n");
    }

    if (t == size - 1 && h == size -1)
        return 0;
    else if (t == size -1)
        return 1;
    else
        return 2;
}

void wait(int seconds)
{
    clock_t endwait;
    endwait = clock() + seconds * CLOCKS_PER_SEC;
    while (clock() < endwait);
}

#8
Programación C/C++ / Poker[C]
21 Febrero 2011, 21:29 PM
Hola gente del foro!! Dejo un codigo de poker al que le puse todas las funciones para determinar el punto de la mano.. Espero comentarios!! Saludos!!



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

void shuffle(int [][13]);
void deal(int [][13], const char *[], const char *[]);
void bubble(int n[], int size);

main()
{
    srand(time(NULL));
    int i, j, desk[4][13] = {0};
    const char *suit[4] = {"Corazones", "Diamantes", "Trebol", "Espadas"};
    const char *faces[13] = {"As", "Dos", "Tres", "Cuatro", "Cinco", "Seis", "Siete",
                             "Ocho", "Nueve", "Diez", "Jack", "Reina", "Rey"};

    shuffle(desk);
    deal(desk, suit, faces);

    return 0;
}





void shuffle(int d[][13])
{
    int row, column, card;

    for (card = 1; card < 53; card++){
        row = rand() % 4;
        column = rand() % 13;
        while (d[row][column] != 0){
            row = rand() % 4;
            column = rand() % 13;
        }
        d[row][column] = card;
    }
}

void deal(int d[][13], const char *s[], const char *f[])
{
    int deck2[4][13] = {0};
    int row, column, card, pnt = 0, i;
    int royalFlush(const int [][13]);
    int straightFlush(const int [][13]);
    int poker(const int [][13]);
    int fullHouse(const int [][13]);
    int flush(const int [][13]);
    int straight(const int [][13]);
    int threeOfAKind(const int [][13]);
    int twoPair(const int [][13]);
    int pair(const int [][13]);
    int (*pokerArray[9])(const int) = {royalFlush, straightFlush, poker, fullHouse, flush,
                                       straight, threeOfAKind, twoPair, pair};
    void point(int);


    for (card = 1; card < 6; card++){
        for (row = 0; row < 4; row++){
            for (column = 0; column < 13; column++){
                if (d[row][column] == card){
                    printf("%-6s de %-8s\n", f[column], s[row]);
                    deck2[row][column] = 1;
                }
            }
        }
    }

    for (i = 0; i < 9; i++){
        pnt = (*pokerArray[i])(deck2);
        if (pnt != 0)
            break;
    }
    point(pnt);
}





int royalFlush(const int d2[][13])
{
    int i, j, k = 0, cont = 0, card[5],
        royal[5] = {0, 9, 10, 11, 12};

    if (flush(d2) == 5)
        for (i = 0; i < 4; i++){
            for (j = 0; j < 13; j++){
                if (d2[i][j] == 1){
                    card[k] = j;
                    k++;
                }
            }
        }
    bubble(card, 5);

    for (i = 0; i < 5; i++)
        if (card[i] == royal[i])
            cont++;

    if (cont == 5)
        return 1;

    return 0;
}

int straightFlush(const int d2[][13])
{
    if (flush(d2) == 5)
        if (straight(d2) == 6)
            return 2;

    return 0;
}

int poker(const int d2[][13])
{
    int i, j, incr, cont;

    for (incr = 0; incr < 13; incr++){
        cont = 0;
        for (i = 0; i < 4; i++){
            for (j = incr; j <= incr; j++){
                if (d2[i][j] == 1)
                cont++;
            }
        }
        if (cont == 4)
            return 3;
    }
    return 0;
}

int fullHouse(const int d2[][13])
{
    if (threeOfAKind(d2) == 7)
        if (pair(d2) == 9)
            return 4;

    return 0;
}

int flush(const int d2[][13])
{
    int i, j, cont;

    for (i = 0; i < 4; i++){
        cont = 0;
        for (j = 0; j < 13; j++){
            if (d2[i][j] == 1)
                cont++;
        }
        if (cont == 5)
            return 5;
    }
    return 0;
}

int straight(const int d2[][13])
{
    int i, j, k = 0, temp, num[5];

    for (i = 0; i < 4; i++){
        for (j = 0; j < 13; j++){
            if (d2[i][j] == 1){
                num[k] = j;
                k++;
            }
        }
    }
    bubble(num, 5);
    temp = num[0];
    for (i = 1; i < 5; i++){
        if (num[i] != temp + 1)
            return 0;
        temp = num[i];
    }
    return 6;
}


int threeOfAKind(const int d2[][13])
{
    int i, j, incr, cont;

    for (incr = 0; incr < 13; incr++){
        cont = 0;
        for (i = 0; i < 4; i++){
            for (j = incr; j <= incr; j++){
                if (d2[i][j] == 1)
                cont++;
            }
        }
        if (cont == 3)
            return 7;
    }
    return 0;
}

int twoPair(const int d2[][13])
{
    int i, j, incr, cont, pairCont = 0;

    for (incr = 0; incr < 13; incr++){
        cont = 0;
        for (i = 0; i < 4; i++){
            for (j = incr; j <= incr; j++){
                if (d2[i][j] == 1)
                cont++;
            }
        }
        if (cont == 2)
            pairCont++;
    }
    if (pairCont == 2)
        return 8;

    return 0;
}

int pair(const int d2[][13])
{
    int i, j, incr, cont;

    for (incr = 0; incr < 13; incr++){
        cont = 0;
        for (i = 0; i < 4; i++){
            for (j = incr; j <= incr; j++){
                if (d2[i][j] == 1)
                cont++;
            }
        }
        if (cont == 2)
            return 9;
    }
    return 0;
}

void point(int p)
{
    switch (p){
            case 1:
                printf("\nROYAL FLUSH\n");
                break;
            case 2:
                printf("\nSTRAIGHT FLUSH\n");
                break;
            case 3:
                printf("\nPOKER\n");
                break;
            case 4:
                printf("\nFULL HOUSE\n");
                break;
            case 5:
                printf("\nFLUSH\n");
                break;
            case 6:
                printf("\nSTRAIGHT\n");
                break;
            case 7:
                printf("\nTHREE OF A KIND\n");
                break;
            case 8:
                printf("\nTWO PAIR\n");
                break;
            case 9:
                printf("\nPAIR\n");
                break;
            default:
                printf("\nHIGH CARD\n");
    }
}

void bubble(int n[], int size)
{
    int i, j, temp;

    for (i = 0; i < size - 1; i++){
        for (j = i + 1; j < size; j++){
            if (n[i] > n[j]){
                temp = n[i];
                n[i] = n[j];
                n[j] = temp;
            }
        }
    }
}

#9
Programación C/C++ / Criba de Eratostenes[C]
29 Diciembre 2010, 19:27 PM
Hola gente! Dejo un algoritmo q devuelve numeros primos entre 1 y 1000..
Saludos!!


#include<stdio.h>
#define SIZE 1000

void cribaDeEratostenes(int [], int , int);

main()
{
      int vectorPrimo[SIZE];
      int i, num;
     
      for (i = 1; i <= SIZE; i++)
          vectorPrimo[i] = 1;
     
      for (i = 2; i <= SIZE; i++)
          if (vectorPrimo[i] == 1){
             cribaDeEratostenes(vectorPrimo, i, SIZE);
             printf("%-5d", i);
          }


      return 0;
}





void cribaDeEratostenes(int v[], int n, int size)
{
     int i = n;
     
     for (i += n; i <= size; i += n)
         v[i] = 0;
}
#10
Hola foreros!! Dejo un programa q genera numeros aleatorios y los almacena en un vector solo si no estan repetidos..
Saludos!!


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 20

void generarRandom(int [], int);
void ordenarVector(int [], int);
void mostrarVector(int [], int);

main()
{
      srand(time(NULL));
      int vector[SIZE] = {0};
     
      generarRandom(vector, SIZE);
      ordenarVector(vector, SIZE);
      mostrarVector(vector, SIZE);
     

      return 0;
}





void generarRandom(int v[], int size)
{
     int i, j, num, dupl;
     
     printf("RANDOM\n");
     for (i = 0; i < size; i++){
         num = 1 + rand() % size;
         dupl = 0;
         printf("%-4d", num);
         for (j = 0; j <= i; j++){
             if (num == v[j]){
                dupl = 1;
                break;
             }
         }
         if (dupl == 1)
            i--;
         else
            v[i] = num;
     }
}

void ordenarVector(int v[], int size)
{
     int i, j, temp;
     
     for (i = 0; i < size - 1; i++){
         for (j = i+1; j < size; j++){
             if (v[i] > v[j]){
                   temp = v[i];
                   v[i] = v[j];
                   v[j] = temp;
             }
         }
     }
}
   
void mostrarVector(int v[], int size)
{
     int i;
     
     printf("\n\nVECTOR\n");
     for (i = 0; i < size; i++)
         printf("%d\n", v[i]);
}
#11
Hola foreros! hacia mucho q no posteaba nada debido a q cursando en la facu no tenia mucho tiempo libre para programar.
Como ya termine volvi a codear en c y queria subir un programa de reserva de aerolinea q pide como ejercicio un libro q estoy leyendo.
Espero comentarios y sugerencias.
Saludos!



#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE_ASIENTOS 10

int asignarAsiento(int [], int, int);
void pasaje(int);
void diagrama(int [], int);

main()
{
    srand(time(NULL));
    int asientos[SIZE_ASIENTOS] = {0};
    int i, num, cont = 0;

    printf("SISTEMA DE RESERVACION DE AEROLINEAS\n\n");

    diagrama(asientos, SIZE_ASIENTOS);

    while (cont <= SIZE_ASIENTOS - 1){

        printf("Por favor ingrese 1 para sector fumadores\n"
               "Por favor ingrese 2 para sector no fumadores\n");
        scanf("%d", &num);

        while (num > 2){
            printf("Numero no valido\n\n");
            printf("Por favor ingrese 1 para sector fumadores\n"
                   "Por favor ingrese 2 para sector no fumadores\n");
            scanf("%d", &num);
        }

        if ((asignarAsiento(asientos, SIZE_ASIENTOS, num)) != 0)
            cont++;

        diagrama(asientos, SIZE_ASIENTOS);
    }

    printf("Avion lleno\nProximo vuelo en 3 horas\n");


    return 0;
}





int asignarAsiento(int a[], int size, int n)
{
    char rta[1];
    int i, status = 0;
    static int cont1 = 0, cont2 = 0;

    switch(n){
        case 1:                     //SECTOR FUMADORES
            if (cont1 < size / 2){
                while (status == 0){
                    i = rand() % size /2;
                    if(a[i] == 0){
                        a[i] = 1;
                        pasaje(i);
                        cont1++;
                        status = 1;
                    }
                }
            }
            else{
                printf("La sección fumadores esta llena. "
                       "Le gustaria q le asignemos un lugar en la sección "
                       "de no fumadores(s/n)");
                scanf("%s", rta);

                if(rta[0] == 's' || rta[0] == 'S'){
                    while (status == 0){
                        i = size / 2 + rand() % size / 2;
                        if(a[i] == 0){
                            a[i] = 1;
                            pasaje(i);
                            cont2++;
                            status = 1;
                        }
                    }
                }

                else{
                    printf("\nEl proximo vuelo sale en 3 horas\n\n");
                    return 0;
                }
            }

            break;


        case 2:                     //SECTOR NO FUMADORES
            if (cont2 < size / 2){
                while (status == 0){
                    i = size / 2 + rand() % size / 2;
                    if (a[i] == 0){
                        a [i] = 1;
                        pasaje(i);
                        cont2++;
                        status = 1;
                    }
                }
            }

            else{
                printf("La sección de no fumadores esta llena. "
                       "Le gustaria q le asignemos un lugar en la sección "
                       "de fumadores(s/n)");
                scanf("%s", rta);

                if(rta[0] == 's' || rta[0] == 'S'){
                    while (status == 0){
                        i = rand() % size /2;
                        if(a[i] == 0){
                            a[i] = 1;
                            pasaje(i);
                            cont1++;
                            status = 1;
                        }
                    }
                }

                else{
                    printf("\nEl proximo vuelo sale en 3 horas\n\n");
                    return 0;
                }
            }

            break;
    }

}

void pasaje(int numAsiento)
{
    printf("\n************************\n");
    printf("AEROLINEA\n");
    printf("Pase de abordaje\n");
    if (numAsiento >= 0 && numAsiento <= 4){
        printf("Asiento nº %d\n", numAsiento + 1);
        printf("Sector fumadores\n");
    }
    else{
        printf("Asiento nº %d\n", numAsiento + 1);
        printf("Sector no fumadores\n");
    }
    printf("\n************************\n");
}

void diagrama(int a[], int size)
{
    int i;

    printf("\n");
    printf("%30s\n\n", "DIAGRAMA AVION");
    printf("%15s %26s\n", "FUMADORES", "NO FUMADORES");
    printf("/-------------------\\");
    printf("    /-------------------\\\n");
        for (i = 0; i <= size - 1; i++)
            printf("%-5d", a[i]);
    printf("\n\n");

}

#12
Hola, dejo un programa q saca ternas pitagoricas(a²+b²=c²) mediante fuerza bruta.. El problema q tengo es q no puedo hacer q descarte las ternas q son iguales(ej: 3²+4² = 5² -- 4²+3² = 5²).
En el codigo hay varias sentencias q estan de mas pq las hice para armar la funcion q tendria q descartar los repetidos, las dejo para q vean lo q trataba de hacer, pero si se le sacan el codigo anda igual..


#include<stdio.h>
#include<math.h>
#define LIMITE 500

int compara_vector(double vec[], double num, int indice);

main()
{
      int i, j, k, m = 1;
      double lado1 = (double)1, lado2 = (double)1, hipotenusa = (double)1;
      double num, rtdoH, rtdoLs, rtdoM[LIMITE*2];
     
      printf("\tL1\tL2\t\tHP\n\n");
     
      for (i = 1; i <= LIMITE; i++){
          lado2 = 1;
         
          for ( j = 1; j <= LIMITE; j++){
              hipotenusa = 1;
             
              for (k = 1; k <= LIMITE; k++){
                  rtdoH = pow((hipotenusa), (double)2);
                  rtdoLs = (pow(lado1, (double)2)) + (pow(lado2, (double)2));
                  rtdoM[m] = lado1 * lado2 * hipotenusa;
                                                           
                        if (rtdoH == rtdoLs){
                                  num = rtdoM[m];
                                 
                                  if((compara_vector(rtdoM, num, m)) == 0)
                                                           printf("\t%.0f\t%.0f\t=\t%.0f\n", lado1, lado2, hipotenusa);
                                                           
                                  m++;
                                  }
                  hipotenusa++;
              }
              lado2++;
         }
         lado1++;
      }

      return 0;
}





int compara_vector(double vec[], double num, int indice)
{
     int i;
     
     for(i = indice; i >= 0; i--){
           
           if(vec[i] != num){
                     return 0;
           }
     }
}


Bueno espero sugerencias!!  :D
#13
Programación C/C++ / [C]Calcular pi
10 Agosto 2010, 19:47 PM
Hola gente!! dejo unos programitas que hice para calcular pi con distintas series infinitas.. y ya q los posteo aprovecho para dejar unas dudas q tengo..

Algoritmo Gottfried Wilhem von Leibniz
= 4(1/1-1/3+1/5-1/7+1/9...)


#include<stdio.h>

main()
{
      int i, j = 1;
      double pi = 0, rtdo;
     
      for (i = 0; i < 1000000000; i++){
          rtdo = 4 / (double)j;
         
               if (i % 2 == 1)
                  pi -= rtdo;
               else
                   pi += rtdo;
          j += 2;
      }
     
      printf("Valor de Pi: %.16f", pi);
     
      return 0;
}


Algoritmo John Wallis
= 2 ( 2/1 x 2/3 x 4/3 x 4/5 x 6/5 x 6/7 ....)


#include<stdio.h>

main()
{
      int i, j = 2, k = 1;
      double pi = 2;
     
      for (i = 0; i < 1000000000; i++){
          pi *= (j / (double)k);
           
          if (i % 2 == 0)
             k += 2;
          else
              j += 2;
      }
     
      printf("Valor de Pi: %.16f", pi);
     
      return 0;
}


Estos 2 funcionan bien pero me devuelven solo 16 decimales, desp de ese devuelve todo 0.. pq??

Algoritmo Leonhard Euler
=  1 + 1/3 + 1x2 / 3x5 + 1x2x3 / 3x5x7 +....


#include<stdio.h>

main()
{
      int i, cte = 1, cte2 = 1;
      double pi = 1, j = 1, k = 1;
     
      for (i = 0; i < 100; i++){
          j *= cte++;
          k *= (cte2 += 2);
         
          pi += (j / k);
          }
     
      printf("%.15f", pi);
     
      return 0;
}


En este tengo el problema de q como se forman nº tan grandes no puedo hacer un bucle de mas de 100 vueltas y ademas no da el rtdo, no pude encontrarle solucion, creo q el codigo esta bien hecho..

Saludos! :D
#14
Hola foreros!! :D aca dejo un programita que calcula el factorial de un numero. El problema que tiene es que cuando se ingresa un numero mayor a 12 da un resultado erroneo, declare la variable factorial con todos los tipos pero en ningun caso funciono.. como se podria solucionar??


#include<stdio.h>

main()
{
      int i, num;
      double factorial = 1;
     
      printf("FACTORIAL DE UN NUMERO\n\n");
      printf("Ingrese un numero: ");
      scanf("%d", &num);
     
      for (i = 1; i <= num; i++)
          factorial *= i;
     
      printf("\n%d! = %.0f\n", num, factorial);

      return 0;
}


P.D: Acabo de modificar el codigo, ahora si factorea cualquier nº. Grax rob1104!
#15
Programación C/C++ / [C]Fuerza Bruta
11 Julio 2010, 10:07 AM
Hola a todos!! como primer post quiero compartir con uds un programita q estuve haciendo en C q simule un programa de fuerza bruta, solo q mas sencillo.. estoy aprendiendo a programar en C asiq soy novato, cualquier sugerencia, propuesta, o lo q sea para mejorar el codigo y aprender sera bienvenida :D..



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

int mystrlen(char *s);
void mystrcpy(char *s, char *t);
int mystrcmp(char *s, char *t);

int main()
{
      char pass[]="MONO";
      int i, num;
      num = mystrlen(pass);
      char bf[num];
      //srand(time(NULL));
      mystrcpy(pass, bf);

      while(bf != pass)
      {
               for(i=0; bf[i] != '\0'; i++){
                        bf[i] = 'A'+rand()% ('A'-'Z');
                        printf("%c", bf[i]);
                        }
                        if((mystrcmp(pass, bf)) == 1)
                                           break;
                        printf("\n");
               }
     
      printf("\n");
      return 0;
}



int mystrlen(char *s)
{
    int i;
   
    for(i=0; *s != '\0'; i++, s++);
   
    return i;
}

void mystrcpy(char *s, char *t)
{
    for(; *s != '\0'; s++, t++){
          *t = *s;
          }
    *t = '\0';
}

int mystrcmp(char *s, char *t)
{
    int r;
    while(*s != '\0'){
             r = *s - *t;
             if(*t == '\0')
                   break;
             else{
                  if(r == 0)
                       s++, t++;
                  else
                      s++;
                  }
             }
    if(*t == '\0')
          return 1;
}



Algo q no pude lograr sin un strcpy es q copie los mismos lugares en el string bf, pq si lo hacia con un strlen siempre me copiaba 3 por el '\0', la unica forma en la q pude hacerlo fue con un strcpy..
bueno un saludo, espero que les guste!!