Jump to content

Search the Community

Showing results for tags 'c'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Bem-vindos ao Portugal-a-Programar
    • Sugestões, Críticas ou Dúvidas relativas ao P@P
    • Acerca do P@P
  • 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
    • Apresentação de Software
  • Informática
    • Interfaces Visuais
    • Computação Gráfica
    • Algoritmia e Lógica
    • Segurança e Redes
    • Hardware
    • Electrónica
    • Automação Industrial
    • Matemática
    • Dúvidas e Discussão de Programação
    • Notícias de Tecnologia
  • Outras Áreas
    • 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

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...

Found 4,993 results

  1. RVicente

    Geração do executável (ELF) em CMake

    Olá a todos, Estou a construir uma Toolchain para cross-compiling num ARM Cortex-M4 através do CMake, usango o gcc-arm-none-eabi. Defini o ficheiro da Toolchain com os respetivos caminhos para os compiladores, e com as flags do compilador. #--------------------------------------------------------------------------------------------------------------------- # Targets #--------------------------------------------------------------------------------------------------------------------- set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR ARM) # set(CMAKE_SYSTEM_VERSION ) #--------------------------------------------------------------------------------------------------------------------- # Set compilers #--------------------------------------------------------------------------------------------------------------------- set(CMAKE_C_COMPILER ${ARM_GCC}) set(CMAKE_CXX_COMPILER ${ARM_G++}) set(CMAKE_ASM_COMPILER ${ARM_AS}) set(CMAKE_AR ${ARM_AR}) (...) set(CMAKE_C_FLAGS_INIT "-O0 -g0 \ -mcpu=cortex-m4 \ -mthumb \ -mabi=aapcs \ -Wall \ -Wextra \ -mfloat-abi=hard \ -mfpu=fpv4-sp-d16 \ -ffunction-sections \ -fdata-sections \ -fno-strict-aliasing \ -fno-builtin \ -fshort-enums" ) set(CMAKE_ASM_FLAGS "-g0 \ -mcpu=cortex-m4 \ -mthumb \ -mabi=aapcs \ -mfloat-abi=hard \ -mfpu=fpv4-sp-d16" ) set(CMAKE_EXE_LINKER_FLAGS_INIT "-O0 -g0 \ -mcpu=cortex-m4 \ -mthumb \ -mabi=aapcs \ -mfloat-abi=hard \ -mfpu=fpv4-sp-d16 \ -Wl,--gc-sections \ --specs=nano.specs \ --specs=nosys.specs" ) No ficheiro CMakeLists.txt tenho mais algumas definições para o compilador, e o caminho para o Linker Script, uma biblioteca construida a partir do SDK e depois o processo de linkagem: (...) add_executable(main main.c) target_link_libraries(main sdk_lib) add_custom_command( TARGET main POST_BUILD COMMAND ${ARM_OBJCOPY} -O ihex ${CMAKE_CURRENT_BINARY_DIR}/main ${CMAKE_SOURCE_DIR}/main.hex ) O Custom Command gera o .hex a partir do .elf gerado no add_executable(). Aparentemente está tudo a funcionar, mas quando analiso o .hex percebi que praticamente não tem informação. Depois de alguma pesquisa percebi que o próprio .elf não tem o conteúdo que é suposto e começo a desconfiar de um possível problema. Uma vez que no processo de compilação em sistemas embebidos, os ficheiros objecto são gerados e depois linkados para construir um ficheiro final que pode ser corrido no dispositivo, desconfio que o linker não estará a ser chamado, pois os ficheiros objecto para cada source está a ser gerado. Reparei também que na compilação, o compilador que é chamado é o expectável /opt/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc mas o linker assume um caminho estranho, que o CMake encontrou por algum motivo /opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld Naturalmente este pertence à pasta da toolchain do GCC, mas deixa-me sem saber se este funciona de igual modo ao presente na outra pasta. Resumindo a minha questão, alguém consegue ter uma ideia do que poderá estar a acontecer quando ao ficheiro .elf não conter a informação correcta, e também esta questão do Linker? Obrigado. (Link para o GitHub, embora já tenha feito pequenas alterações/experiências https://github.com/NunoRVicente/cmake-arm-toolchain)
  2. TL_prog

    Vetores

    Boa Noite pessoal, Agradecia, se possível, a vossa ajuda. Sou novo na área da programação mais nomeadamente no C. Tenho um exercício para fazer que consiste em calcular o maior número, o menor número e a média que são indicados pelo utilizador e mostrar quais foram os valores. Neste momento, já consegui efectuar o cálculo da média, do maior e do menor valor, no entanto, não consigo fazer o código para indicar os valores que o utilizador introduziu, sei que tem de ser pelo método de vectores, mas esta a dar erro. Vou colocar abaixo o código, podem ajudar? #include <stdio.h> #include <stdlib.h> #define MAX 10 int main() { int NdNotas=0; float nota=0; int contador=0; float somatorio=0; float media=0; float maior=0; float menor=20; printf("quantas notas sao:"); scanf("%d",&NdNotas); if (NdNotas>MAX){ printf("no maximo %d notas",MAX); } else{ contador=NdNotas; while (contador>0){ do{ printf("insira o valor da nota: "); scanf("%f",&nota); if(nota>maior){ maior=nota; } if(nota<menor){ menor=nota; } }while (nota<0 || nota> 20); somatorio=somatorio+nota; contador--; } } media = (somatorio/NdNotas) ; printf("Media do aluno = %f\n",media); return 0; } Obrigado!
  3. trippietiago

    Vencimento final de um colaborador

    Olá a todos, tenho uma dúvida. Sou iniciante em programação e foi me pedido para a faculdade a resolução de um exercício em que o enunciado é este: Numa empresa o vencimento dos colaboradores é calculado a partir de um vencimento base (VB) e tem em consideração a sua idade (ID), número de filhos (NF) e anos de serviço (AS). O cálculo do salário final é feito de acordo com as seguintes parcelas: •1% de VB para cada ano de ID superior a 25; •3% por cada ano de serviço até perfazer 5 anos; sendo 5% por cada ano extra; •2% por cada filho, considerando o valor mínimo de 2 filhos. Até agora só tenho isto, preciso de ajuda urgente! Obrigado pela atenção. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int VF, VB, ID, NF, AS; printf("digite a idade do colaborador: "); scanf("%d", &ID); printf("digite o vencimento base do colaboradorr: "); scanf("%d", &VB); printf("digite o número de filhos do colaborador: "); scanf("%d", &NF); printf("digite os anos de serviço do colaborador: "); scanf("%d", &AS); if (ID > 25) return (EXIT_SUCCESS); }
  4. matheus

    Usando função em C

    Boa noite a todos. Fiz a resolução da questão porém não consigo fazer com que os segundos e minutos sejam incrementados em um único print, ao inves, fica dando print a cada segundo que passa. Se puderem me ajudar será de enorme ajuda. Desde já, grato. /*14) Faça um programa em C que simule um cronômetro com horas, minutos e segundos. A simulação deverá mostrar no vídeo o cronômetro no seguinte formato HH: MM: SS. Inicialmente o cronômetro será zerado ( 00: 00: 00 ), sendo que os segundos começarão a ser incrementados, depois os minutos e depois as horas. Lembre-se que a cada 60 segundos os minutos deverão ser incrementados, depois os minutos voltarão a zero. Quando as horas estiverem prestes a chegar em 25, o cronômetro deverá voltar a zero ( 00: 00: 00 ). */ #include <stdio.h> #include <stdlib.h> #include <unistd.h>//para usar o Sleep() int main(void){ int sec=0;//segundos int min=0;//minutos int hr=0;//horas int i=0; do { printf("Cronômetro\n\n"); printf("\n\t\t\t\t%dh:%dm:%ds\n\n", hr,min,sec); if(sec==60){ sec=0; min++; } if(min==60){ min=0; hr++; } if(hr==24){ hr=0; } sleep(1);//tem a função de pausar a execução por um determinado tempo //coloquei 1 pois com 1000 não estava passando em 1segundo por alguma razão. sec++; }while (i==0);//condição para o loop infinito return 0; }
  5. Gabriel Vinicius Paffrath

    Jogo de Senha

    Pessoal, preciso de um projeto para linguagem C. Um jogo de senha onde o player 1 digita 4 letras entre (a,b,c,d,e,f) sem repetir em qualquer ordem. O player 2 tenta encontrar a sequencia digitada e na ordem digitada. para cada tentativa o programa retorna “x” ou “o”. ”o” - Acertar a letra mais errou a posicao ”x” - Acertar letra e posição maximo 10 tentativas.
  6. LegaliZe

    Duvida: Maximo e Minimo de N numeros

    Exercicio: Desenhe um algoritmo que resolva o seguinte problema. Pretende-se determinar o maior e o menor número duma sequência de N números inteiros dados pelo utilizador. O valor de N deverá ser superior ou igual a 2. Se não for o seu valor deverá ser pedido novamente até ser introduzido um valor válido.A introdução de números deverá terminar quando forem inseridos N números. Nessa altura a aplicação deverá mostrar o valor máximo e mínimo de entre os valores introduzidos. #include <stdio.h> int main () { int N, j, max , min , i; do { printf ("Introduza o numero de inteiros: \n"); scanf ("%d", &N); } while (N<2); scanf("%d",&j); max =j; min =j; for (i=1;i<=N-1;i++); { printf ("Introduza um inteiro: \n"); scanf ("%d", &j); if (j>max) max=j; if (j<min) min=j; } printf ("Min=%d , Max=%d \n", min, max); } Este programa foi feito pelo professor como resposta ao exercicio mas acho que nao esta a fazer bem o ciclo do-while ja tive a tentar ver o problema receio que tenha a ver com a variavel j mas não sei o porque
  7. henry

    Converter C para Python

    Olá, sou um principiante na linguagem Python e estou com dificuldade para converter este código para o Python. Eu não farei uso do Python para o futuro, porém preciso excepcionalmente deste código em Python. Existe algum conversor Online para isso? Agradeço. O código: #include <stdio.h> int main(void) { int pos[3], neg[3], posCount = 0, negCount = 0; for (int i = 0; i < 3; i++) { int valor; printf("Informe um valor: "); scanf("%d", &valor); if (valor < 0) neg[negCount++] = valor; else pos[posCount++] = valor; } printf("Os números positivos digitados foram: "); for (int i = 0; i < posCount; i++) printf("%d ", pos); printf("\nOs números negativos digitados foram: "); for (int i = 0; i < negCount; i++) printf("%d ", neg);
  8. matheus

    String em C

    Boa noite amigos, estou com duvida em uma questao da faculdade e nao consigo solucionar. 9) Escrever um programa em C que calcule e imprima o número de caracteres distintos presentes em uma cadeia de caracteres dada. Considerar o tamanho máximo da cadeia como sendo de 80 colunas. #include <stdio.h> #include <stdlib.h> #include <string.h> #define n 64 int main (void) { char nome[n]; int i,j,count=0; printf("\nDigite uma frase: "); fgets(nome, 64, stdin); //stdin = leitura está sendo feita do teclado. for(i=0;i<strlen(nome) != '\0';i++) { count++; } printf("\nA frase digitada foi: %s ", nome); printf("\nA quantida de letras foi de: %d", count); return 0; } Estava tentando ler a string sem contar com os espaços, porem nao consigo. Se alguem conseguir me ajudar nesta questao, ficarei grato.
  9. Vasco

    Programador Autodidata

    Bom dia Eu gostaria que partilhassem as vossas opiniões acerca de um assunto. Acham realista ser um muito bom programador estudando sozinho? Tenho bases de C/C++, mas nada de extraordinário. O que recomendam a aprender primeiro de forma a ser o melhor programador possível? Gostaria também que recomendassem sítios para aprender que eu possa não conhecer. Obrigado.
  10. Prezados, Boa noite. Estou tentando resolver este problema, mas não faço a menor ideia de como resolve-lo 100%. Tentei fazer o melhor que pude, meu código não faz o que se pede por eu não saber como resolver, porém, tentei ir o mais longe que consegui. Estou há dias tentando resolver e não consigo sair do lugar mais, qualquer ajuda será muito bem vinda. Segue o código abaixo: E desde já, muito obrigado. Explicando meu código para mais fácil compreensão de todos: O melhor que consegui fazer foi contar a quantidade de palavras digitadas em uma frase a partir dos espaços dados pelo usuário. Porém, não sei como comparar as palavras e verificar se são iguais. Com isso, meu programa só conta a quantidade de palavras. Exemplo: "Gostaria de sua ajuda" Palavras digitadas: 4. Obs: Sei que no "soma+1" poderia ter inicializado a variavel contadora com 1 ao invés de 0, mas preferi somar 1 ao final da frase por questão de gosto somente. Se isso interferir em algo, sintam-se livres para altera-lo. Att; Matheus /* Escrever um programa em C que calcule a frequência de uso de cada palavra dentro de uma cadeia de caracteres que possui diversas palavras. Considerar o tamanho máximo da cadeia como sendo de 80 colunas. */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main (void) { char frase[80]; int i; int soma =0; printf("\nDigite: "); fgets(frase, 80, stdin); for(i=0;i<strlen(frase);i++) { if(frase[i] == ' ') { soma++; /*soma a quantidade de espaços digitados na frase */ } } printf("\nA quantida de palavras digitadas foi de: %d", soma+1); /*(soma+1) pois soma todos os espaços antes da ultima palavra e a soma tb */ return 0; }
  11. Carlota Valério

    Opções gcc

    Boa noite, alguém me pode ajudar? Queria saber, no motor de compilação gcc, qual é a opção que permite passar argumentos diretamente para a ferramenta assembler? Obrigada
  12. João Amorim

    Ciclos em C

    Boa tarde a todos. Sou novo neste chamado "mundo da programação" , tal como neste site, e estou com uma dúvida que, com a ajuda de quem saiba, espero resolver :). O problema é o seguinte: Pretende-se desenvolver um programa para ler valores de tempo no formato “h(hora) m(minuto) s(segundo)”, devolvendo o número de segundos associado ao tempo introduzido. No entanto, o utilizador deve poder omitir campos (e.g. introduzir só “h23”). Para terminar a leitura o utilizador pode introduzir um carácter diferente de ‘h’, ‘m’ ou ‘s’. Pretende-se também que o programa valide os valores introduzidos, não deixando introduzir valores de minutos ou segundos superiores a 59, nem introduzir campos repetidos (só se pode introduzir 0 ou 1 campo de hora; 0 ou 1 campo de minuto; 0 ou 1 campo de segundo). Repare que: • São necessárias variáveis para guardar cada componente do tempo; • Só há leitura da parte numérica de uma componente do tempo se o carácter for válido; • Dependendo do carácter lido, o valor numérico contribui para o valor final de tempo com um peso diferente; • O ciclo de leitura de componentes do tempo não tem um número de componentes fixo, nem uma ordem fixa. ---------------------------- Ora, eu já fiz uma boa parte do código. Aqui vai ele: #include <stdio.h> #include <stdlib.h> int main(){ short int horas=0, minutos=0, segundos=0; long int Total_Segundos; printf("EXERCICIO FINAL - CONVERTER TEMPO EM SEGUNDOS\n\n"); printf("Introduza o tempo no formato h(hora) m(minuto) s(segundo): "); scanf("h%hd m%hd s%hd", &horas, &minutos, &segundos); if(minutos>59 && segundos>59){ printf("ERRO! Numero de minutos e segundos invalidos!"); exit(1); } else{ if(minutos>59 || segundos>59){ if(minutos>59){ printf("ERRO! Numero de minutos invalidos!"); exit(1); } else{ printf("ERRO! Numero de segundos invalidos!"); exit(1); } } } Total_Segundos=(horas*3600)+(minutos*60)+(segundos); printf("h%hd m%hd s%hd = %ld", horas, minutos, segundos, Total_Segundos); return 0; } No entanto, no que toca ao seguinte ponto: "...nem introduzir campos repetidos (só se pode introduzir 0 ou 1 campo de hora; 0 ou 1 campo de minuto; 0 ou 1 campo de segundo).". Não sei como resolver esta situação. Agradeço qualquer tipo de ajuda e, mesmo não indicando a resposta direta, aceito qualquer tipo de ajuda que me ajude a chegar ao resultado. Obrigado desde já pela atenção!
  13. Escreva um código que receba um numero de no mínimo 3 dígitos e apresente sua versão inversa Gostaria de saber como faco para um programa em C receber um minimo de 3 dígitos?? existe alguma forma sem ser definir um if (numero>100)... dai faz o scanf alguem poderia me dar alguma ideia
  14. matheus

    Cronómetro em C: função sleep

    Boa noite a todos. Fiz a resolução da questão porém não consigo fazer com que os segundos e minutos sejam incrementados em um único print, ao inves, fica dando print a cada segundo que passa. Se puderem me ajudar será de enorme ajuda. Desde já, grato. /*14) Faça um programa em C que simule um cronômetro com horas, minutos e segundos. A simulação deverá mostrar no vídeo o cronômetro no seguinte formato HH: MM: SS. Inicialmente o cronômetro será zerado ( 00: 00: 00 ), sendo que os segundos começarão a ser incrementados, depois os minutos e depois as horas. Lembre-se que a cada 60 segundos os minutos deverão ser incrementados, depois os minutos voltarão a zero. Quando as horas estiverem prestes a chegar em 25, o cronômetro deverá voltar a zero ( 00: 00: 00 ). */ #include <stdio.h> #include <stdlib.h> #include <unistd.h>//para usar o Sleep() int main(void){ int sec=0;//segundos int min=0;//minutos int hr=0;//horas int i=0; do { printf("Cronômetro\n\n"); printf("\n\t\t\t\t%dh:%dm:%ds\n\n", hr,min,sec); if(sec==60){ sec=0; min++; } if(min==60){ min=0; hr++; } if(hr==24){ hr=0; } sleep(1);//tem a função de pausar a execução por um determinado tempo //coloquei 1 pois com 1000 não estava passando em 1segundo por alguma razão. sec++; }while (i==0);//condição para o loop infinito return 0; } print da execução do programa: file:///home/ubuntu/Pictures/Screenshot%20from%202019-09-23%2003-55-29.png
  15. Lucivaldo Barbosa

    Programa dando resposta errada

    Este programa deveria mostrar os juros até que fosse inserido um capital igual a -1 mas n é isso que acontece, pq? #include <stdio.h> #include <locale.h> int main(){ setlocale(LC_ALL, ""); int dias; float taxa, capital, juros; printf("Esse programa recebe capital, taxa de juros, prazo e mostra o valor dos juros\n\n"); while(capital != -1){ juros = capital * taxa * dias / 365; printf("Insira o valor do capital (-1 para finalizar):\n"); scanf("%f", &capital); printf("\nInsira a taxa de juros no formato .xx:\n"); scanf("%f", &taxa); printf("\nInsira o prazo em dias:\n"); scanf("%d", &dias); printf("\nO juros é: %.1f\n", juros); } return 0; }
  16. Rui Carlos

    Some obscure C features

    Fonte: https://multun.net/obscure-c-features.html
  17. jonhhy

    ANSWERED Trabalhar com Memória , crash

    #include <stdio.h> char * memset2 (char v[],char ch, int n); int main() { char *v = "PaP Programar"; char ch = 'A'; int n = 3; puts("abc"); printf("A string alterada é: %s \n",memset2(v,ch,n)); puts("ghdfj"); } char * memset2 (char v[],char ch, int n) { int i; for (i=0; i<n;i++) v[i] = ch; return v; } output: http://prntscr.com/or6w63 Boa tarde Caríssimos , o programa que estou a trabalhar crasha e não sei como resolver.
  18. SERGIO REBELO

    BarTender API

    Bom dia Alguém já desenvolveu alguma aplicação em C++ ou C#, de impressão de etiquetas com base de dados em SQL Server, que utilize a API do software de etiquetas Bartender ? Obrigado
  19. Bom, eu estou tentando abrir uma imagem no picture box, porém quero escrever no textbox e abrir pelo nome, sou novo na área de C#, se alguem puder me ajudar, ficarei grato, desde de já muito Obrigado
  20. José Manuel Batista

    Código de euromilhões

    Boas pessoal, encontro-me atualmente a estudar programação e o objetivo neste momento é desenvolver um programa para gerir uma chave aleatória de euromilhoes com os 5 numeros e estrelas sem que nenhum deles se repita. Alguma dica, sugestão? Obs: O código não está a correr neste momento. #include <stdio.h> #include <stdlib.h> #include <time.h> main() { time_t t; int n[5], ns, opcao, existe=0; do{ printf("\tMenú"); printf("1 - Gerar Chave\n"); printf("2 - Mostrar Chave\n"); printf("3 - Sair\n"); scanf("%d", &opcao); switch(opcao) { case 1: for(int i=0; i<5; i++) { ns=1+(rand()%50); n[i]=ns; if(i>0) do { if(n[i] == n[i--] || n[i] == n[i-2] || n[i] == n[i-3] || n[i] == n[i-4] || n[i] == n[i-i]) { existe=1; n[i] = 1 + rand() % 50; } else existe=0; } while(existe==1); } case 2 : case 3 : default : printf("Opção Inválida"); } } while(opcao!=3); }
  21. Earendil010102

    Lista de livros

    Estou criando uma lista de cadastro de livros. Quado digito a opção 2 ele deve dizer que não ha nada cadastrado, caso não tenha cadastrado nenhum livro. Mas quando digito 1 não retorna para opção 1. O que estou fazendo de errado? #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <string.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ struct inform { int cod; char autor[30], obra[30], editora[10]; }; void menu () { printf("\n-----------MENU----------------"); printf("\nDigite uma opção:"); printf("\n1 - Inserir um novo cadastro"); printf("\n2 - Mostrar todos os cadastros"); printf("\n0 - Encerrar"); printf("\n-----------MENU----------------"); } int main(int argc, char *argv[]) { setlocale (LC_ALL, "Portuguese"); //---------------variaveis struct inform livro[5]; int opc, i, cont, valor; valor = 0; char resp; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<, //inicialização menu(); printf("\n\n"); scanf("%d", &opc); fflush(stdin); system("pause"); system("cls"); i = 0; cont = 0; switch (opc) { case 1 : //inicio opcao 1 valor = 1; do { printf("\nDigite o nome do livro: "); gets(livro[i].obra); fflush(stdin); printf("\nDigite o nome do autor: "); gets(livro[i].autor); fflush(stdin); printf("\nDigite o nome da editora: "); gets(livro[i].editora); fflush(stdin); livro[i].cod = i+1; menu(); scanf("%d", &opc); fflush(stdin); i++; cont++; } while (opc == 1 && i<5); if (i == 5) { //inicio do primeiro if system("cls"); printf("\n\nSistem de cadstro lotado. Não é possivel armazenar mais informações\n"); printf("Digite outra opção.\n\n"); menu(); scanf("%d", &opc); system("pause"); system("cls"); } //fim do primeiro if //fim da opcao 1 case 2 : //inicio opcao 2 while (valor == 0) { printf("\nLista vazia"); printf("\nDigite outra opcao\n\n"); menu(); scanf("%d", &opc); } for (i=0; i<cont; i++) { // impressao printf("\n autor: %s", livro[i].autor); printf("\n obra: %s", livro[i].obra); printf("\n editora: %s", livro[i].editora); printf("\n código: %d\n\n", livro[i].cod); } //impressao //fim pocao 2 break; case 0 : //inicio opcao 0 system("cls"); printf("\nSAINDO...\n\n"); //fim opcao 0 break; default : printf("\nNumero invalido"); printf("\nDigite outro valor"); menu(); scanf("%d", &opc); } return 0; }
  22. É verdade que é considerado uma má prática de programação C alocar memória em uma função e desalocar em outra função? Tenho essa dúvida porque recentemente tive que fazer o uso deste recurso em um projeto que estou desenvolvendo sozinho e eu sinceramente não sei se foi uma boa abordagem ... Segue os códigos abaixo para uma análise: //trecho de código struct art_properties{ int art; int quote; int art_color; }; //trecho de código static void handler(int num){ clear(); endwin(); init_scr(); } int resize(int key){ struct sigaction new_action; struct sigaction old_action; new_action.sa_flags=0; new_action.sa_handler=handler; sigemptyset(&new_action.sa_mask); sigaction(SIGWINCH, &new_action, &old_action); return getmaxy(stdscr); } static size_t count_rows(const char *file_path){ size_t rows=0; FILE *file=fopen(file_path, "r"); if(file!=NULL){ while(!feof(file)){ if(fgetc(file)=='\n'){ rows++; } } fclose(file); } return rows; } struct art_properties *print_art(int y, struct art_properties *properties){ struct art_properties aux; FILE *art_file=NULL, *quote_file=NULL; size_t i=0; char row_content[1025], str_quote[1025]; const char *arts[]={"obj/arts/art_001.txt", "obj/arts/art_002.txt", "obj/arts/art_003.txt", "obj/arts/art_004.txt", "obj/arts/art_005.txt", "obj/arts/art_006.txt", "obj/arts/art_007.txt", "obj/arts/art_008.txt", "obj/arts/art_009.txt", "obj/arts/art_010.txt"}; if(properties==NULL){ srand(time(NULL)); aux.art=rand()%9; aux.art_color=rand()%7; aux.quote=1+(rand()%count_rows("obj/quotes.txt")); properties=malloc(sizeof(struct art_properties)); memcpy(properties, &aux, sizeof(struct art_properties)); }else{ memcpy(&aux, properties, sizeof(struct art_properties)); } attron(COLOR_PAIR(aux.art_color) | A_BOLD); art_file=fopen(arts[aux.art], "r"); if(art_file!=NULL){ for(i=0; i<count_rows(arts[aux.art]); i++){ fgets(row_content, 1025, art_file); mvprintw(y+i, 1, "%s", row_content); } fclose(art_file); } quote_file=fopen("obj/quotes.txt", "r"); if(quote_file!=NULL){ if(aux.quote!=1){ for(int i=0; i!=aux.quote; i++){ fgets(str_quote, 1025, quote_file); } mvprintw(y+2+i, 1, "[GANADO QUOTE] - %s", str_quote); } fclose(quote_file); } attroff(COLOR_PAIR(aux.art_color) | A_BOLD); return properties; } struct art_properties *free_art(struct art_properties *ptr){ free(ptr); return NULL; } //trecho de código case '0': noecho(); do{ properties=print_art(1, properties); attron(COLOR_PAIR(YELLOW) | A_BOLD); mvprintw(y-1, 1, "[?] - Are you sure you want to quit Saddler [Y/n]?"); attroff(COLOR_PAIR(YELLOW) | A_BOLD); key=getch(); y=resize(key); clear(); switch(key){ case 'y': case 'Y': key='Y'; break; case 'n': case 'N': key='N'; break; default: break; } }while(key!='Y' && key!='N'); properties=free_art(properties); echo(); break; -> "funcionando" -> https://imgur.com/a/n3C8n5F ________________________________________________________________________________________________________________________________________ Dúvida: Se acima eu fiz mau uso da alocação dinâmica, qual seria uma abordagem alternativa para os códigos acima? Uma solução que não afete o objetivo secundário da função print_art()? * Objetivo secundário da função print_art() -> Mater as propriedades da arte impressa no terminal mesmo que a janela seja redimensionada. ________________________________________________________________________________________________________________________________________ Peço desculpas a todos os membros desta comunidade por não postar todo o projeto, mas é que ele ainda não está 100% finalizado e eu também não quero ser zuado por outros programadores mais experiêntes por postar "gambiarra" de 3000 linhas cheia de bugs.
  23. joaobalaia

    Progrmaçao em linguagem c no linux

    Boa tarde malta, estou com um pequeno problema que não sei bem como resolver. Tenho de fazer um protejo para uma cadeira e a parte do código já a consegui fazer, seguindo alguns passos que foi vendo na net e nas aulas. O meu problema é que agora para fazer o relatório final do protejo necessito de fazer a explicação das linhas de código, e como eu foi vendo na net não sei bem explicar o código em si, espero que alguém me consiga ajudar. Vou deixar aqui o código em baixo e vou ficar a aguardar respostas. //ficheiro: cliente.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> int ler_socket(int cliente_socket){ //while(1){ int tamanho; if(read(cliente_socket, &tamanho, sizeof(tamanho)) == 0) return 0; char* mensagem = (char*) malloc(tamanho); read(cliente_socket, mensagem, tamanho); printf("cliente: resposta recebida do servidor--> %s\n", mensagem); if(!strcmp(mensagem, "quit")){ free(mensagem); return 1; } free(mensagem); //} } void escrever_socket(int socketfd, const char* mensagem){ int tamanho = strlen(mensagem) + 1; write(socketfd, &tamanho, sizeof(tamanho)); write(socketfd, mensagem, tamanho); } int main(int argc, char* argv[]){ const char* const nome_socket = argv[1]; //const char* const mensagem = argv[2]; int socket_fd; char mensagem[50]; //scanf("%s", &mensagem); while(1){ gets(mensagem); if(strcmp(mensagem, "start") == 0){ socket_fd = socket(PF_LOCAL, SOCK_STREAM, 0); struct sockaddr_un nome; nome.sun_family = AF_LOCAL; strcpy(nome.sun_path, nome_socket); connect(socket_fd, (struct sockaddr*) &nome, SUN_LEN(&nome)); gets(mensagem); while(1){ gets(mensagem); if(strcmp(mensagem, "ig") == 0){ socket_fd = socket(PF_LOCAL, SOCK_STREAM, 0); struct sockaddr_un nome; nome.sun_family = AF_LOCAL; strcpy(nome.sun_path, nome_socket); connect(socket_fd, (struct sockaddr*) &nome, SUN_LEN(&nome)); escrever_socket(socket_fd, "informatica de gestao"); } } while(strcmp(mensagem, "end") != 0){ escrever_socket(socket_fd, mensagem); ler_socket(socket_fd); gets(mensagem); } close(socket_fd); } } return 0; }
  24. 00Basil00

    Inicio em C e SO

    Boas, sou novo por estas bandas, mas espero que me ajudem ainda assim. Estou a fazer a licenciatura em Engenharia Informática e tenho uma cadeira que é Sistemas Operativos, aprendo a programar em C, infelizmente e por minha culpa não percebo grande coisa, ando a procura de um livro para me ajudar rumo ao 20 no exame, pensei no original "The C Programming Language" porem o meu ingles não é grande coisa, então fui pesquisar e fiquei entre o "Liguagem C" de luis damas e um da FCA. Na internet encontrei o de luis damas mas so a 10 edeicao, sera muito grande a diferenca entre a 10 e a 24 que e a a venda nas lojas? e aconselham me um desses ou outro melhor?
  25. Yasnac

    Balancear árvores - rotações ED e DE

    Boas. Relativamente a balancear arvores, existem aquelas 4 rotações comuns: EE, DD, ED e DE. As duas primeiras já as consegui fazer, mas não estou a conseguir perceber o porquê das as outras não funcionarem. Como resolvo isto? typedef struct arvore { int data; struct arvore * esquerda; struct arvore * direita; } *Arvore; Arvore DD(Arvore pointer){ int a,b; a = pointer->data; b = pointer->direita->direita->data; pointer->data = pointer->direita->data; pointer->direita->data = b; pointer->esquerda = pointer->direita->direita; pointer->direita->direita = NULL; pointer->esquerda->data = a; return pointer; } Arvore EE(Arvore pointer){ int a,b; a = pointer->data; b = pointer->esquerda->esquerda->data; pointer->data = pointer->esquerda->data; pointer->esquerda->data = b; pointer->direita = pointer->esquerda->esquerda; pointer->esquerda->esquerda = NULL; pointer->direita->data = a; return pointer; } Arvore ED(Arvore pointer){ int a,b,c; a = pointer->esquerda->direita->data; b = pointer->esquerda->data; c = pointer->data; pointer->esquerda->esquerda = pointer->esquerda; pointer->esquerda->direita = NULL; pointer->esquerda->data = a; EE(pointer); return pointer; } void balancear(Arvore pointer) { if(pointer!=NULL){ // DD if((pointer->direita!=NULL) && (pointer->direita->direita!=NULL)) { printf("DD\n"); DD(apt); } // EE else if ((pointer->esquerda!=NULL) && (pointer->esquerda->esquerda!=NULL)) { printf("EE\n"); EE(apt); } // DE else if ((pointer->direita!=NULL) && (pointer->direita->esquerda!=NULL)) { printf("DE\n"); DE(apt); } // ED else if ((pointer->esquerda!=NULL) && (pointer->esquerda->direita!=NULL)) { printf("ED\n"); ED(apt); } } }
×
×
  • 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.