Ir para o conteúdo

Pesquisar na Comunidade

A mostrar resultados para tags ''c''.



Mais opções de pesquisa

  • Pesquisa por Tags

    Introduza as tags separadas por vírgulas.
  • Pesquisar por Autor

Tipo de Conteúdo


Fórum

  • Bem-vindos ao Portugal-a-Programar
    • Sugestões, Críticas ou Dúvidas relativas ao P@P
    • Acerca do P@P
    • Apresentações
  • Comunidade a Trabalhar
    • Wiki P@P
    • Apresentação de Projectos de Programação
    • Downloads
  • Revista PROGRAMAR
    • Revista PROGRAMAR
  • Desenvolvimento Geral
    • C
    • C++
    • Java
    • Haskell
    • Pascal
    • Python
    • Bases de Dados
    • Visual Basic Clássico
    • Visual Basic for Applications (VBA)
    • 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
    • SharePoint
    • Apresentação de Software
  • Informática Extra-Programação
    • Interfaces Visuais
    • Computação Gráfica
    • Algoritmia e Lógica
    • Segurança e Redes
    • Hardware
    • Electrónica
    • Automação Industrial
    • Dúvidas e Discussão de Programação
    • Notícias de Tecnologia
  • Outras Áreas
    • Matemática
    • Dúvidas Gerais
    • Discussão Geral
    • Eventos
    • Anúncios de Emprego
    • Tutoriais
    • Snippets / Armazém de Código
  • Arquivo Morto
    • Projectos Descontinuados
    • System Empires

Blogs

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

Categorias

  • 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



Filtrar por número de...

4885 resultados

  1. Exercicio em C

    Estou a iniciar a minha aprendizagem na linguagem C, e queria saber como faço para ler um número inteiro e determinar todos os números primos iguais ou inferiores a esse número. Na alinea anterior pedia so para determinar se 1 numero inserido pelo utilizador era primo ou nao, e resolvi da seguinte forma. void primos(){ int n,i,div=0; printf("Digite 1 numero:"); scanf("%d",&n); if(n>1){ for(i=1;i<=n;i++){ if(n % i ==0) div++; } if(div == 2){ printf("O numero %d e primo",n); } else{ printf("O numero %d nao e primo",n); } } }
  2. Exercício em C

    Boas pessoal, eu ainda sou novo nisto, como faço para programar em c 1. Converta uma determinada quantia em € num conjunto de moedas. Considere que existem moedas de €0.01, €0.05, €0.2 e €0.5. A quantidade de moedas deve ser mínima. 2. Calcule a quantidade de dinheiro que um cliente tem no banco ao fim de um ano, dada a data de hoje, o montante inicial e a taxa de juro anual. O formato em que é apresentada a informação deve ser o seguinte: Informação necessária: Data Actual: 10/10/2008 Montante inicial: €10000 Taxa: 10% Cálculo do montante: No dia 10/10/2009 vai ter no banco €11000.
  3. Bom dia, vinha pedir se alguém me pode ajudar com um exercício que fiquei de fazer de uma aula... Este pede para fazermos um programa que resolva um sistema de equações de duas incógnitas usando a regra de Cramer e que no final imprime a duas soluções ou diga indeterminado ou impossível... Já tentei mas deu me sempre erro. Se alguém puder disponibilizar a solução agradecia.
  4. Programar em C: Compiladores, tutoriais, ...

    Este tópico contém informação desactualizada. Um artigo mais recente (e para o qual todos podem contribui) sobre como configurar o seu sistema para programar em C está disponível no Wiki da comunidade. Para começar a programar em C é preciso um compilador, ferramenta que transforma o código fonte num programa executável. Ambientes WINDOWS: Para escrever o código-fonte, necessitamos de um IDE, ou seja de um ambiente de desenvolvimento integrado. Entre inúmeros IDE´s que existem disponíveis na Internet para download destaco: ---> DevC++ (download) ---> Eclipse (download) ---> Visual C/C++ da microsoft (download) ---> etc, etc, ... Depois de escrever o código é só compilar, se não existirem erros gera-se o executável, que é o resultado do código... Ambientes *NIX: Neste ambientes o compilador costuma ser o Gcc. Este pode já ter sido instalado quando se instalou o Sistema Operativo, senão é necessário fazer download. Para o instalar em princípio só deve ser executar fazer na consola: ...$ yum install gcc ou ...$ apt-get install gcc No Mac OS X, o gcc está disponível no DVD 2, juntamente com as restantes ferramentas de desenvolvimento. Para escrever o código-fonte podemos usar qualquer editor de texto. Depois basta ir à consola, colocar-se na respectiva directoria e fazer: ...$ gcc "nomedoprograma.c" -o "nomedoexecutavel" Para correr o executável faz-se: ...$ ./"nomedoexecutável" Nota: Se não quizermos escrever o código num editor de texto também existem IDE´s para *NIX. Um deles é o Anjuta disponível para download aqui. Tutoriais Este tutorial é bastante bom para quem quer ter bases de programação em C. Neste fórum existem outros tutoriais para iniciantes. Não os vou estar a colocar aqui pois estão disponíveis para todos. Senão usem um motor de busca porque se há coisa que não falta é informação desta. Alguma dúvida é só dizer.
  5. Como dominar o uso de bibliotecas em C?

    Olá a todos, eu estou aprendendo a programar em C eu já sei algumas coisas básicas da linguagem agora eu estou querendo dominar o uso das bibliotecas em C alguém poderia me dar algumas dicas ou indicar algum conteúdo?
  6. Contar palavras numa string

    Para contar o numero de palavras numa string uso: char frase[50]; int i, flag = 0, total = 0; printf("Introduza a frase\n"); fgets(frase, 51, stdin); for (i = 0; i<strlen(frase); i++) { if (!flag && frase[i] != ' ') { flag = 1; total++; } else if (flag && frase[i] == ' ') flag = 0; } printf("O número de palavras é: %d\n", total); mas quando quero calcular o numero de palavras de várias frases que são que são introduzidas seguidas de enter como faço? Pois com este código não me vai contar a primeira palavra da segunda frase
  7. Sobre C#

    parece que aqui n tem c# ,mas vcs podem me ajudar? 2 Faça um programa que leia dois valores: A e B (positivos). Se A for menor que B,calcule e imprima a soma dos números ímpares existente entre A(inclusive) e B (inclusive). Se A for maior que B, calcule e imprima a média aritmética dos múltiplos de 3 existentes entre A(inclusive) e B(inclusive). _________________________________________________________________________________________ 3 Faça um programa que leia um valor A e um valor N. Calcule e imprima a soma dos N primeiros números a partir de A (inclusive). Considere que não será lido um valor negativo para N. Exemplo: A N SOMA 3 2 ( 3+4) = 7 4 5 (4+5+6+7+8) = 30
  8. Escrever para ficheiro

    Boa tarde, Estou com um problema num trabalho de c, estou a fazer um registo, mas quando guardo o registo no ficheiro, em vez de me acrescentar substitui os valores que tenho no ficheiro, alguém me pode ajudar? Código de adicionar registo: void adicionarUtilizador(Utilizador *user, unsigned short int *numUsers) { if (*numUsers < TAM_MAX_USERS) { readShort(&user->numero, 0001, 9999, "Introduza o seu numero de porta: "); *numUsers = *numUsers + 1; salvarClienteFicheiro(user, *numUsers); printf("\n\t\t******** Utilizador adicionado com sucesso **********\n\n\n"); } else { printf("\n\t\t******** espaco insuficiente para adicinar utilizadores **********\n\n"); } } Codigo guardar no ficheiro void salvarClienteFicheiro(Utilizador *utilizador, unsigned short int contador) { FILE *fp; fp = fopen("utilizadores.txt", "w"); if (fp == (FILE *) NULL) { printf("Impossivel escrever ficheiro!\n"); } else { fwrite(utilizador, sizeof (Utilizador), contador, fp); fclose(fp); } } Estrutura Utilizador typedef struct { unsigned short numero; } Utilizador;
  9. ler ficheiro e carregar para estrutura

    Boa noite, Queria ler um ficheiro de texto em c e posteriormente carregar para uma estrutura os dados que tenho no ficheiro. A estrutura que tenho é esta: struct doc{ char titulo[50]; char resumo[500]; } --------------------------------------------------------- o meu doc.txt tem a seguinte estrutura: titulo exemplo conteudo exemplo ---------------------------------------------------------- para ler a primeira linha eu sei fazer(código em baixo) mas eu queria ler a primeira linha e adicionar a variável titulo e a segunda linha adicionar a variável resumo, podem-me ajudar? FILE *fp; const int BUFFER_SIZE = 60; char str[BUFFER_SIZE]; fp = fopen("texto.txt", "r"); if(fp == NULL){ perror("erro a abrir ficheiro"); return (-1); } if(fgets(str, BUFFER_SIZE, fp) != NULL){ puts(str); } fclose(fp);
  10. Erro em estruturas

    Boas malta, estou com um erro que não estou a perceber porque até porque no mesmo ficheiro tenho igual e lá não da erro... Ja pesquisei mas não consegui resolver ou ficar esclarecido do porque do erro. typedef struct medico Medico, *pMedico; typedef struct paciente Paciente, *pPaciente; typedef struct consulta Consulta, *pConsulta; typedef struct aIndividual Individual, *pIndividual; typedef struct agenda Agenda, *pAgenda; struct info{ int dia, mes, ano; }; struct consulta { char nome_medico[50]; char tipo_consulta[50]; int dia; int mes; int ano; pConsulta prox; }; struct paciente { char nome[50]; int num_consultas; struct info data_nascimento; // historico consultas struct consulta lista; pPaciente prox; }; struct medico { char nome[50]; char apelido[50]; char especialidade[50]; float entrada; float saida; pMedico prox; }; struct agenda { char nome_medico[50]; char especialidade[50]; struct aIndividual a_individual; //ERRO É AQUI pAgenda prox; }; struct aIndividual { char tipo[20]; char paciente[50]; int idade; float hora_inicio; float hora_fim; pIndividual prox; }; Eu tenho estas estruturas num projeto e dá-me o seguinte erro: head1.h:69:24: error: field 'a_individual' has incomplete type Como é que eu posso resolver? Até porque na estrutura paciente estou a usar da mesma maneira e funciona perfeitamente.
  11. Ajuda programa Disable Keys

    Boa noite, O que o código do meu programa faz é desactivar as teclas O e P do teclado, Agora queria deixas a tecla O desactiva e activar a tecla P Precisava de uma ajuda no seguinte código como fazer: #define NDEBUG #include <dos.h> #define KEYBOARD_INT 0x09 // Keep program small extern unsigned _stklen = 128; extern unsigned _heaplen = 128; const int scan_code1 = 0x18; // O key //const int scan_code2 = 0x19; // P key void interrupt (*old_keyboard_handler)(void); void reset_keyboard(void) { char ctrl = inportb(0x61); // Get value of keyboard control lines outportb(0x61, ctrl | 0x80); // Set the enabled keyboard bit outportb(0x61, ctrl); // Write back the original control value outportb(0x20, 0x20); // Send end-of-interrupt to the PIC } void interrupt new_keyboard_handler(void) { int key = inportb(0x60); // Get scan code if (key == scan_code1 || key == scan_code2) reset_keyboard(); else old_keyboard_handler(); } int main(void) { unsigned size = 0; old_keyboard_handler = getvect(KEYBOARD_INT); setvect(KEYBOARD_INT, new_keyboard_handler); #ifndef NDEBUG puts("Installing TSR"); #endif // Compute program size // Allow one paragraph for some pushes and another one to round division up size = _SS + _SP / 16 + 2 - _psp; #ifndef NDEBUG printf("Program size = %u paragraphs\n", size); #endif keep(0, size); return 0; } Obrigado a todos
  12. [Resolvido] Passar info de txt para lista ligada

    Boas malta, estou com uns problemas para passar a informação de um ficheiro txt para uma lista ligada. O ficheiro de texto está assim: nome Nascimento 2 consultas tipo cnsulta - data - medico tipo cnsulta - data - medico nome Nascimento 0 consultas e a minha estrutura está: typedef struct{ int dia, mes, ano; } info; struct consulta { char nome_medico[50]; char tipo_consulta[20]; char especialidade[50]; int dia; int mes; int ano; pConsulta prox; }; struct paciente { char nome[50]; //char apelido[50]; //char num_consultas; int num_consultas; // data de nascimento info data_nascimento; // historico consultas pConsulta lista; pPaciente prox; }; Agora o meu problema é passar a infomação para a lista ligada.
  13. Boa tarde! Estou a fazer um trabalho em linguagem `C`, onde tenho de mostrar na consola a informação guardada num ficheiro de texto, mas é obrigatório passar toda a informação para `vetores` dinâmicos de estruturas. Eu penso já ter conseguido feito alguma coisa, mas quando tento guardar a especialidade numa `variável`, o ficheiro acaba por guardar as palavras seguintes. Ex: O `v->nome` está a guardar "Joao Silva" e o `v->especialidade` está a guardar "Neurologia 9.30 - 17.00" e eu pretendo guardar apenas "Neurologia". Alguém me consegue ajudar? struct hora_entrada{int horas, minutos;}; struct hora_saida{int horas, minutos;}; typedef struct medico med, *p_med; struct medico{ char nome[ST_TAM]; char especialidade[ST_TAM]; struct hora_entrada h_e; struct hora_saida h_s; }; int le_dados (){ FILE *f, *g; med *v; f=fopen("medico.txt", "rt"); g=fopen("paciente.txt", "rt"); if (f==NULL || g==NULL){ printf("Erro no acesso ao ficheiro.\n"); return 0; } v=malloc(sizeof(med)); if (v==NULL){ printf("Erro na alocaçao de memoria.\n"); return 0; } while ((fscanf(f,"%49[^\n] %49[^\n]",v->nome, v->especialidade))==2 ) printf("%s\n%s",v->nome, v->especialidade); fclose(f); }
  14. Como procurar um elemento num vetor de estruturas?

    Boa noite! Estou a fazer um trabalho em ´C´ onde tenho de procurar médicos por especialidade, ou seja, pergunto ao utilizador o nome da especialidade a procurar e faço um ´printf´ dos médicos dessa especialidade. Eu tentei fazer isso mas dá-me sempre "Especialidade inexistente." mesmo procurando por uma especialidade que sei que está no ficheiro. Alguém me consegue ajudar? Até agora o meu código é este: struct hora_entrada{int horas, minutos;}; struct hora_saida{int horas, minutos;}; typedef struct medico med, *p_med; struct medico{ char nome[ST_TAM]; char especialidade[ST_TAM]; struct hora_entrada h_e; struct hora_saida h_s; p_med prox; }; struct data_nasc{int dia, mes, ano;}; struct historico{ char grau[ST_TAM]; int d_dia; int d_mes; int d_ano; char nome[ST_TAM]; }; typedef struct paciente pac, *p_pac; struct paciente{ char nome[ST_TAM]; struct data_nasc d_n; int consultas; struct historico h; p_pac prox; }; //------------------------------------------------------------------ //Listagem completa de medicos e pacientes int le_dados (){ FILE *f, *g; med *v; pac *a; int i; f=fopen("medico.txt", "rt"); g=fopen("paciente.txt", "rt"); if (f==NULL || g==NULL){ printf("Erro no acesso ao ficheiro.\n"); return 0; } v=malloc(sizeof(med)); a=malloc(sizeof(pac)); if (v==NULL || a==NULL){ printf("Erro na alocaçao de memoria.\n"); return 0; } med *listaMedicos = v; //a lista começa no v, o primeiro médico med *antMed = NULL; printf("\nMEDICOS\n"); while (fscanf(f,"%49[^\n] %49s %d.%d - %d.%d\n",v->nome, v->especialidade, &v->h_e.horas, &v->h_e.minutos, &v->h_s.horas, &v->h_s.minutos )==6 ){ printf("%s\n%s %d.%d %d.%d\n",v->nome, v->especialidade, v->h_e.horas, v->h_e.minutos, v->h_s.horas, v->h_s.minutos); v->prox = malloc(sizeof(med)); //aloca um nó para o próximo médico antMed = v; //ponteiro para o médico antes do fim v=v->prox; } if (antMed == NULL){ //não deu para ler nenhum médico, libertar o único nó alocado free(listaMedicos); listaMedicos = NULL; //por o a apontar para NULL para a impressão funcionar } else{ free(antMed->prox); //libertar o último médico alocado que não foi utilizado antMed->prox = NULL; //por a apontar para NULL para a impressão funcionar } pac *listaPacientes = a; //a lista começa no a, o primeiro paciente pac *antPac = NULL; printf("\n\nPACIENTES\n"); while (fscanf(g,"%49[^\n] %d-%d-%d %d",a->nome, &a->d_n.dia, &a->d_n.mes, &a->d_n.ano, &a->consultas)==5){ printf("Nome: %s\nData de nascimento: %d-%d-%d\nConsultas: %d\n",a->nome, a->d_n.dia, a->d_n.mes, a->d_n.ano, a->consultas); for(i=0;i<a->consultas;i++){ fscanf(g,"%s - %d/%d/%d - %[^\n]\n",a->h.grau, &a->h.d_dia, &a->h.d_mes, &a->h.d_ano, &a->h.nome); printf("\t%s %d/%d/%d %s\n",a->h.grau, a->h.d_dia, a->h.d_mes, a->h.d_ano, a->h.nome); } a->prox = malloc(sizeof(pac)); //alocar um nó para o próximo paciente antPac = a; //ponteiro para o paciente antes do fim a = a->prox; } if (antPac == NULL){ //não deu para ler nenhum paciente, libertar o único nó alocado free(listaPacientes); listaPacientes = NULL; //por a apontar para NULL para a impressão funcionar } else{ free(antPac->prox); //libertar o ultimo paciente alocado que não foi utilizado antPac->prox = NULL; //por a apontar para NULL para a impressão funcionar } fclose(f); } //Pesquisar médicos por especialidade int pesquisa (p_med v){ char *esp; printf("Insira uma especialidade a pesquisar:\n"); scanf("%s", &esp); while (v!=NULL && v->especialidade!=esp) v=v->prox; if (v!=NULL) printf("%s\n",v->nome); else printf("Especialidade inixestente.\n"); }
  15. Imaginando que temos algo deste tipo int somatorio[4] ={0,0,0,0}; que pode ter todos os valores em binário desde 0000 até 1111. Em determinado momento é preciso comparar esse conteúdo com valores predefinidos, nomeadamente numeros tipo 1111 ou 1011 que representam acções distintas num switch case. Há alguma forma de fazer essa comparação? Ou é preciso converter o array para string? Andei a pesquisar e para numeros de base 10 existem algumas técnicas... Será que é possível adaptar algo desse tipo? Obrigado pela vossa atenção...
  16. Erro ao compilar

    Muito bom dia a todos do fórum. Um agradecimento humilde ao HH por toda a ajuda que da no forum... Estou a fazer o seguinte exercício de um livro (Cprimer plus, Stephen Prata): O codigo que fiz foi este: /* */ #include <stdio.h> #define PAYRATE 10 #define NORMALTIME 40 #define OVERTIME 1.5 #define PAYRATE2 (PAYRATE*OVERTIME) #define RATE1 0.15 #define RATE2 0.20 #define RATE3 0.25 #define BREAK1 300 #define BREAK2 450 #define TAX1 (RATE1*BREAK1) #define TAX2 (TAX1+(RATE2*(BREAK2-BREAK1)) int main(void) { double hours_w,gross_pay,net_pay,taxes; hours_w=gross_pay=net_pay=taxes=0.0; printf("Please insert the number of hours worked this week:\n"); scanf("%lf",&hours_w); if(hours_w<=NORMALTIME) gross_pay=hours_w*PAYRATE; else gross_pay=(hours_w*PAYRATE)+(hours_w-NORMALTIME*PAYRATE2); if(gross_pay<=BREAK1) { taxes=gross_pay*RATE1; net_pay=gross_pay-taxes; } else if(gross_pay<=BREAK2) { taxes=TAX1+(gross_pay-BREAK1)*RATE2; net_pay=gross_pay-taxes; } else { taxes=TAX2+(gross_pay-BREAK2)*RATE3; net_pay=gross_pay-taxes; } printf("Number of hours worked:%2.2lf\n",hours_w); printf("gross pay=%2.2lf; taxes=%2.2lf; net pay=%2.2lf.\n",gross_pay,taxes,net_pay); return 0; } O programa parece estar bem feito, mas da este estranho erro de compilacao referente ao ultimo else do programa: Ora se eu alterar o ultimo else para: taxes=TAX2+(gross_pay-BREAK2)*RATE3); net_pay=gross_pay-taxes;; ...o que semanticamente esta brutalmente mal, mas o programa nao se queixa e corre normal. Esquisito... O que esta mal? Porque e que isto acontece? E defeito do programa ou falha do compilador...? Ja agora aproveito e estou aberto a uma possível sugestão de melhoria do programa, e agradeco imenso o vosso apoio e paciencia. Abraco a todos
  17. Forçar "Executar como administrador"

    Boas, Como posso forçar que um programa em C só execute com privilégios de administrador? Obrigado.
  18. Problema com fscanf

    Boa noite! Estou com uma dúvida no meu segundo `fscanf` da parte dos PACIENTES, porque queria guardar a data que aparece no ficheiro de texto (o dia em a->h.d_dia, o mes em a->h.d_mes e o ano em a->h.d_ano), mas está-me a aparecer números aleatórios na consola. Alguém sabe como me ajudar? P.S: Na parte dos médicos também era suposto aparecer alguma coisa, mas não consigo achar o erro. Se alguém souber, também agradeço. struct hora_entrada{int horas, minutos;}; struct hora_saida{int horas, minutos;}; typedef struct medico med, *p_med; struct medico{ char nome[ST_TAM]; char especialidade[ST_TAM]; struct hora_entrada h_e; struct hora_saida h_s; p_med prox; }; struct data_nasc{int dia, mes, ano;}; struct historico{ char grau[ST_TAM]; int d_dia; int d_mes; int d_ano; char nome[ST_TAM]; }; typedef struct paciente pac, *p_pac; struct paciente{ char nome[ST_TAM]; struct data_nasc d_n; int consultas; struct historico h; p_pac prox; }; int le_dados (){ FILE *f, *g; med *v; pac *a; int i; f=fopen("medico.txt", "rt"); g=fopen("paciente.txt", "rt"); if (f==NULL || g==NULL){ printf("Erro no acesso ao ficheiro.\n"); return 0; } v=malloc(sizeof(med)); a=malloc(sizeof(pac)); if (v==NULL || a==NULL){ printf("Erro na alocaçao de memoria.\n"); return 0; } printf("\nMEDICOS\n"); while (fscanf(f,"%49[^\n] %49s %d:%d-%d:%d",v->nome, v->especialidade, &v->h_e.horas, &v->h_e.minutos, &v->h_s.horas, &v->h_s.minutos )==6 ) printf("%s %s %d %d %d %d\n",v->nome, v->especialidade, &v->h_e.horas, &v->h_e.minutos, &v->h_s.horas, &v->h_s.minutos); printf("\n\nPACIENTES\n"); while (fscanf(g,"%49[^\n] %d-%d-%d %d",a->nome, &a->d_n.dia, &a->d_n.mes, &a->d_n.ano, &a->consultas)==5) printf("Nome: %s\nData de nascimento: %d-%d-%d\nConsultas: %d\n",a->nome, a->d_n.dia, a->d_n.mes, a->d_n.ano, a->consultas); for(i=0;i<a->consultas;i++){ fscanf(g,"%s %d %d %d",a->h.grau, &a->h.d_dia, &a->h.d_mes, &a->h.d_ano); printf("\t%s %d/%d/%d",a->h.grau, a->h.d_dia, a->h.d_mes, a->h.d_ano); } fclose(f); }
  19. Ciclo para repetir processo

    Boas. Ainda relacionado com a thread anterior, desta vez estou a tentar fazer um loop para imprimir umas letras no LCD mas de uma forma específica! O que pretendo é imprimir uma letra, por exemplo um "B", mas este "B" é uma composição de vários "B" que irão formar um "B" grande! Contextualizando, o LCD tem 4 linhas e 20 colunas e o que pretendo é: ir para a linha 3, coluna 0 imprimir um B ---------------------------------- ir para a linha 2, coluna 0 imprimir um B, ir para a linha 3, coluna 0 Imprimir um B, imprimir um espaço, imprimir um B --------------------------------- ir para a linha 1, coluna 0 imprimir um B ir para a linha 2, coluna 0 Imprimir um B, imprimir um espaço, imprimir um B ir para a linha 3, coluna 0 Imprimir um B, imprimir um espaço, imprimir outro espaço, imprimir um B ----------------------------- Ou seja, criar o efeito de que o "B" grande está a aparecer do fundo do LCD e a deslocar-se para cima! ================= B ================= B B_B ================= B B_B B__B ================= B B_B B__B B_B ================= B_B B__B B_B B ================= B__B B_B B B_B ================= B_B B B_B B__B ================= B B_B B__B B_B ================= B_B B__B B_B B ================= Preciso de ajuda para criar os loops para este efeito. O que tenho é apenas isto mas não está a funcionar e já dei algumas voltas à cabeça. Não quero códigos, só pistas para eu lá chegar! for(uint8_t i = 3; i >= 0; i--){ for(uint8_t j = 0; j < i - j; j++) lcd_gotoxy(0, i); lcd_putc('B'); if( !(i % 3) ){ continue; }else{ lcd_putc(' '); } } } O que tentei fazer foi imprimir "B"'s e tentar relacionar o número de espaços que preciso de imprimir com a secção da letra "B" que está a ser imprimida mas ainda não consegui!
  20. Matriz bi-dimensional - aceder a posição específica

    Bom dia! Há algum tempo que não vinha aqui chatear! Bom, cá vai! Tenho uma matriz bi-dimensional quem tem um mapa com custom chars que vai servir para criar uma letra grande num LCD Esta letra grande vai ocupar 5 colunas e 4 linhas, tipo quando juntamos várias televisões para obter uma imagem grande a partir de partes dessa imagem grande em cada televisão. A matriz está declarada da seguinte maneira: static const PROGMEM unsigned char customCharMap[20][8]{ {......}, {......}, . . . {......} } Ou seja, esta variável contém 20 caracteres especiais, cada um constituído por 8 bytes Depois tenho uma função para guardar esta variável numa área especial de memória do LCD, denominada CGRAM. O problema é que esta memória só tem espaço para 64 bytes! Ou seja, só posso gravar 8 custom chars de cada vez, dos 20 que constituem a letra grade final, usá-los e depois gravar outros 8 e assim sucessivamente até completar a letra final. Para simplificar, e como a letra final tem 5 colunas e 4 linhas, vou gravar apenas 5 custom chars de cada vez na tal CGRAM do LCD e depois imprimi-los nos LCD. Depois gravo os seguintes 5 custom chars na CGRAM e volto a imprimi-los no LCD na linha seguinte e assim sucessivamente até ter a letra final completa! Algo como isto: 1º - Gravar 5 custom chars na CGRAM 2º - Imprimi-los na linha 0 do LCD 3º - Gravar os 5 custom chars seguintes na CGRAM em cima dos anteriores 4º - Imprimi-los na linha 1 do LCD 5º - Gravar os 5 custom chars seguintes na CGRAM em cima dos anteriores 6º - Imprimi-los na linha 2 do LCD 7º - Gravar os últimos 5 custom chars na CGRAM em cima dos anteriores 8º - Imprimi-los na linha 3 do LCD Agora o código. Tenho uma função para gravar um custom char na CGRAM que é a seguinte void writeCustomChar(static const PROGMEM unsigned char *customChar, uint8_t customCharOffset){ lcd_command(_BV(LCD_CGRAM)); /* set CG RAM start address 0*/ for (uint8_t i = customCharOffset; i < customCharOffset + 5; i++){ for(uint8_t j = 0; j < 8; j++) lcd_data(pgm_read_byte_near(&customChar[i][j])); } } As minhas dúvidas estão apenas relacionadas com os tipos de dados da matriz bi-dimensional e os tipos de dados enviados para esta função. Por outras palavras, ponteiros! Ou seja, não sei se a passagem de parâmetros por referência está correcta.
  21. Manipulação de arquivos

    Problema aparentemente bem simplório: Código que insere registro em aquivo ordenado, mantendo a ordenação e sem uso de arquivo auxiliar. Entretanto, perdi a tarde toda hoje tentando descobrir por que o código abaixo não funciona: #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> main() { typedef struct { char Mat[12]; char Nome[40]; } REGISTRO; const unsigned int TAM_REG = sizeof(REGISTRO); char NomeArq[100]; FILE* fp; REGISTRO Reg, RegAux; unsigned long int tam_arq, pos; unsigned int inicio, mediana, fim; printf("\nDigite o nome do arquivo a abrir: "); fflush(stdin); gets(NomeArq); if((fp = fopen(NomeArq, "r+b")) == NULL) { printf("\nImpossivel acessar o arquivo"); exit(1); } printf("\nDigite o registro a incluir: \n"); printf("\nMatricula: "); fflush(stdin); scanf("%s", Reg.Mat); printf("Nome: "); fflush(stdin); gets(Reg.Nome); /*Compara-se cada um dos registros do arquivo, até encontrar um com matrícula maior que a do registro a inserir*/ while(fread(&RegAux, TAM_REG, 1, fp)) if(atoi(RegAux.Mat) > atoi(Reg.Mat)) { fseek(fp, (long) -TAM_REG, SEEK_CUR); fwrite(&Reg, TAM_REG, 1, fp); Reg = RegAux; } fwrite(&Reg, TAM_REG, 1, fp); close(fp); printf("\n\nFIM DO PROGRAMA"); getchar(); } Acabei por descobrir que o defeito está no ponteiro de leitura e escrita em arquivo. Ao que parece, efetuar o "fwrite" e depois do "fread" faz o ponteiro saltar anormalmente, para trás. O código abaixo resolve o problema, ao se fazer o posicionamento cogente do ponteiro: #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> main() { typedef struct { char Mat[12]; char Nome[40]; } REGISTRO; const unsigned int TAM_REG = sizeof(REGISTRO); char NomeArq[100]; FILE* fp; REGISTRO Reg, RegAux; unsigned long int tam_arq, pos; unsigned int inicio, mediana, fim; printf("\nDigite o nome do arquivo a abrir: "); fflush(stdin); gets(NomeArq); if((fp = fopen(NomeArq, "r+b")) == NULL) { printf("\nImpossivel acessar o arquivo"); exit(1); } printf("\nDigite o registro a incluir: \n"); printf("\nMatricula: "); fflush(stdin); scanf("%s", Reg.Mat); printf("Nome: "); fflush(stdin); gets(Reg.Nome); /*Usar-se-á método asssemelhado à pesquisa binária para posicionar o registro no contexto ordenado do arquivo*/ /*Identificam-se os dados necessários à pesquisa binária*/ fseek(fp, 0, SEEK_END); tam_arq = ftell(fp); fim = tam_arq/TAM_REG; mediana = fim/2; inicio = 1; /*Passa-se agora à pesquisa propriamente dita*/ while(fim >= inicio) { pos = (mediana-1)*TAM_REG; /*'pos' aqui posicionará a leitura no meio do arquivo*/ fseek(fp, pos, SEEK_SET); fread(&RegAux, TAM_REG, 1, fp); if(atoi(RegAux.Mat) < atoi(Reg.Mat)) { inicio = mediana + 1; mediana = (fim + inicio)/2; } else { fim = mediana - 1; mediana = (fim + inicio)/2; } } /*Passa-se agora a incluir o registro na ordenação*/ if(atoi(RegAux.Mat) > atoi(Reg.Mat)) { do { pos = ftell(fp); fseek(fp, -TAM_REG, SEEK_CUR); fwrite(&Reg, TAM_REG, 1, fp); Reg = RegAux; fseek(fp, pos, SEEK_SET); } while(fread(&RegAux, TAM_REG, 1, fp)); fwrite(&Reg, TAM_REG, 1, fp); } else { while(fread(&RegAux, TAM_REG, 1, fp)) { pos = ftell(fp); fseek(fp, -TAM_REG, SEEK_CUR); fwrite(&Reg, TAM_REG, 1, fp); Reg = RegAux; fseek(fp, pos, SEEK_SET); } fwrite(&Reg, TAM_REG, 1, fp); } close(fp); printf("\n\nFIM DO PROGRAMA"); getchar(); } Alguém saberia me dizer qual a causa disso?
  22. Olá! Vim pedir ajuda relativamente um jogo da forca, o enunciado deste exercício pede que tenha um ficheiro disponível com diversas palavras que o jogador possa adicionar, alterar e visualizar a partir desse ficheiro e outra parte evidentemente que é para jogar, mas visto que não estou a entender como poderei fazer a parte do sorteio da palavra o jogo não corre na execução. Aqui fica a minha tentativa resolução. Provavelmente o código terá outros erros... Ainda estou em fase de experimentação . void jogar(char ficheiro[]){ FILE *f; jogador_t temp; char letra[5],jogador[500]; char pal [60]; int qtd=0; int tentativas=5,pontos=0,vidas=0,confirmacao,palavrascertas=0,sessao=0,j; f=fopen(ficheiro,"r"); if (f==NULL){ printf("Erro ao abrir o ficheiro. Tente novamente!\n\n"); } printf("\n Insira o nome do jogador: "); scanf("%s",jogador); srand(time(NULL)); while(!feof(f)) { fread(&temp,sizeof(temp),1,f); qtd++; } fclose(f); pal=rand()%1; tentativas=strlen(pal); vidas=tentativas-1; while (vidas < tentativas){ // enquanto as vidas forem inferiores ao comprimento da palavra(tentativas) --> jogo corre sessao++; printf("\n\nDe momento, esta na %iª jogada e tem %i pontos. \n Tem %i palavras certas.",sessao,pontos,palavrascertas); //inf. para o jogador printf("\nInsira uma letra: "); scanf("%s",letra); for(j=0;j<tentativas;j++){ confirmacao=0; if (letra[0]==pal[tentativas]){ // se a letra for igual alguam das letras das palvras pontos++; //adiona uma ponto confirmacao++; // adiciona se for igual a letra algumas das letras fda palavra em jogo caso contrário fica com 0 } } if (confirmacao==0){ //caso não tenha sido confirmado,logo a letra não seja igual -> jogador perde vidas--; //retira uma vida ao jogador if (vidas==0){ //caso as vidas sejam 0 == 0 , termina o jogo printf("GAME OVER! \n A palavra seria %s.\n",pal); // jogador é derrotado } else{ printf("A letra esta errada! Ainda tens %i vidas.\n"); // jogador falaha tentativa } } else { if (pontos==tentativas){ //caso os pontos que sido iguais às tentativas (por cada letra da palavra em jogo) --> jogador vence printf("PARABENS! A palavra e: %s .",pal); palavrascertas++; //conta palavra acertada jogarnov(jogador,palavrascertas,sessao,pontos); // mensagem de fim do jogo }else{ printf("A letra esta correta."); // letra está corrta e prosegue --> jogador certou letra } } } }
  23. Jogo da "Forca"

    #include <stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include <ctype.h> #define N 500 #define PAL 100 typedef struct jogador_s { char palavra[300]; struct jogador_s *seg; }jogador_t; jogador_t *insere_lista(jogador_t contem,jogador_t *p){ jogador_t *aux,*aux1; // 2 ponteiros auxiliares aux=p; //por inicio ou à cabeça if(p==NULL){ // Se não existir nada na lista, insere dados p=(jogador_t*) malloc(sizeof(jogador_t)); // aloca na memória *p=contem; //aquilo que estiver no ponteiro armaneza p->seg=NULL; // aponta para NULL return p; } while (aux->seg!=NULL) { // se não tiver vazia, procura por "espaço" vazio aux=aux->seg; } //faz a função anterior aux1=(jogador_t *)malloc(sizeof(jogador_t)); // aloca na memória *aux1=contem; aux->seg=aux1; aux1->seg=NULL; return p; } jogador_t *pede_dados(jogador_t *p){ jogador_t novo; printf("Inserir palavra: "); scanf("%s",novo.palavra); // pede os dados e irá à funçao da insere_lista p=insere_lista(novo,p); printf("Foi adicionado com sucesso!\n\n"); } jogador_t *alterar(jogador_t *p){ jogador_t novo,velho; jogador_t*aux; // PONTEIRO AUXULIAR int cont=0; aux=p; do{ cont=0; p=aux; printf("Introduza a palavra que pretende alterar:"); scanf("%s",novo.palavra); // se a lista não tiver vazia irá verificar se existe algum número na lista while(p!=NULL){ if (strcmp(p->palavra,velho.palavra)){ // verifica se exista cont++; // caso exista -> contabiliza } p=p->seg; //aponta para próximo } if(cont==0){ printf("Palavra não existe!\n" ); // caso não exista, diz que não existe o nº inventário } } while( cont!=1); p=aux; printf("Insira a palavra nova: "); scanf("%s",novo.palavra); // pede os novos dados while(p!=NULL){ // se a lista não tiver vazia, copia os dados novos ou substitui os anteriores if(strcmp(p->palavra,novo.palavra)){ strcpy(p->palavra,novo.palavra); // copia a palavra nova } p=p->seg; // ponta para o próximo } p=aux; printf("Alterado com sucesso!\n"); return p; } jogador_t mostra(jogador_t *p){ if (p==NULL){ printf("Lista está vazia!\n"); exit(-1);// como ponteiro de p == NULL , logo a lista está vazia } do{ printf("\n %s \n",p->palavra); p=p->seg; // mostra até sempre encontrar um elemento, caso contrário p == NULL pará de mostrar } while(p!=NULL); } jogador_t *le_ficheiro(jogador_t *p,char ficheiro[]){ jogador_t existe; FILE *f; f=fopen(ficheiro,"r+b"); if(f==NULL){ printf("Erro ao abrir o ficheiro,tente novamente!\n\n"); } while(fread(&existe,1,sizeof(jogador_t),f)>0){ p=insere_lista(existe,p); } return p; fclose(f); } jogador_t guardar(jogador_t *p,char ficheiro[]){ FILE *f; f=fopen(ficheiro,"w+b"); if(f==NULL){ printf("Erro ao abrir o ficheiro,tente novamente!\n\n"); } while(p!=NULL){ fwrite(p,1,sizeof(jogador_t),f); p=p->seg; // se for diferente de NULL, passa para o seguinte vai sempre guardando ou escrevendo no documento } fclose(f); } void jogar(char ficheiro[]){ FILE *f; char letra[5],jogador[500],selecionada[800], palavras[PAL][50],espaco[20],c,letra1 = '\n'; int tentativas,pontos=0,vidas=7,confirmacao=0,palavrascertas=0,sessao=0,j=0,nome=0; int gera; int pal=0; srand(time(NULL)); f=fopen(ficheiro,"r+b"); if (f==NULL){ printf("Erro ao abrir o ficheiro! \n"); } while(fread (&c, sizeof(char), 1, f)) { if(c == letra1) { pal++; } } gera=rand()%10; //gere uma palvra strcpy(selecionada,palavras[gera]); // printf("A palavra seleciona e %s\n",selecionada); if (nome==0){ printf("\n Insira o nome do jogador: "); scanf("%s",jogador); //pede o nome nome++; //incrementa um vez ,pois assim sempre que reinciar o jogo não pergunta o nome novamente } tentativas = strlen(selecionada); // tamanho da palavra selcionada while (vidas > 0){ // enquanto as vidas forem inferiores ao comprimento da palavra(tentativas) --> jogo corre sessao++; printf("\n\nDe momento, esta na %iª jogada e tem %i pontos. \n Tem %i palavras certas.",sessao,pontos,palavrascertas); //inf. para o jogador for(j=0;j<strlen(selecionada);j++){ espaco[j]='_'; // conta os espaco da palvra selcionada } printf("\n %s ",espaco); // coloca o espaço da palvr a a ser adivinha printf("\nInsira uma letra: "); scanf("%s",letra); for(j=0;j<tentativas;j++){ if (letra[0]==selecionada[tentativas]){ // se a letra for igual alguam das letras das palvras espaco[j]=selecionada[j]; pontos++; //adiciona uma ponto confirmacao++; // adiciona se for igual a letra algumas das letras fda palavra em jogo caso contrário fica com 0 } } if (confirmacao==0){ //caso não tenha sido confirmado,logo a letra não seja igual -> jogador perde vidas--; //retira uma vida ao jogador if (vidas==0){ //caso as vidas sejam 0 == 0 , termina o jogo printf("GAME OVER! \n A palavra seria %s.\n",selecionada); // jogador é derrotado } else{ printf("A letra esta errada! Ainda tens %i vidas.\n"); // jogador falha uma tentativa } } else { if (pontos==tentativas){ //caso os pontos que sido iguais às tentativas (por cada letra da palavra em jogo) --> jogador vence printf("PARABENS! A palavra e: %s .",selecionada); palavrascertas++; //conta palavra acertada //jogarnov(jogador,palavrascertas,sessao,pontos); // mensagem de fim do jogo }else{ printf("A letra esta correta."); // letra está corrta e prosegue --> jogador certou letra } } } fclose(f); } void jogarnov(char jogador[600],int palavrascertas,int sessao,int pontos) { int sessao1=1,op; char ficheiro[] = "filmes.dat"; printf("\n\n\nTERMINOU O SEU JOGO!\n Deseja jogar novamente? Sim [1] ou Nao [2].\n"); scanf("%i",&op); if (op==1){ //caso o jogador queira jogar novamente printf("---------------------------------------\n"); printf("||| JOGADOR * %s |||\n",jogador); printf("||| PONTUACAO * %i |||\n",pontos); printf("||| PALVRAS CERTAS * %i |||\n",palavrascertas); printf("||| JOGADAS * %i |||\n",sessao); printf("||| SESSAO * %i |||\n",sessao1); printf("---------------------------------------\n"); jogar(ficheiro); } sessao1++; if(op==2) { // termina o jogo e encerra o programa printf("---------------------------------------\n"); printf("||| JOGADOR * %s |||\n",jogador); printf("||| PONTUACAO * %i |||\n",pontos); printf("||| PALVRAS CERTAS * %i |||\n",palavrascertas); printf("||| JOGADAS * %i |||\n",sessao); printf("||| SESSAO * %i |||\n",sessao1); printf("---------------------------------------\n\n"); exit(-1); } } int main (){ char ficheiro[] = "filmes.dat"; jogador_t *p = NULL; int op,op1; do{ p=le_ficheiro(p,ficheiro); printf(" ================================== \n"); printf(" || Menu do Jogo da Forca || \n"); printf(" ----------------------------------\n"); printf(" || 1. Dicionario || \n"); printf(" || 2.Jogar || \n"); printf(" ================================== \n"); printf("Escolha a sua opcao:"); scanf("%i",&op); if (op==1){ do{ p=le_ficheiro(p,ficheiro); printf(" \n\n*** DICIONARIO *** \n"); printf("1. Ver palavras. \n"); printf("2. Adicionar palavras.\n"); printf("3. Alterar palavras.\n"); printf("4. Sair. \n"); printf("Escolha a sua opcao:"); scanf("%i",&op1); switch(op1){ case 1: mostra(p); break; case 2: p=pede_dados(p); guardar(p,ficheiro); break; case 3: p=alterar(p); guardar(p,ficheiro); break; case 4: return 0; break; } }while (op1!=4); } if (op==2){ printf("Bem-vindo ao Jogo da Forca! \n"); jogar(ficheiro); } }while (op!=3); } Olá! Vim pedir ajuda relativamente um jogo da forca, o enunciado deste exercício pede que tenha um ficheiro disponível com diversas palavras que o jogador possa adicionar, alterar e visualizar a partir desse ficheiro e outra parte evidentemente que é para jogar, mas visto que não estou a entender como poderei fazer a parte do sorteio da palavra o jogo não corre na execução. Aqui fica a minha tentativa resolução. Provavelmente o código terá outros erros... Ainda estou em fase de experimentação .
  24. Clear em C

    Boas amigos!! Como é que faço um clear num programa em C?? system(clear)? system("clear")? system('clear')? é necessario a biblioteca system.h nao é???
  25. Problema otimização

    Olá, tenho o seguinte problema a ser resolvido: Tenho que derrotar um monstro com uma certa quantidade de pontos de vida (HP). Posso utilizar N feitiços, cada um gasta uma quantidade X de mana. Não posso repetir nenhum feitiço. Qual a quantidade minima de mana que eu posso gastar para conseguir derrotar o monstro? Exemplo: 3 Feitiços, 10 HP Feitiço 1 - 5 de dano de HP, 30 de mana Feitiço 2- 2 de dano de HP, 20 de mana Feitiço 3 - 6 de dano de HP, 40 de mana A resposta para esse exemplo é 70 de mana. Ou seja, utilizar os feitiços 1 e 3. Fiz esse algoritmo, mas ele não funciona em todos os casos que testei. Alguma ajuda por favor. #include <stdio.h> #include <stdlib.h> #include <stdbool.h> int comparaMana(const void *x, const void *y); int comparaDano(const void *x, const void *y); typedef struct spell{ int dano; int mana; }Spell; int main() { int numFeiticos, hp, i, sum=0, sum2=0, sumM=0, sumM2=0; while(scanf("%d %d", &numFeiticos, &hp) != EOF){ Spell v[numFeiticos]; for(i=0; i<numFeiticos; i++){ scanf("%d %d", &v[i].dano, &v[i].mana); sum += v[i].dano; sumM += v[i].mana; } if(sum<=hp){ //caso seja impossivel derrotar demogorgon ou tenha que usar todos os feitiços if(sum==hp){ printf("%d\n", sumM); } else{ printf("-1"); } } else{ sum=0; sumM=0; sum2=0; sumM2=0; qsort(v, numFeiticos, sizeof(Spell), comparaMana); //primeiro ordeno por mana e pego sempre a menor quantidade até derrotar monstro for(i=0; i<numFeiticos; i++){ sum += v[i].dano; sumM += v[i].mana; if(sum >= hp){ break; } } qsort(v, numFeiticos, sizeof(Spell), comparaDano); //ordeno por dano e pego sempre maior dano ate derrotar monstro for(i=0; i<numFeiticos; i++){ sum2 += v[i].dano; sumM2 += v[i].mana; if(sum2 >= hp){ break; } } if(sumM > sumM2){ printf("%d\n", sumM2); } else{ printf("%d\n", sumM); } } } return 0; } int comparaMana(const void *x, const void *y){ Spell *p1 = (Spell *)x; Spell *p2 = (Spell *)y; if(p1->mana == p2->mana){ return 0; } else{ if(p1->mana < p2->mana){ return -1; //p1 vem antes de p2 } else{ return 1; //p1 vem depois de p2 } } } int comparaDano(const void *x, const void *y){ Spell *p1 = (Spell *)x; Spell *p2 = (Spell *)y; if(p1->dano == p2->dano){ return 0; } else{ if(p1->dano < p2->dano){ return 1; //p2 vem antes de p1 } else{ return -1; //p2 vem depois de p1 } } }
×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade