Marcelo Utikawa da Fonseca
Membros-
Total de itens
297 -
Registro em
-
Última visita
Tudo que Marcelo Utikawa da Fonseca postou
-
Dúvida - Elaborar Paciência em C++
pergunta respondeu ao Iago CF de Marcelo Utikawa da Fonseca em C, C++
Boa tarde! Depois de muito trabalho eu terminei o jogo! B) Ainda falta dar a mensagem que terminou o jogo e não permitir mover a carta do baralho para os slots mas já funciona! Segue o código: baralho.h #ifndef BARALHO_H_INCLUDED #define BARALHO_H_INCLUDED #define CARD_VALUE_INVALID 0x0000 #define CARD_VALUE_ACE 0x0001 #define CARD_VALUE_2 0x0002 #define CARD_VALUE_3 0x0004 #define CARD_VALUE_4 0x0008 #define CARD_VALUE_5 0x0010 #define CARD_VALUE_6 0x0020 #define CARD_VALUE_7 0x0040 #define CARD_VALUE_8 0x0080 #define CARD_VALUE_9 0x0100 #define CARD_VALUE_10 0x0200 #define CARD_VALUE_J 0x0400 #define CARD_VALUE_Q 0x0800 #define CARD_VALUE_K 0x1000 #define DECK_TYPE_FULL (CARD_VALUE_ACE | CARD_VALUE_2 | CARD_VALUE_3 | CARD_VALUE_4 | CARD_VALUE_5 | \ CARD_VALUE_6 | CARD_VALUE_7 | CARD_VALUE_8 | CARD_VALUE_9 | CARD_VALUE_10 | \ CARD_VALUE_J | CARD_VALUE_Q | CARD_VALUE_K) #define DECK_TYPE_TRUCO (CARD_VALUE_ACE | CARD_VALUE_2 | CARD_VALUE_3 | CARD_VALUE_4 | CARD_VALUE_5 | \ CARD_VALUE_6 | CARD_VALUE_7 | CARD_VALUE_J | CARD_VALUE_Q | CARD_VALUE_K) typedef enum { Diamond, Spade, Heart, Club } Suit; typedef struct { int iValue; Suit eSuit; } Card; typedef struct strCardList CardList; struct strCardList { Card *pCard; CardList *pNext; }; // Funcoes referentes a Cartas Card * Card_Create (int iValue, Suit eSuit); void Card_Free (Card *pCard); char * Card_GetSuitString(Card *pCard); int Card_IsBlack (Card *pCard); int Card_GetValue (Card *pCard); // Funcoes referentes a Listas de Cartas CardList * CardList_GetPosition (CardList **pList, CardList **pRetPrevious, int iPosition); int CardList_GetSize (CardList **pList); void CardList_InsertCardList(CardList **pList, CardList *pNew); void CardList_InsertCard (CardList **pList, Card *pCard); CardList * CardList_GetSubset (CardList **pList, Card *pCard); Card * CardList_GetCard (CardList **pList); void CardList_CreateDeck (CardList **pList, unsigned int uDeckMask); void CardList_Shuffle (CardList **pList, int iCount); void CardList_Free (CardList **pList); #endif // BARALHO_H_INCLUDED baralho.c #include <time.h> #include <stdlib.h> #include <malloc.h> #include "baralho.h" Card * Card_Create(int iValue, Suit eSuit) { Card *pNew = (Card *)malloc(sizeof(Card)); if(pNew != NULL) { pNew->iValue = iValue; pNew->eSuit = eSuit; } return pNew; } void Card_Free(Card *pCard) { if(pCard != NULL) { free(pCard); } } int Card_GetValue(Card *pCard) { int iValue; if(pCard != NULL) { for(iValue = 0; iValue < CARD_VALUE_K; iValue++) { if(pCard->iValue == (1<<iValue)) { return iValue+1; } } } return CARD_VALUE_INVALID; } char * Card_GetSuitString(Card *pCard) { if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: return "Ouros" ; case Spade : return "Espadas"; case Heart : return "Copas" ; case Club : return "Paus" ; } } return ""; } int Card_IsBlack(Card *pCard) { if(pCard != NULL && (pCard->eSuit == Spade || pCard->eSuit == Club)) return 1; return 0; } CardList * CardList_GetPosition(CardList **pList, CardList **pRetPrevious, int iPosition) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL) return NULL; pCurrent = *pList; while(pCurrent != NULL) { if(iPosition < 0 && pCurrent->pNext == NULL) break; // Encontrou ultimo item if(iPosition-- == 0) break; // Encontrou item procurado pPrevious = pCurrent; pCurrent = pCurrent->pNext; } if(pRetPrevious != NULL) { if(pCurrent != NULL) { *pRetPrevious = pPrevious; } else { *pRetPrevious = NULL; } } return pCurrent; } int CardList_GetSize(CardList **pList) { int iSize = 0; CardList *pCurrent; if(pList != NULL && *pList != NULL) { pCurrent = *pList; while(pCurrent != NULL) { iSize++; pCurrent = pCurrent->pNext; } } return iSize; } void CardList_InsertCardList(CardList **pList, CardList *pNew) { CardList *pCurrent; if(pList == NULL || pNew == NULL) return; if(*pList == NULL) { *pList = pNew; } else { pCurrent = CardList_GetPosition(pList, NULL, -1); pCurrent->pNext = pNew; } } void CardList_InsertCard(CardList **pList, Card *pCard) { CardList *pNew; if(pList == NULL || pCard == NULL) return; pNew = (CardList *)malloc(sizeof(CardList)); pNew->pCard = pCard; pNew->pNext = NULL; CardList_InsertCardList(pList, pNew); } CardList * CardList_GetSubset(CardList **pList, Card *pCard) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL || pCard == NULL) return NULL; pCurrent = *pList; while(pCurrent != NULL) { if(pCurrent->pCard->iValue == pCard->iValue && pCurrent->pCard->eSuit == pCard->eSuit) { break; // Achou a carta! } else { pPrevious = pCurrent; pCurrent = pCurrent->pNext; } } if(pPrevious != NULL) { pPrevious->pNext = NULL; } else if(pCurrent != NULL) { *pList = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. return pCurrent; } Card * CardList_GetCard(CardList **pList) { Card *pCard = NULL; CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL) return NULL; pCurrent = CardList_GetPosition(pList, &pPrevious, -1); if(pPrevious != NULL) { pPrevious->pNext = NULL; } else { // Lista vazia, carrega NULO *pList = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. if(pCurrent != NULL) { pCard = pCurrent->pCard; free(pCurrent); } return pCard; } void CardList_CreateDeck(CardList **pList, unsigned int uDeckMask) { int iValue; if(pList == NULL) return; for(iValue=0; (1<<iValue) <= CARD_VALUE_K; iValue++) { if(uDeckMask & (1<<iValue)) { CardList_InsertCard(pList, Card_Create(1<<iValue, Diamond)); CardList_InsertCard(pList, Card_Create(1<<iValue, Spade )); CardList_InsertCard(pList, Card_Create(1<<iValue, Heart )); CardList_InsertCard(pList, Card_Create(1<<iValue, Club )); } } } void CardList_Shuffle(CardList **pList, int iCount) { int iSize; CardList *pPrevious, *pStart, *pEnd; if(pList == NULL || *pList == NULL) return; iSize = CardList_GetSize(pList); if(iCount <= 0) { iCount = 4*iSize; } srand(time(NULL)); while(iCount--) { // Carrega posicao inicial aleatoriamente pStart = CardList_GetPosition(pList, &pPrevious, rand()%iSize); if(pPrevious == NULL) { *pList = pStart->pNext; } else { pPrevious->pNext = pStart->pNext; } // Carrega posicao final aleatoriamente pEnd = CardList_GetPosition(pList, NULL, rand()%(iSize-1)); pStart->pNext = pEnd->pNext; pEnd ->pNext = pStart; } } void CardList_Free(CardList **pList) { CardList *pCurrent; if(pList == NULL || *pList == NULL) return; while(*pList != NULL) { pCurrent = *pList; *pList = pCurrent->pNext; Card_Free(pCurrent->pCard); free(pCurrent); } } paciencia.c #include <stdio.h> #include <malloc.h> #include <string.h> #include "baralho.h" #define GAME_SLOT_NUM 7 #define GAME_SLOT_CLOSED 0 #define GAME_SLOT_OPEN 1 #define GAME_CMD_NONE 0 #define GAME_CMD_QUIT 1 #define GAME_CMD_CARD_NEW 2 #define GAME_CMD_MOVE 3 #define GAME_KEY_CARD_NEW '+' #define GAME_KEY_CARD_OPEN '*' #define GAME_KEY_QUIT 'X' #define CARD_STRING_CLOSED "|###|" #define CARD_STRING_EMPTY "| |" #define CARD_STRING_NONE " " #define CARD_REF_INVALID 0 #define CARD_REF_OPEN 1 #define CARD_REF_FOUNDATION 2 #define CARD_REF_SLOT 3 typedef struct { Card *pCard; CardList *pDeck, *pWaste, *pFoundation[4], *pSlots[GAME_SLOT_NUM][2]; } GameState; typedef struct { int iRef; int iColumn; int iIndex; } GameCardRef; void PrintCard(Card *pCard) { char szCardString[6]; char *szCard[] = { "??", " A", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", "10", " J", " Q", " K" }, cSuit = '?'; if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: cSuit = 'o'; break; case Spade : cSuit = 's'; break; case Heart : cSuit = 'c'; break; case Club : cSuit = 'p'; break; } sprintf(szCardString, "|%s%c|", szCard[Card_GetValue(pCard)], cSuit); } else { strcpy(szCardString, CARD_STRING_EMPTY); } printf("%s", szCardString); } void Game_PrintBoard(GameState **pGame) { Card *pCard; CardList *pSlotList; int iCount, iSlotSize[GAME_SLOT_NUM], iSlot, iCardPrinted; if(pGame == NULL || *pGame == NULL) return; printf("\n\n"); if(CardList_GetSize(&(*pGame)->pDeck) > 0) { printf("%s ", CARD_STRING_CLOSED); } else { printf("%s ", CARD_STRING_EMPTY ); } PrintCard((*pGame)->pCard); printf(" %s ", CARD_STRING_NONE); for(iCount=0; iCount<4; iCount++) { pCard = NULL; if((*pGame)->pFoundation[iCount] != NULL) { pCard = CardList_GetPosition(&(*pGame)->pFoundation[iCount], NULL, -1)->pCard; } PrintCard(pCard); printf(" "); } printf("\n|(+)| |(*)| |(a)| |(b)| |(c)| |(d)|\n\n"); for(iSlot = 0; iSlot < GAME_SLOT_NUM; iSlot++) { printf("|(%d)| ", iSlot); iSlotSize[iSlot] = CardList_GetSize(&(*pGame)->pSlots[iSlot][GAME_SLOT_CLOSED]); } printf("\n"); iCount = 0; do { iCardPrinted = 0; for(iSlot = 0; iSlot < GAME_SLOT_NUM; iSlot++) { if(iCount < iSlotSize[iSlot]) { iCardPrinted = 1; printf("%s ", CARD_STRING_CLOSED); } else { pSlotList = CardList_GetPosition(&(*pGame)->pSlots[iSlot][GAME_SLOT_OPEN], NULL, iCount - iSlotSize[iSlot]); if(pSlotList != NULL) { iCardPrinted = 1; PrintCard(pSlotList->pCard); printf(" "); } else { printf("%s ", CARD_STRING_NONE); } } } iCount++; printf("\n"); } while(iCardPrinted); printf("\n"); } GameState * Game_Create(void) { GameState *pGame; int iCount, iSlot; pGame = (GameState *)malloc(sizeof(GameState)); if(pGame == NULL) return NULL; memset(pGame, 0, sizeof(GameState)); CardList_CreateDeck(&(pGame->pDeck), DECK_TYPE_FULL); CardList_Shuffle (&(pGame->pDeck), 0); for(iSlot = 0; iSlot < GAME_SLOT_NUM; iSlot++) { pGame->pCard = CardList_GetCard(&(pGame->pDeck)); CardList_InsertCard(&(pGame->pSlots[iSlot][GAME_SLOT_OPEN]), pGame->pCard); for(iCount = iSlot; iCount > 0; iCount--) { pGame->pCard = CardList_GetCard(&(pGame->pDeck)); CardList_InsertCard(&(pGame->pSlots[iSlot][GAME_SLOT_CLOSED]), pGame->pCard); } } pGame->pCard = CardList_GetCard(&(pGame->pDeck)); return pGame; } CardList ** Game_GetCardList(GameState *pGame, GameCardRef *pRef) { if(pGame != NULL && pRef != NULL) { switch(pRef->iRef) { case CARD_REF_FOUNDATION: if(pRef->iColumn >= 0 && pRef->iColumn < 4) return &pGame->pFoundation[pRef->iColumn]; break; case CARD_REF_SLOT: if(pRef->iColumn >= 0 && pRef->iColumn < GAME_SLOT_NUM) return &pGame->pSlots[pRef->iColumn][GAME_SLOT_OPEN]; break; } } return NULL; } int Game_CanMove(Card *pFromCard, Card *pToCard, int iToRef) { int iCanMove = 0, iFromIsBlack, iToIsBlack; if(pFromCard != NULL) { iFromIsBlack = Card_IsBlack(pFromCard); iToIsBlack = Card_IsBlack(pToCard ); if(iToRef == CARD_REF_FOUNDATION) { if(pToCard == NULL && Card_GetValue(pFromCard) == CARD_VALUE_ACE) { iCanMove = 1; } else if(Card_GetValue(pFromCard) == Card_GetValue(pToCard)+1 && pFromCard->eSuit == pToCard->eSuit) { iCanMove = 1; } } else if(iToRef == CARD_REF_SLOT) { if(pToCard == NULL) { iCanMove = 1; } else if(Card_GetValue(pFromCard) == Card_GetValue(pToCard)-1 && iFromIsBlack != iToIsBlack) { iCanMove = 1; } } } return iCanMove; } void Game_ProcessCommand(GameState **pGame, int iCommand, GameCardRef *pFrom, GameCardRef *pTo) { int iCount; Card *pFromCard, *pToCard; CardList **pFromList, **pToList; if(pGame == NULL || *pGame == NULL || pFrom == NULL) return; switch(iCommand) { case GAME_CMD_CARD_NEW: if(pFrom->iRef == CARD_REF_OPEN) { if((*pGame)->pCard != NULL) { CardList_InsertCard(&(*pGame)->pWaste, (*pGame)->pCard); } if(CardList_GetSize(&(*pGame)->pDeck) == 0) { for(iCount = CardList_GetSize(&(*pGame)->pWaste); iCount > 0; iCount--) { CardList_InsertCard(&(*pGame)->pDeck, CardList_GetCard(&(*pGame)->pWaste)); } } (*pGame)->pCard = CardList_GetCard(&(*pGame)->pDeck); } else if(pFrom->iRef == CARD_REF_SLOT) { pFromList = Game_GetCardList(*pGame, pFrom); if(pFromList != NULL && *pFromList == NULL) { pFromCard = CardList_GetCard(&(*pGame)->pSlots[pFrom->iColumn][GAME_SLOT_CLOSED]); if(pFromCard != NULL) CardList_InsertCard(pFromList, pFromCard); } } break; case GAME_CMD_MOVE: if(pTo == NULL || pTo->iRef == CARD_REF_OPEN) break; pToList = Game_GetCardList(*pGame, pTo); pFromCard = NULL; pToCard = NULL; pFromList = NULL; if(pToList != NULL) { if(*pToList != NULL) { pToCard = CardList_GetPosition(pToList, NULL, -1)->pCard; } if(pFrom->iRef == CARD_REF_OPEN) { pFromCard = (*pGame)->pCard; } else { pFromList = Game_GetCardList(*pGame, pFrom); if(pFromList != NULL && *pFromList != NULL) { if(*pToList != NULL) { iCount = CardList_GetSize(pFromList); while(iCount-- > 0) { pFromCard = CardList_GetPosition(pFromList, NULL, iCount)->pCard; if(Game_CanMove(pFromCard, pToCard, pTo->iRef)) break; } if(iCount < 0) { pFromCard = NULL; } } else { pFromCard = CardList_GetPosition(pFromList, NULL, pTo->iRef == CARD_REF_SLOT ? 0 : -1)->pCard; if(pTo->iRef == CARD_REF_SLOT && Card_GetValue(pFromCard) != 13) { pFromCard = NULL; } } } } } if(pFromCard != NULL && pToList != NULL && Game_CanMove(pFromCard, pToCard, pTo->iRef)) { if(pFromList != NULL) { CardList_InsertCardList(pToList, CardList_GetSubset(pFromList, pFromCard)); } else { CardList_InsertCard(pToList, pFromCard); } if(pFrom->iRef == CARD_REF_OPEN) { (*pGame)->pCard = CardList_GetCard(&(*pGame)->pWaste); if((*pGame)->pCard == NULL) { Game_ProcessCommand(pGame, GAME_CMD_CARD_NEW, NULL, NULL); } } } } } void Game_GetRefFromKey(GameCardRef *pRef, char cKey) { if(pRef == NULL) return; if(cKey >= '0' && cKey <= '9') { // Maximo: 10 slots cKey -= '0'; if(cKey < GAME_SLOT_NUM) { pRef->iRef = CARD_REF_SLOT; pRef->iColumn = cKey; } } else if(cKey >= 'a' && cKey <= 'd') { pRef->iRef = CARD_REF_FOUNDATION; pRef->iColumn = cKey - 'a'; } else if(cKey == GAME_KEY_CARD_OPEN) { pRef->iRef = CARD_REF_OPEN; pRef->iColumn = 0; } else { pRef->iRef = CARD_REF_INVALID; } } int main(void) { char cKey; int iCommand = GAME_CMD_QUIT; GameState *pGame = Game_Create(); GameCardRef tFrom, tTo; do { Game_PrintBoard(&pGame); printf("Digite o comando e pressione ENTER: "); cKey = getchar(); iCommand = GAME_CMD_NONE; switch(cKey) { case GAME_KEY_CARD_NEW: iCommand = GAME_CMD_CARD_NEW; Game_GetRefFromKey(&tFrom, GAME_KEY_CARD_OPEN); break; case GAME_KEY_QUIT: iCommand = GAME_CMD_QUIT; break; case '\n': case '\r': break; default: Game_GetRefFromKey(&tFrom, cKey); if(tFrom.iRef != CARD_REF_INVALID) { cKey = getchar(); if(cKey == '\n') { if(tFrom.iRef == CARD_REF_SLOT) iCommand = GAME_CMD_CARD_NEW; } else { Game_GetRefFromKey(&tTo, cKey); if(tTo.iRef != CARD_REF_INVALID) { iCommand = GAME_CMD_MOVE; } } } if(iCommand == GAME_CMD_NONE) printf("\n\nComando invalido!\n\n"); break; } Game_ProcessCommand(&pGame, iCommand, &tFrom, &tTo); while(cKey != '\n') { cKey = getchar(); } } while(iCommand != GAME_CMD_QUIT); return 0; } -
Ajuda - Interface com wxWidgets
pergunta respondeu ao Computero de Marcelo Utikawa da Fonseca em C, C++
O que você precisa fazer não é gerar um evento mas sim carregar o texto em um objeto como um textview. É dentro do evento do botão que você faz isso. Ao invés de usar o cout você carrega o texto nesse objeto... Além disso, como é um for longo e que pode ser interrompido pela interface, você precisa chamar alguma função que leia os eventos da interface ou seu programa vai parar de responder. Abraços, Marcelo Utikawa da Fonseca -
Nossa, você desenterrou um defunto bem antigo! Acho que nem osso tem mais... :D agora falando sério: com o gets somente poderia ler da stdin. Além disso, gets não é recomendado pois não há controle quanto ao tamanho do buffer. O correto é sempre usar o fgets. Abraços, Marcelo Utikawa da Fonseca
-
Ajuda - Interface com wxWidgets
pergunta respondeu ao Computero de Marcelo Utikawa da Fonseca em C, C++
Oi! Especificamente sobre o wxWidgets não posso ajudar mas o problema de estar mandando os textos para o terminal deve ser porque você está usando cout ou printf. Você tem que usar um objeto como um textview para exibir o texto. Coloque o código que vendo a lógica pode ser que consigo te ajudar! Abraços, Marcelo Utikawa da Fonseca Oi! Especificamente sobre o wxWidgets não posso ajudar mas o problema de estar mandando os textos para o terminal deve ser porque você está usando cout ou printf. Você tem que usar um objeto como um textview para exibir o texto. Coloque o código que vendo a lógica pode ser que consigo te ajudar! Abraços, Marcelo Utikawa da Fonseca -
Contagem de Caracteres (Com Lista)
pergunta respondeu ao Paulo Renato de Marcelo Utikawa da Fonseca em C, C++
Qual exatamente é a sua dúvida? O que você não sabe fazer? Há existe o algoritmo pronto, você conseguiu fazer algo? Abraços, Marcelo Utikawa da Fonseca -
O problema é que faltou o zero no final da string: #include <16F877A.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #use delay(clock=20000000) #use rs232 (baud = 9600, xmit=pin_c6, rcv=pin_c7) #fuses HS,NOWDT,NOLVP char val[9]; char x[4],y[4],z[4]; void main() { printf("Selecione os parametros\n\r"); gets(val); x[0]=val[0]; x[1]=val[1]; x[2]=val[2]; x[3]=0; y[0]=val[3]; y[1]=val[4]; y[2]=val[5]; y[3]=0; z[0]=val[6]; z[1]=val[7]; z[2]=val[8]; z[3]=0; printf("x é %s \n",x); printf("y é %s \n",y); printf("z é %s \n",z); }
-
Dúvida - Elaborar Paciência em C++
pergunta respondeu ao Iago CF de Marcelo Utikawa da Fonseca em C, C++
Mais uma atualização... Agora toda a lógica do baralho está pronta. Só falta o jogo em si, que é o que estou trabalhando agora. Tire suas dúvidas! baralho.c #include <time.h> #include <stdlib.h> #include <malloc.h> #include "baralho.h" Card * Card_Create(int iValue, Suit eSuit) { Card *pNew = (Card *)malloc(sizeof(Card)); if(pNew != NULL) { pNew->iValue = iValue; pNew->eSuit = eSuit; } return pNew; } void Card_Free(Card *pCard) { if(pCard != NULL) { free(pCard); } } int Card_GetValue(Card *pCard) { int iValue; if(pCard != NULL) { for(iValue = 0; iValue < CARD_VALUE_K; iValue++) { if(pCard->iValue == (1<<iValue)) { return iValue+1; } } } return CARD_VALUE_INVALID; } char * Card_GetSuitString(Card *pCard) { if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: return "Ouros" ; case Spade : return "Espadas"; case Heart : return "Copas" ; case Club : return "Paus" ; } } return ""; } CardList * CardList_GetPosition(CardList **pList, CardList **pRetPrevious, int iPosition) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL) return NULL; pCurrent = *pList; while(pCurrent != NULL) { if(iPosition < 0 && pCurrent->pNext == NULL) break; // Encontrou ultimo item if(iPosition-- == 0) break; // Encontrou item procurado pPrevious = pCurrent; pCurrent = pCurrent->pNext; } if(pRetPrevious != NULL) { if(pCurrent != NULL) { *pRetPrevious = pPrevious; } else { *pRetPrevious = NULL; } } return pCurrent; } int CardList_GetSize(CardList **pList) { int iSize = 0; CardList *pCurrent; if(pList != NULL && *pList != NULL) { pCurrent = *pList; while(pCurrent != NULL) { iSize++; pCurrent = pCurrent->pNext; } } return iSize; } void CardList_InsertCardList(CardList **pList, CardList *pNew) { CardList *pCurrent; if(pList == NULL || pNew == NULL) return; if(*pList == NULL) { *pList = pNew; } else { pCurrent = CardList_GetPosition(pList, NULL, -1); pCurrent->pNext = pNew; } } void CardList_InsertCard(CardList **pList, Card *pCard) { CardList *pNew; if(pList == NULL || pCard == NULL) return; pNew = (CardList *)malloc(sizeof(CardList)); pNew->pCard = pCard; pNew->pNext = NULL; CardList_InsertCardList(pList, pNew); } CardList * CardList_GetSubset(CardList **pList, Card *pCard) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL || pCard == NULL) return NULL; pCurrent = *pList; while(pCurrent != NULL) { if(pCurrent->pCard->iValue == pCard->iValue && pCurrent->pCard->eSuit == pCard->eSuit) { break; // Achou a carta! } else { pPrevious = pCurrent; pCurrent = pCurrent->pNext; } } if(pPrevious != NULL) { pPrevious->pNext = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. return pCurrent; } Card * CardList_GetCard(CardList **pList) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL) return NULL; pCurrent = CardList_GetPosition(pList, &pPrevious, -1); if(pPrevious != NULL) { pPrevious->pNext = NULL; } else { // Lista vazia, carrega NULO *pList = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. return pCurrent->pCard; } void CardList_CreateDeck(CardList **pList, unsigned int uDeckMask) { int iValue; if(pList == NULL) return; for(iValue=0; (1<<iValue) <= CARD_VALUE_K; iValue++) { if(uDeckMask & (1<<iValue)) { CardList_InsertCard(pList, Card_Create(1<<iValue, Diamond)); CardList_InsertCard(pList, Card_Create(1<<iValue, Spade )); CardList_InsertCard(pList, Card_Create(1<<iValue, Heart )); CardList_InsertCard(pList, Card_Create(1<<iValue, Club )); } } } void CardList_Shuffle(CardList **pList, int iCount) { int iSize; CardList *pPrevious, *pStart, *pEnd; if(pList == NULL || *pList == NULL) return; iSize = CardList_GetSize(pList); if(iCount <= 0) { iCount = 4*iSize; } srand(time(NULL)); while(iCount--) { // Carrega posicao inicial aleatoriamente pStart = CardList_GetPosition(pList, &pPrevious, rand()%iSize); if(pPrevious == NULL) { *pList = pStart->pNext; } else { pPrevious->pNext = pStart->pNext; } // Carrega posicao final aleatoriamente pEnd = CardList_GetPosition(pList, NULL, rand()%(iSize-1)); pStart->pNext = pEnd->pNext; pEnd ->pNext = pStart; } } void CardList_Free(CardList **pList) { CardList *pCurrent; if(pList == NULL || *pList == NULL) return; while(*pList != NULL) { pCurrent = *pList; *pList = pCurrent->pNext; Card_Free(pCurrent->pCard); free(pCurrent); } } baralho.h #ifndef BARALHO_H_INCLUDED #define BARALHO_H_INCLUDED #define CARD_VALUE_INVALID 0x0000 #define CARD_VALUE_ACE 0x0001 #define CARD_VALUE_2 0x0002 #define CARD_VALUE_3 0x0004 #define CARD_VALUE_4 0x0008 #define CARD_VALUE_5 0x0010 #define CARD_VALUE_6 0x0020 #define CARD_VALUE_7 0x0040 #define CARD_VALUE_8 0x0080 #define CARD_VALUE_9 0x0100 #define CARD_VALUE_10 0x0200 #define CARD_VALUE_J 0x0400 #define CARD_VALUE_Q 0x0800 #define CARD_VALUE_K 0x1000 #define DECK_TYPE_FULL (CARD_VALUE_ACE | CARD_VALUE_2 | CARD_VALUE_3 | CARD_VALUE_4 | CARD_VALUE_5 | \ CARD_VALUE_6 | CARD_VALUE_7 | CARD_VALUE_8 | CARD_VALUE_9 | CARD_VALUE_10 | \ CARD_VALUE_J | CARD_VALUE_Q | CARD_VALUE_K) #define DECK_TYPE_TRUCO (CARD_VALUE_ACE | CARD_VALUE_2 | CARD_VALUE_3 | CARD_VALUE_4 | CARD_VALUE_5 | \ CARD_VALUE_6 | CARD_VALUE_7 | CARD_VALUE_J | CARD_VALUE_Q | CARD_VALUE_K) typedef enum { Diamond, Spade, Heart, Club } Suit; typedef struct { int iValue; Suit eSuit; } Card; typedef struct strCardList CardList; struct strCardList { Card *pCard; CardList *pNext; }; // Funcoes referentes a Cartas Card * Card_Create (int iValue, Suit eSuit); void Card_Free (Card *pCard); char * Card_GetSuitString(Card *pCard); int Card_GetValue (Card *pCard); // Funcoes referentes a Listas de Cartas CardList * CardList_GetPosition (CardList **pList, CardList **pRetPrevious, int iPosition); int CardList_GetSize (CardList **pList); void CardList_InsertCardList(CardList **pList, CardList *pNew); void CardList_InsertCard (CardList **pList, Card *pCard); CardList * CardList_GetSubset (CardList **pList, Card *pCard); Card * CardList_GetCard (CardList **pList); void CardList_CreateDeck (CardList **pList, unsigned int uDeckMask); void CardList_Shuffle (CardList **pList, int iCount); void CardList_Free (CardList **pList); #endif // BARALHO_H_INCLUDED paciencia.c #include <stdio.h> #include <malloc.h> #include <string.h> #include "baralho.h" #define GAME_SLOT_NUM 7 #define GAME_SLOT_CLOSED 0 #define GAME_SLOT_OPEN 1 typedef struct { Card *pCard; CardList *pDeck, *pWaste, *pFoundation[4], *pSlots[GAME_SLOT_NUM][2]; } GameState; void PrintCard(Card *pCard) { char szCardString[6]; char *szCard[] = { "??", " A", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", "10", " J", " Q", " K" }, cSuit = '?'; if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: cSuit = 'o'; break; case Spade : cSuit = 's'; break; case Heart : cSuit = 'c'; break; case Club : cSuit = 'p'; break; } sprintf(szCardString, "|%s%c|", szCard[Card_GetValue(pCard)], cSuit); } else { strcpy(szCardString, "| |"); } printf("%s", szCardString); } void Game_PrintBoard(GameState **pGame) { int iCount; Card *pCard; if(pGame == NULL || *pGame == NULL) return; printf("Tamanho do baralho: %d\n", CardList_GetSize(&((*pGame)->pDeck))); printf("|###| "); PrintCard((*pGame)->pCard); printf(" "); for(iCount=0; iCount<4; iCount++) { pCard = NULL; if((*pGame)->pFoundation[iCount] != NULL) { pCard = (*pGame)->pFoundation[iCount]->pCard; } PrintCard(pCard); printf(" "); } printf("\n| + | | * | |(a)| |(b)| |(c)| |(d)|\n\n"); for(iCount = 0; iCount < GAME_SLOT_NUM; iCount++) { } printf("\n"); } GameState * Game_Create(void) { GameState *pGame; int iCount, iSlot; pGame = (GameState *)malloc(sizeof(GameState)); if(pGame == NULL) return NULL; memset(pGame, 0, sizeof(GameState)); CardList_CreateDeck(&(pGame->pDeck), DECK_TYPE_FULL); CardList_Shuffle (&(pGame->pDeck), 0); for(iSlot = 0; iSlot < GAME_SLOT_NUM; iSlot++) { for(iCount = iSlot; iCount > 0; iCount--) { pGame->pCard = CardList_GetCard(&(pGame->pDeck)); CardList_InsertCard(&(pGame->pSlots[iSlot][GAME_SLOT_CLOSED]), pGame->pCard); } } pGame->pCard = CardList_GetCard(&(pGame->pDeck)); return pGame; } int main(void) { GameState *pGame = Game_Create(); Game_PrintBoard(&pGame); return 0; } Abraços, Marcelo Utikawa da Fonseca -
Dúvida - Atribuir Vários Caracters em C
pergunta respondeu ao Douglas Selvati de Marcelo Utikawa da Fonseca em C, C++
Boa tarde! Bem interessante esse problema de erdos... :) Qual é o ponto que você não está conseguindo fazer? Leia cada linha com fgets e depois use a strchr para encontrar os nomes... Abraços, Marcelo Utikawa da Fonseca -
O plugin é o cdt (eclipse.org/cdt) mas existe versão do eclipse já pronta para programar em c... Entre no eclipse.org/downloads e baixe! :) Abraços, Marcelo Utikawa da Fonseca
-
Dúvida - Elaborar Paciência em C++
pergunta respondeu ao Iago CF de Marcelo Utikawa da Fonseca em C, C++
Boa tarde! Sim, é possível mesclar tudo em um único arquivo. Basta pegar o conteúdo dos arquivos baralho.h, baralho.c e paciencia.c, nessa ordem, e criar um novo arquivo. Porém usar mais de um arquivo é normal. Imagine um windows desenvolvido em um único arquivo! Qualquer programa um pouco maior terá vários arquivos. E qualquer ide suporta isso! :) Abraços, Marcelo Utikawa da Fonseca -
O conio.h declara as funções getch e clrscr. Trocamos a getch por getchar, que é padrão da linguagem e é definida em stdio.h. A clrscr serve para limpar a tela, o mesmo que faz o comando cls. ela não é necessária para o programa rodar,é apenas por estética. Assim conio.h deixou de ser necessária e pôde ser removida. Abraços, Marcelo Utikawa da Fonseca
-
Olá! Qual o erro que aparece? Eu acho que é com a clrscr. Essa função serve para limpar a tela e não vai interferir no funcionamento do programa. Apenas comente ela! E remova também o include de conio.h. Mude a função getch para getchar. Fazendo essas alterações o programa deve compilar e funcionar. Abraços, Marcelo Utikawa da Fonseca
-
Aviso Para Estudantes De C/c++
pergunta respondeu ao Denis Bittencourt Muniz de Marcelo Utikawa da Fonseca em C, C++
Aos que tem dúvidas, criem um tópico na área de c/c++. Este tópico não é para tirar dúvidas, é apenas um aviso sobre como usar o fórum! Abraços, Marcelo Utikawa da Fonseca -
Ótimo! Valeu por avisar! E lembre-se de desalocar o vetor quando terminar de usar as pilhas! free(vet); E claro, lembre-se de desalocar as pilhas também mas aí já não sei qual é a função, depende aí de você. :) Abraços, Marcelo Utikawa da Fonseca
-
O vet deve ser um vetor para as pilhas oa invés de int. Veja abaixo: Pilha **vet; vet = (Pilha **)malloc(sizeof(Pilha *)*quant); for(i = 0; i < quant; i++){ vet[i] = criar(); } Eu fiz esse código de cabeça agora, deve estar certo. Acabou minha hora de almoço então não vou poder testar... Teste diga se resolveu! Abraços, Marcelo Utikawa da Fonseca
-
Dúvida - Elaborar Paciência em C++
pergunta respondeu ao Iago CF de Marcelo Utikawa da Fonseca em C, C++
Olá! Estou conseguindo fazer o programa mais rápido do que esperava! :) Agora o baralho.c está quase pronto. Faltam apenas as funções para criar o baralho completo (que é apenas um loop chamando a função Card_Create) e a função para embaralhar. Terminando é só fazer o jogo em si. Seguem os códigos atualizados: baralho.c #include <malloc.h> #include "baralho.h" Card * Card_Create(int iValue, Suit eSuit) { Card *pNew = (Card *)malloc(sizeof(Card)); if(pNew != NULL) { pNew->iValue = iValue; pNew->eSuit = eSuit; } return pNew; } void Card_Free(Card *pCard) { if(pCard != NULL) { free(pCard); } } char * Card_GetSuitString(Card *pCard) { if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: return "Ouros" ; case Spade : return "Espadas"; case Heart : return "Copas" ; case Club : return "Paus" ; } } return ""; } void CardList_InsertCard(CardList **pList, Card *pCard) { CardList *pNew, *pCurrent; if(pList == NULL || pCard == NULL) return; pNew = (CardList *)malloc(sizeof(CardList)); pNew->pCard = pCard; pNew->pNext = NULL; if(*pList == NULL) { *pList = pNew; } else { pCurrent = *pList; while(pCurrent->pNext != NULL) { pCurrent = pCurrent->pNext; } pCurrent->pNext = pNew; } } void CardList_InsertCardList(CardList **pList, CardList *pNew) { CardList *pCurrent; if(pList == NULL || pNew == NULL) return; if(*pList == NULL) { *pList = pNew; } else { pCurrent = *pList; while(pCurrent->pNext != NULL) { pCurrent = pCurrent->pNext; } pCurrent->pNext = pNew; } } CardList * CardList_GetSubset(CardList **pList, Card *pCard) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL || pCard == NULL) return NULL; pCurrent = *pList; while(pCurrent != NULL) { if(pCurrent->pCard->iValue == pCard->iValue && pCurrent->pCard->eSuit == pCard->eSuit) { break; // Achou a carta! } else { pPrevious = pCurrent; pCurrent = pCurrent->pNext; } } if(pPrevious != NULL) { pPrevious->pNext = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. return pCurrent; } Card * CardList_GetCard(CardList **pList) { CardList *pCurrent, *pPrevious = NULL; if(pList == NULL || *pList == NULL) return NULL; pCurrent = *pList; while(pCurrent->pNext != NULL) { pPrevious = pCurrent; pCurrent = pCurrent->pNext; } if(pPrevious != NULL) { pPrevious->pNext = NULL; } // Se achou, pCurrent tera a posicao onde inicia a lista a partir de pCard, senao tera NULO. return pCurrent->pCard; } baralho.h #ifndef BARALHO_H_INCLUDED #define BARALHO_H_INCLUDED typedef enum { Diamond, Spade, Heart, Club } Suit; typedef struct { int iValue; Suit eSuit; } Card; typedef struct strCardList CardList; struct strCardList { Card *pCard; CardList *pNext; }; // Funcoes referentes a Cartas Card * Card_Create (int iValue, Suit eSuit); void Card_Free (Card *pCard); char * Card_GetSuitString(Card *pCard); // Funcoes referentes a Listas de Cartas void CardList_InsertCard (CardList **pList, Card *pCard); void CardList_InsertCardList(CardList **pList, CardList *pNew); CardList * CardList_GetSubset (CardList **pList, Card *pCard); Card * CardList_GetCard (CardList **pList); #endif // BARALHO_H_INCLUDED paciencia.c #include <stdio.h> #include "baralho.h" void PrintCard(Card *pCard) { printf("%d %s\n", pCard->iValue, Card_GetSuitString(pCard)); } int main(void) { Card *pCard = Card_Create(3, Spade); CardList *pList = NULL, *pSubset; if(pCard != NULL) { printf("Carta criada! Valor: "); PrintCard(pCard); } else { printf("Erro ao criar carta!!!\n"); return 1; } CardList_InsertCard(&pList, Card_Create(1, Club )); CardList_InsertCard(&pList, Card_Create(3, Club )); CardList_InsertCard(&pList, Card_Create(8, Heart )); CardList_InsertCard(&pList, Card_Create(9, Diamond)); CardList_InsertCard(&pList, pCard); CardList_InsertCard(&pList, Card_Create(2, Heart )); CardList_InsertCard(&pList, Card_Create(4, Spade )); pSubset = CardList_GetSubset(&pList, pCard); pCard = CardList_GetCard (&pList); printf("Removida carta da lista principal: "); PrintCard(pCard); printf("Cartas na lista principal:\n"); while(pList != NULL) { PrintCard(pList->pCard); pList = pList->pNext; } printf("Cartas na sublista:\n"); while(pSubset != NULL) { PrintCard(pSubset->pCard); pSubset = pSubset->pNext; } return 0; } Abraços, Marcelo Utikawa da Fonseca -
Mas o que está dando errado? Coloque o código aqui para eu ver... E o que você precisa fazer é o que eu dei de exemplo na minha resposta! Abraços, Marcelo Utikawa da Fonseca
-
Oi! Você diz criar a pilha, funções de inserir, remover, é isso? Ou você já tem isso e precisa criar um vetor com várias pilhas? Para criar um vetor alocado dinamicamente você deve usar um ponteiro: int *ponteiro; ponteiro = (int *)malloc(sizeof(int)*10); ponteiro[0] = 25; ponteiro[1] = 8; Nesse código criei um vetor para int com 10 posições. Use uma variável no lugar do número 10 e terá quantas posições quiser... :) E mude o int para o tipo que quiser. Abraços, Marcelo Utikawa da Fonseca
-
Dúvida - Elaborar Paciência em C++
pergunta respondeu ao Iago CF de Marcelo Utikawa da Fonseca em C, C++
Boa tarde! Eu estou usando poucas bibliotecas. Apenas a stdio.h (para o printf, você também usa) e a malloc.h (para alocar memória pois não estou usando vetores de tamanho fixo mas sim ponteiros com alocação dinâmica). O typedef é apenas para criar um "apelido" para o nome do tipo, pode ser retirado. Além disso faz parte da linguagem, não é de nenhuma biblioteca. O ifdef também é da linguagem e é usado apenas por causa do arquivo .h. Isso é praxe. Se você abrir qualquer arquivo .h verá que existe isso. Serve para que o arquivo .h não tenha o seu conteúdo incluído mais de uma vez. Em projetos maiores isso é indispensável mas nesse caso pode ser removido sem problema. No seu caso, se o professor não deixa usar (o que não acredito, tente falar com ele), você pode retirar tudo isso, é bem simples. Eu não vou retirar pois minha intenção é terminar esse programa e deixar como referência aqui na parte de tutoriais do fórum. Assim é melhor que ele seja feito conforme manda o figurino... :P Agora estou no celular então não tenho como programar mas se você quiser posso tentar tirar suas dúvidas! Edit: esqueci de responder! O -> é operador de referência.serve para acessar os membros de uma estrutura, classe, etc através de um ponteiro. É o mesmo que o operador ponto, que é utilizado para acessar membros de variáveis diretamente.exemplo: struct coordenada { int x; int y; }; struct coordenada direto, *ponteiro; direto.x = 10; direto.y = 35; ponteiro = &direto; ponteiro->x = 10; ponteiro->y = 35; Abraços, Marcelo Utikawa da Fonseca -
De nada! A intenção é de ajudar mesmo... :) Precisando de algo mais é só perguntar. E a única ajuda que espero é a boa vontade das pessoas em aprender. Com certeza isso já será o bastante... B) Sobre fechar o tópico: Tente alterar o título do tópico adicionando [RESOLVIDO] no início. Abraços, Marcelo Utikawa da Fonseca
-
Oi! A conversão em si é apenas com relação à exibição dos valores pois o número é o mesmo sempre. Assim imagino que o que você precisa é receber um texto que deverá ser convertido para um valor numérico (no caso o que foi chamado de valor na base 10) e depois criar a nova string na base escolhida. Primeiro crie a função que receba um int (número inteiro) e escreva a string na base solicitada. Depois você faz o programa que converte uma string em um valor numérico. Mas tente fazer algo primeiro! Você sabe como criar um programa? Criar uma função? A partir do que foi feito é mais fácil para ajudar a mostrar o que falta! Abraços, Marcelo Utikawa da Fonseca
-
Dúvida - Elaborar Paciência em C++
pergunta respondeu ao Iago CF de Marcelo Utikawa da Fonseca em C, C++
Oi de novo! Desculpe mas não tenho muito tempo para ajudar mas o que conseguir vou passando. Tenho cerca de meia hora por dia apenas! Por enquanto consegui fazer o baralho.h, baralho.c e paciencia.c Ainda não faz muita coisa mas acho que dá para você entender o que precisa ser feito! Veja se consegue criar algo a partir do que foi feito. Eu testei e compilei no Linux e por isso fiz um script para compilar os arquivos. Mas como usei apenas ANSI C deve funcionar em qualquer SO. Seguem os arquivos: baralho.h #ifndef BARALHO_H_INCLUDED #define BARALHO_H_INCLUDED typedef enum { Diamond, Spade, Heart, Club } Suit; typedef struct { int iValue; Suit eSuit; } Card; typedef struct strCardList CardList; struct strCardList { Card *pCard; CardList *pNext; }; Card * Card_Create (int iValue, Suit eSuit); void Card_Free (Card *pCard); char * Card_GetSuitString(Card *pCard); #endif // BARALHO_H_INCLUDED baralho.c #include <malloc.h> #include "baralho.h" Card * Card_Create(int iValue, Suit eSuit) { Card *pNew = (Card *)malloc(sizeof(Card)); if(pNew != NULL) { pNew->iValue = iValue; pNew->eSuit = eSuit; } return pNew; } void Card_Free(Card *pCard) { if(pCard != NULL) { free(pCard); } } char * Card_GetSuitString(Card *pCard) { if(pCard != NULL) { switch(pCard->eSuit) { case Diamond: return "Ouros" ; case Spade : return "Espadas"; case Heart : return "Copas" ; case Club : return "Paus" ; } } return ""; } paciencia.c #include <stdio.h> #include "baralho.h" int main(void) { Card *pCard = Card_Create(3, Spade); if(pCard != NULL) { printf("Carta criada! Valor: %d, Naipe: %s\n", pCard->iValue, Card_GetSuitString(pCard)); } else { printf("Erro ao criar carta!!!\n"); } return 0; } compila.sh #!/bin/sh gcc -Wall -c -o baralho.o baralho.c gcc -Wall -o paciencia paciencia.c baralho.o Ao rodar o programa é exibido na tela: Carta criada! Valor: 3, Naipe: Espadas Espero conseguir fazer um pouco por dia. Se você conseguir algo coloque também pois assim é mais provável de você ter algo para aprensentar até dia primeiro. Abraços, Marcelo Utikawa da Fonseca -
Olá! O problema é com a função Fatorial que não retorna o valor. Ela tem return apenas para quando n for 1! O correto seria: double Fatorial ( int n ) { if ( n == 1 ) { return 1; } else { return n * Fatorial ( n - 1 ); } } Outro problema que vejo na sua lógica é que, na função Potencia, se y tiver valor negativo, a função não retorna nada. Traduzindo: retornará lixo! O correto seria retornar algum valor nesse caso como demonstrado abaixo: double Potencia ( double x , int y ) // Calcula a potência de x elevado a y. OBS : y é um inteiro , negativo ou positivo { if ( y == 0 ) { return 1; } // Caso y = 0 , todo número elevado a zero = 1 if ( y >= 1 ) // Caso y > 1 onde será necessário multiplicações sucessivas { double Potencia = x; while ( y > 1 ) { Potencia *= x; y--; } return Potencia; } return 0; } Abraços, Marcelo Utikawa da Fonseca
-
Dúvida - Elaborar Paciência em C++
pergunta respondeu ao Iago CF de Marcelo Utikawa da Fonseca em C, C++
Ok... Eu perguntei pois achava que você tinha conhecimentos mais básicos mesmo! Mas ou o professor exagerou ou você não conseguiu acompanhar pois esse programa exige no mínimo um conhecimento intermediário na linguagem... E desenvolver até o dia primeiro acho que você mesmo percebeu que é complicado!!! Eu não gosto de passar código pronto pois acho que estou mais atrapalhando que ajudando pois você pede a oportunidade de aprender e não sente o gosto da conquista. Mas como já está em cima da hora vou ajudar no que for possível... Primeiro vamos trabalhar apenas no baralho.c e depois a gente faz o jogo em si. Pode usar ponteiros no projeto? Tem alguma restrição ou exigência? Abraços, Marcelo Utikawa da Fonseca -
Interpretador de arquivos
pergunta respondeu ao Marcelo Utikawa da Fonseca de Marcelo Utikawa da Fonseca em Tutoriais & Dicas - C, C++
Entendi, ótima idéia!!! :) Já editei o código lá em cima para incluir a sua idéia. O que fiz foi mudar a função ExecuteFile para aceitar nulo como nome de arquivo. Nesse caso ele usa stdin. O que alterei foi o main.c para passar nulo quando não receber o argumento com o nome do arquivo e um if no interpretador, conforme a seguir: if(szFile == NULL) { pFile = stdin; } else { // Abre o arquivo e retorna erro se não conseguir pFile = fopen(szFile, "r"); if(pFile == NULL) { return iRet; } } Agora é possível executar o programa assim: cat teste.txt | ./interpretador Obrigado! Abraços, Marcelo Utikawa da Fonseca