Jump to content

Search the Community

Showing results for tags 'c'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Comunidade
    • Sugestões, Críticas ou Dúvidas relativas ao P@P
    • Acerca do P@P
  • Comunidade a Trabalhar
    • Apresentação de Projectos de Programação
    • Downloads
    • Revista PROGRAMAR
  • Desenvolvimento Geral
    • C
    • C++
    • Java
    • Pascal
    • Python
    • Bases de Dados
    • Dispositivos Móveis
    • Outras Linguagens
  • Desenvolvimento Orientado para Web
    • PHP
    • HTML
    • CSS
    • Javascript
    • Outras Linguagens de WebDevelopment
    • Desenvolvimento Web
  • Desenvolvimento .NET
    • C#
    • Visual Basic .NET
    • ASP.NET
    • WPF & SilverLight
  • Software e Sistemas Operativos
    • Software de Produtividade
    • Sistemas Operativos
    • Apresentação de Software
  • Informática
    • Interfaces Visuais
    • Computação Gráfica
    • Algoritmia e Lógica
    • Segurança e Redes
    • Hardware
    • Electrónica e Automação Industrial
    • Matemática
    • Software de Contabilidade, Finanças e Admin. Pública
    • Dúvidas e Discussão de Programação
    • Tutoriais
    • Snippets / Armazém de Código
  • Outras Áreas
    • Notícias de Tecnologia
    • Dúvidas Gerais
    • Discussão Geral
    • Eventos
    • Anúncios de Emprego
  • Arquivo Morto
    • Projectos Descontinuados
    • System Empires

Blogs

  • Blog dos Moderadores
  • Eventos
  • Notícias de Tecnologia
  • Blog do Staff
  • Revista PROGRAMAR
  • Projectos
  • Wiki

Categories

  • Revista PROGRAMAR
  • Tutoriais
  • Textos Académicos
  • Exercícios Académicos
    • Exercícios c/ Solução
    • Exercícios s/ Solução
  • Bibliotecas e Aplicações
  • Outros

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Website


GitHub


LinkedIn


Twitter


Facebook

  1. 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.
  2. 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 :)
  3. 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 😀
  4. 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!
  5. 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!
  6. 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:
  7. 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
  8. 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; }
  9. 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.
  10. 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; }
  11. Tombes010

    Jogo da sueca em C

    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?
  12. 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 https://photos.app.goo.gl/fcQN1EwvhGpZ2U749 (foi a única maneira que arranjei de partilhar uma imagem) Também já arranjei muito código daqui mas fui alterando para o que precisava
  13. 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; }
  14. Para quem tiver interesse, finalmente algumas novidades na linguagem: https://thephd.dev/c23-is-coming-here-is-what-is-on-the-menu. Resta aguardar pelos compiladores para começar a aproveitar algumas das inovações 🙂
  15. 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
  16. 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
  17. 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á
  18. Boa tarde, estou a tentar fazer um algoritmo em que diga qual nos 3 valores é maior, mas está-me sempre a dar erro. Alguém pode ajudar?? #include <stdlib.h> #include <math.h> #include <stdio.h> void main() { int num1,num2,num3,maior; printf("digite tres numeros : "); scanf("%d%d%d",&num1,&num2,&num3); int result if (num1>num2)(num1>num3) result=num1; if (num2>num1)(num2>num3) result=num2; if (num3>num2)(num2>num1) result=num3; result 0 }
  19. #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int dividendo, divisor, resto, temp_div, contaDigitos, quo_temp; char str_div[100] ; char aux_div[100]; char quo_aux_div[100]; char quo_div[100]; printf("Dividendo: "); scanf(" %d", &dividendo); printf("Divisor: "); scanf(" %d", &divisor); int aux = dividendo; while (aux != 0){ contaDigitos++; aux/=10; } int array_dividendo[contaDigitos]; for (int i = 0; i < contaDigitos; ++i) { array_dividendo[contaDigitos-1-i] = dividendo % 10; dividendo/=10; } for (int i = 0; i < contaDigitos; ++i) { sprintf(aux_div, "%d", array_dividendo[i]); strcat(str_div, aux_div); temp_div = atoi(str_div); if(temp_div >= divisor) { quo_temp = temp_div / divisor; sprintf(quo_aux_div, "%d", quo_temp); strcat(quo_div, quo_aux_div); printf("\nQuociente: %d", quo_temp); resto = temp_div - (quo_temp * divisor); sprintf(str_div, "%d", resto); } } int quociente = atoi(quo_div); printf("\nQuociente: %d", quociente); printf("\nResto: %d", resto); return 0; } Boa noite, estou a ter um erro a imprimir o quociente no fim do ciclo for , mas não percebo o porquê alguém me podia ajudar sff
  20. Boa noite, Estou usando Visual Studio 2019 e estou com varios problemas.. Estou fazendo um teste de bibliotecas giflib com addon https://github.com/grimfang4/SDL_gifwrap, para SDL2. para correr gifs animados em SDL2. usando o exemplo base do gifwrap o programa corre e compila, mas tendo logo a partida 2 problemas, tenho que usar main.c (C, quando quero usar cpp) e include tem que ser #include "SDL_gifwrap/SDL_gifwrap.c", onde deveria ser .h, mas se colocar .h o programa simplesmente nao compila. O erro aqui apresentado com .h é o mesmo de quando tento compilar com main.cpp. LNK2019. main.c/cpp neste caso so roda se for c. //BEGIN PROGRAM HEAD //BEGIN INCLUDES //local headers //#include "helper.h" #include <gif_lib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "SDL_gifwrap/SDL_gifwrap.h" //should be SDL_gifwrap.c #include "sdl.h" #include <SDL_image.h> //END INCLUDES //BEGIN GLOBALS SDL_Window* Window; SDL_Renderer* Renderer; //SDL_Window* Window = NULL; //SDL_Renderer* Renderer = NULL; SDL_Texture* texture_; SDL_Rect gif; GIF_Image* gifA = NULL; Uint16 i = 0; int br; int bg; int bb; int logging = 0; //END GLOBALS //BEGIN FUNCTION PROTOTYPES void draw_current_gif_frame(void); //END FUNCTION PROTOTYPES //BEGIN MAIN FUNCTION int main(int argc, char* argv[]) { (void)argc; (void)argv; SDL_Init(SDL_INIT_EVERYTHING); //TTF_Init(); Window = SDL_CreateWindow("SDL2 gif stress", 50, 50, 350, 350, 0); //Renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); Renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED); SDL_SetRenderDrawColor(Renderer, 255, 0, 0, 255); SDL_RenderClear(Renderer); //BEGIN GIF int error; // GifFileType * gif2 = DGifOpenFileName("c-exec.gif", &error); char gifname[50]; if (argc < 2) sprintf(gifname, "33.gif"); else sprintf(gifname, argv[1]); GifFileType* gif2 = DGifOpenFileName(gifname, &error); if (DGifSlurp(gif2) == GIF_ERROR) { DGifCloseFile(gif2, &error); } // // SDL_Log("%d",gif2->SColorMap->Colors->Red); br = gif2->SColorMap->Colors->Red; // SDL_Log("%d",gif2->SColorMap->Colors->Green); bg = gif2->SColorMap->Colors->Green; // SDL_Log("%d",gif2->SColorMap->Colors->Blue); bb = gif2->SColorMap->Colors->Blue; if (gifA = GIF_LoadImage(gifname)) i = 0; SDL_Event event; int running = 1; int pause = 0; //BEGIN TIMING int delay; unsigned int startTime, currentTime, frameTime = 0; startTime = SDL_GetTicks(); delay = gifA->frames[i]->delay; //END TIMING //END INIT //BEGIN MAIN LOOP while (running) { //BEGIN EVENT LOOP while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { running = 0; } else { SDL_SetWindowTitle(Window, "SDL 2 - Animated GIF"); } } //END EVENT LOOP currentTime = SDL_GetTicks(); frameTime = currentTime - startTime; startTime = currentTime; if (delay <= 0) { i++; if (i > gifA->num_frames - 1) i = 0; delay = gifA->frames[i]->delay; } delay -= frameTime; /*}*/ //BEGIN RENDERING draw_current_gif_frame(); //END RENDERING SDL_Delay(33); } //END MAIN LOOP //BEGIN CLEAN UP if (texture_ != NULL) SDL_DestroyTexture(texture_); if (gifA != NULL) GIF_FreeImage(gifA); SDL_DestroyRenderer(Renderer); SDL_DestroyWindow(Window); //TTF_Quit(); SDL_Quit(); //exit_(); //END CLEAN UP return EXIT_SUCCESS; } //END MAIN FUNCTION void draw_current_gif_frame() { gif.x = (gifA->frames[i]->left_offset);// *current_scale) + gif_canvas.dst.x; gif.y = (gifA->frames[i]->top_offset);// * current_scale) + gif_canvas.dst.y; gif.w = (gifA->frames[i]->width);// * current_scale); gif.h = (gifA->frames[i]->height);// * current_scale); // SDL_SetRenderDrawColor(Renderer, br, bg, bb, 255); SDL_RenderFillRect(Renderer, &gif); //SDL_RenderClear(Renderer); texture_ = SDL_CreateTextureFromSurface(Renderer, gifA->frames[i]->surface); SDL_RenderCopy(Renderer, texture_, NULL, &gif); SDL_RenderPresent(Renderer); } agradeco a ajuda, pois estou mentalmente bloqueado, possivelmente por algo simples. P.S ja cheguei a add extern"C" no include mas tambem não ajudou. Obrigado
  21. Bom dia a todos, Tenho mais uma duvida num programa que realizei, que não consigo que faça a parte do "if" para indicar se existe mulher ou homem, indica sempre o valor da média igual nas duas categorias. Abaixo apresento o que me aparece quando compilo. Já pensei se era da função igual que utilizo no "if" mas se colocar apenas um igual, não dá qualquer valor, já tentei de diversas formas, mas sinceramente não estou a conseguir descodificar o problema, será que me podem ajudar, se faz favor? Envio abaixo o código que fiz: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<locale.h> #include<ctype.h> #include<math.h> int main(){ setlocale(LC_ALL, "Portuguese"); int numero, num_pecas, operario, total_pecas=0, cont_M=0, cont_F=0; char sexo; float salario_minimo=600.0, salario, total_pag=0, media_M=0, media_F=0, salario_maior=0, maior; for(operario=1;operario<=2;operario++){ printf("Indique o número do %dº operário: ", operario); scanf("%d",&numero); printf("Indique o número de peças fabricadas no mês pelo %dº operário: ", operario); scanf("%d",&num_pecas); printf("Indique o sexo do operário (F-Feminino ou M-Masculino): "); scanf("%c%*c",&sexo); if(num_pecas<=30.00){ printf("\nO número do operário é de Classe 1 e "); salario=salario_minimo; } if(num_pecas>30.0 && num_pecas<=50.0){ printf("\nO número do operário é de Classe 2 e "); salario=salario_minimo+(salario_minimo*(3.0/100.0)*(num_pecas-30.0)); } if(num_pecas>50.0){ printf("\nO número do operário é de Classe 3 e "); salario=salario_minimo+(salario_minimo*(5.0/100.0)*(num_pecas-30.0)); } printf("o seu salário é de %.2f.\n", salario); printf("\n"); total_pag+=salario; total_pecas+=num_pecas; if(sexo='M'){ media_M+=num_pecas; cont_M++; } if(sexo='F'){ media_F+=num_pecas; cont_F++; } if(operario==1){ salario_maior=salario; maior=numero; }else{ if(salario>salario_maior){ salario_maior=salario; maior=numero; } } } printf("\nO total da folha de pagamentos da fábrica é de %.2f.\n", total_pag); printf("O número total de peças fabricadas no mês é de %d.\n",total_pecas); if(cont_M==0){ printf("Não há nenhum homem!\n"); }else{ media_M=media_M/cont_M; printf("A média de peças fabricadas por homens é de %.2f.\n",media_M); } if(cont_F==0){ printf("Não há nenhuma mulher!\n"); }else{ media_F=media_F/cont_F; printf("A média de peças fabricadas por mulheres é de %.2f.\n",media_F); } printf("O número do operário com maior salário é %.2f.\n", maior); system("pause"); return 0; } Obrigada.
  22. Boa tarde, Preciso da vossa ajuda se faz favor com um exercício que estou a tentar fazer de um livro, mas infelizmente não tem solução completa e já tentei de diferentes formas e não consigo perceber como colocar o programa a funcionar. O enunciado é pedido o seguinte: Através disto fiz o seguinte código: #include<stdio.h> #include<stdlib.h> #include<locale.h> #include<string.h> #include<ctype.h> #include<math.h> int main(){ setlocale(LC_ALL, "Portuguese"); float hora,minutos; printf("Indique uma hora com minutos se parado por virgula: "); scanf("%f",&hora); minutos=(int)hora*60; printf("A hora indicada em minutos é %f.\n",minutos+(hora-(int)hora)); system("pause"); return 0; } No entanto, não estava a funcionar porque a parte fracionária não adicionava á parte inteira conforme pretendido e verifiquei a solução e indica o seguinte: Mas infelizmente não estou a conseguir perceber a razão da multiplicação dos minutos com 100 e tentei usar a função "modf", mas penso que não está a funcionar. #include<stdio.h> #include<stdlib.h> #include<locale.h> #include<string.h> #include<ctype.h> #include<math.h> int main(){ setlocale(LC_ALL, "Portuguese"); float hora,z, y; int minutos,conversao; printf("Indique uma hora com minutos se parado por virgula: "); scanf("%f",&hora); z=modf(hora,&y); minutos=hora-y; conversao=(y*60.0)+(minutos*100.0); printf("A hora indicada em minutos é %d.\n",conversao); system("pause"); return 0; } Será que me conseguem ajudar com este exercício? Obrigada.
  23. Suelen

    Algarismos de número

    tem como me ajudar fazendo apenas com <stdio.h> eu achei esse aqui mas tem coisas nele que eu ainda nao estudei, entao queria saber se tem como usar só <stdio.h> #include <stdio.h> #include <conio.h> #include <string.h> main () { int num, a, i; char tam[10]; printf("Digite\t"); scanf("%d",&num); if (num < 0){ num = -num; } sprintf(tam,"%d",num); a = strlen(tam); printf("Valor Absoluto"); for (i=0;i<a;i++) printf("\n|%c| = %c ",tam[i],tam[i]); getch(); return 0; }
  24. 5000, BP, BP SA, 1100, 2, 10000, 100000, 120000, 2000, Ind, Mario e filhos lda, 1100, 0, 0, 10000, 19000, 8000, Repsol, Repsol SA, 1100, 3, 1000, 90000, 95000, 1000, BP, BP SA, 1100, 0, 0, 100500, 125000, 3000, Galp, Galp SA, 1100, 2, 30000, 200000, 250000, 6000, Galp, Galp SA, 1100, 0, 1000, 10000, 16000, 9000, Prio, BilaGas lda, 5000, 1, 0, 75000, 99000, tenho este conjunto de dados e preciso de os exportar para uma tabela em excel, sendo que estes estão integrados numa bst, isto é, cada linha está identificada pelo id que é o primeiro elemento de cada linha (os elementos estão separados por virgulas). Assim como posso implementar uma função que o faça???
  25. Alguém me pode explicar que código em C eu implemento para garantir que um valor numa BTS é único? Obrigada.
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.