Ir ao conteúdo
  • Cadastre-se

Lucca Rodrigues

Membro Pleno
  • Posts

    1.081
  • Cadastrado em

  • Última visita

Tudo que Lucca Rodrigues postou

  1. @devair1010 Eu testei algumas, são essas: x[i] -x[i] abs(x[i]) ((pow((double)x[i],2.0f))-(20.0f*(double)x[i])-50.0f)/10.0f 50.0f*sin((double)x[i]/5.0f) sqrt(20.0f*(double)x[i]) exp((double)x[i]/5.0f) (log10((double)x[i]*50.0f))*5.0f (sin((double)x[i])/23.0f*(pow((double)x[i], 2.0f))) fabs(50.0f*sin((double)x[i]/5.0f)) 20.0f*exp(cos((double)x[i]/5.0f)) - 20.0f*exp(sin((double)x[i]/5.0f)) (100.0f/M_PI)*asin(sin((M_PI*(double)x[i])/25.0f)) (100.0f/(pow(100.0f, (100.0f*sin((-0.1f)*(double)x[i])))+1.0f))-(100.0f/2.0f) As operações são feitas com pontos flutuantes, e depois há uma conversão implícita para inteiro ao se atribuir o resultado à Y. Isso é necessário, pois se as operações forem feitas com inteiros, as ondas ficam todas meio quadradas: Que bom! Não sei o motivo por enquanto. Isso é uma das coisas que eu havia dito que pretendo corrigir: Alguém com mais experiência talvez saberia dar uma luz... Talvez @arfneto Eu dei uma pesquisada mas não encontrei nada a respeito.
  2. @Rafael Ruy Você precisa de mais memória pra representar esse número, o tipo int é de normalmente 4 bytes. Talvez unsigned long seja mais que o suficiente. A lógica que você estabeleceu é essa: horas = sec/3600; min = (sec%3600)/60; sec = sec%60; dia = horas/24; Você só converte para dias o valor das horas, talvez algo assim já funcione: unsigned long dias, horas, mins, secs; dias = secs/86400; horas = (secs/3600)-(dias*24); mins = (secs%3600)/60; secs = secs%60; Aliás, isso é C, não C++.
  3. @Um mero usuário São ponteiros... Em C só existe passagem por valor, então pra "simular" uma passagem por referência, a gente usa ponteiros. Colocando char *str como parâmetro na função, você consegue modificar o argumento passado na chamada da função. Acho que o retorno de strrev é a string depois de invertida.
  4. @Um mero usuário Bem... Basta um loop varrendo a string, inverta a mesma, ou seja, identifique o último caractere (sem ser o caractere nulo) e o primeiro, e os troque, depois identifique o penúltimo e o segundo e faça a troca, etc. Isso é só uma ideia. C e C++ são linguagens de programação, e você não deveria misturá-las. Pra resumir é isso. aparentemente funcionar != estar correto
  5. @Um mero usuário copiar da internet != estar correto Sim, fgets() tem mais parâmetros que gets(), portanto: Veja a documentação, e descobrirá como chamar a função corretamente: gets() fgets() Como mencionado por @Midori , não use gets(), é obsoleta e não é tão segura quanto a fgets(). Como mencionado por @Midori também, você está usando alguns cabeçalhos pertencentes à biblioteca padrão do C, e outros da biblioteca padrão do C++. Não entendo como... O primeiro é da biblioteca padrão do C, o segundo do C++.
  6. Boa noite, colegas! Introdução: Recentemente tive a ideia de criar um programinha de console para plotar gráficos de Y em função de X com ajuda dos cabeçalhos math.h e windows.h, bastando inserir a equação como um dos argumentos de uma função (macro), obtendo assim as coordenadas que podem ser passadas para outra função responsável por plotar o gráfico. Código: #define redColor RGB(255,0,0) #define blueColor RGB(0,0,255) #define greenColor RGB(0,255,0) #define whiteColor RGB(255,255,255) #define getCoords(x, y, indxOp, xStartVal, xIncrm, pntsQtd, sizeXY, alocXY) \ do { \ int alocAux = alocXY; \ int xValAux = xStartVal; \ for(int i = 0; i < pntsQtd; i++, xValAux+=xIncrm, sizeXY++){ \ if(i >= (alocAux/sizeof(int))){ \ alocAux += alocXY; \ x = (int*)realloc(x, alocAux); \ y = (int*)realloc(y, alocAux); \ } \ x[i] = xValAux; \ y[i] = indxOp; \ } \ } while (0) #include <stdio.h> #include <stdlib.h> #include <math.h> #include <windows.h> /* Programa escrito por Lucca Rodrigues - 10/04/2021 Fonte: www.clubedohardware.com.br/forum/177-ccc Acesso em: 14/04/2021 */ void drawGraph(int *x, int *y, int sizeXY, int widthLine, int lineStyle, int originX, int originY, int lenAbscisRL, int lenOrdinRL, COLORREF lineColor, COLORREF axisColor){ HWND console = GetConsoleWindow(); HDC hdc = GetDC(console); for(int i = 0; i < sizeXY; i++){ if(x[i] >= 0 && y[i] >= 0){ // Primeiro quadrante if((x[i] > lenAbscisRL) || (y[i] > lenOrdinRL)){ sizeXY--; for(int j = i; j < sizeXY; j++){ x[j] = x[j+1]; y[j] = y[j+1]; } i--; } else{ x[i] += originX; y[i] = originY - y[i]; } } else if(x[i] <= 0 && y[i] >= 0){ // Segundo quadrante if((x[i] < -lenAbscisRL) || (y[i] > lenOrdinRL)){ sizeXY--; for(int j = i; j < sizeXY; j++){ x[j] = x[j+1]; y[j] = y[j+1]; } i--; } else{ x[i] = originX + x[i]; y[i] = originY - y[i]; } } else if(x[i] <= 0 && y[i] <= 0){ // Terceiro quadrante if((x[i] < -lenAbscisRL) || (y[i] < -lenOrdinRL)){ sizeXY--; for(int j = i; j < sizeXY; j++){ x[j] = x[j+1]; y[j] = y[j+1]; } i--; } else{ x[i] = originX + x[i]; y[i] = originY - y[i]; } } else if(x[i] >= 0 && y[i] <= 0){ // Quarto quadrante if((x[i] > lenAbscisRL) || (y[i] < -lenOrdinRL)){ sizeXY--; for(int j = i; j < sizeXY; j++){ x[j] = x[j+1]; y[j] = y[j+1]; } i--; } else{ x[i] += originX; y[i] = originY - y[i]; } } } SelectObject(hdc, CreatePen(lineStyle, widthLine, lineColor)); for(int i = 0; i < (sizeXY - 1); i++){ MoveToEx(hdc, x[i], y[i], NULL); LineTo(hdc, x[i+1], y[i+1]); } SelectObject(hdc, CreatePen(PS_SOLID, 1, axisColor)); MoveToEx(hdc, originX, originY-lenOrdinRL, NULL); LineTo(hdc, originX, originY+lenOrdinRL); MoveToEx(hdc, originX-lenAbscisRL, originY, NULL); LineTo(hdc, originX+lenAbscisRL, originY); ReleaseDC(console, hdc); return; } int main() { int *x = (int*)malloc(10*sizeof(int)); int *y = (int*)malloc(10*sizeof(int)); int sizeXY = 0; //getCoords(x, y, indxOp, xStartVal, xIncrm, pntsQtd, sizeXY, alocXY) getCoords(x, y, 50.0f*sin((double)x[i]/5.0f), -200, 1, 400, sizeXY, 10*sizeof(int)); //void drawGraph(int *x, int *y, int sizeXY, int widthLine, int lineStyle, int originX, // int originY, int lenAbscisRL, int lenOrdinRL, COLORREF lineColor, COLORREF axisColor) drawGraph(x, y, sizeXY, 2, PS_SOLID, 100, 100, 100, 100, redColor, whiteColor); free(x); free(y); x = NULL; y = NULL; printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); return 0; } Para compilar no CodeBlocks é necessário fazer o seguinte: na área de management, clicar com o botão direito no projeto > Build options > Linker settings > Other linker options e digitar -lgdi32 > Ok. Não testei o código no Visual Studio ainda. Uma breve explicação: Para desenhar o gráfico, estou usando as funções MoveToEx() e LineTo(), fora isso, só preciso inserir cada coordenada como num sistema de coordenadas cartesiano, que é o que parte da função drawGraph() faz. A outra parte é responsável por desenhar as linhas que compõem a forma de onda. A macro getCoords é uma macro do tipo função, e um dos parâmetros dessa função é a equação que será atribuída a Y, e caso haja X nessa equação, o mesmo deverá ser passado indexado com um índice i (conforme o exemplo no código), já que as macros são substituídas por suas definições durante o tempo de compilação, e cada coordenada é referenciada por um índice. Os parâmetros das funções eu tentei deixar autoexplicativos. drawGraph(): int *x e int *y - ponteiros que apontarão para o mesmo local da memória que os ponteiros passados para a função; int sizeXY - a quantidade de coordenadas de X e Y; int widthLine - a espessura da linha da forma de onda; int lineStyle - o estilo da linha (vide documentação a respeito de CreatePen()); int originX - a Origem do eixo X; int originY - a Origem do eixo Y; int lenAbscisRL - o comprimento da abscissa em ambas direções; int lenOrdinRL - o comprimento da ordenada em ambas direções; COLORREF lineColor - a coloração da linha da forma de onda; COLORREF axisColor - a coloração das linhas que compõem o plano cartesiano. getCoords() x e y - ponteiros para armazenar as coordenadas; indxOp - a equação, e se X estiver nela, o mesmo deverá estar indexado com um índice i; xStartVal - um valor inicial que será atribuído à X; xIncrm - o incremento que parte do valor inicial até atingir a quantidade total de pontos; pntsQtd - quantidade total de pontos; sizeXY - a quantidade de coordenadas de X e Y; alocXY - o tamanho do bloco de memória que deve ser somado ao tamanho do bloco de memória apontado por x e y (se necessário). Resultados: Plotagem de uma senoide comum - função matemática: Plotagem de uma onda quadrada - função matemática: Plotagem de uma onda triangular - função matemática: Plotagem de um coração - 2 funções condicionadas: Plotagem de... Algo bem estranho - função matemática: Algumas mudanças que pretendo fazer: Pretendo futuramente acrescentar um parâmetro na função drawGraph() que fará com que a escala do gráfico mude, já que gráficos com coordenadas pequenas são dificilmente visualizados; Acredito que o parâmetro alocXY da função getCoords() não seja necessário, pretendo escolher um valor para o mesmo e não deixar que o usuário passe esse valor para a função; Acrescentarei uma struct para servir de formulário e facilitar o processo; Mudarei o tipo da função drawGraph(), pois o mesmo é void e isso só atrapalha quando a questão é identificar problemas; Quando uso o scroll do mouse, o gráfico é apagado. Não sei a razão disso, pretendo corrigir futuramente se possível. Por fim... Se falhei em termos técnicos, peço para que me corrijam, pois ainda estou aprendendo Se quiserem acrescentar algo ou dar um feedback, fiquem à vontade!
  7. @aprendiz universal Poste o código usando o botão Code: Se tiver enunciado, coloque aí também. Ter que baixar, localizar e abrir um arquivo pra então poder ajudar é um inconveniente. Adicionalmente, comente as partes que você entendeu do código.
  8. @MscMagoo Você pode ler sobre sobre o comportamento da funções gets() e fgets() na documentação. Chamando fgets(), logo antes do '\0', você vai ter um '\n' se o mesmo for lido. O único caractere garantido de fato no final da string é o '\0': Se a gets() faz isso ou não, acho que não chega a ser tão interessante saber, já que esta é obsoleta e usá-la é uma perda de tempo, mas de qualquer forma, na documentação está escrito: Está respondida então a questão do '\n' e do '\0'. Só para complementar: Então se é uma string finalizada com o caractere nulo, gets() e fgets() devem garantir um no final da string.
  9. @me ajuda que eu te ajudo Leia algum número correspondente à opção no menu, e então use o comando switch (documentação). O menu começa na opção 3? Ok então. Veja a tabela ascii, observe que todo char corresponde a um número decimal. Você poderia ler um char e imprimir seu número decimal correspondente. Um loop com for deve resolver, veja a documentação. Basta varrer a string do fim ao começo, e imprimir caractere por caractere. Se está em loop, então satisfaça a condição do loop, ou então encerre o programa ali mesmo.
  10. @Gabryela Oliveira Dê uma revisada nos operadores nesse link.
  11. @PT_Richard_Assis sprintf() grava os dados numa string, veja a documentação. Acredito que possa servir para o que você quer fazer: após copiar a frase, crie um loop, e dentro do mesmo use a sprintf() para gravar na string seus próprios caracteres, mas espaçados. Talvez você precise de uma variável auxiliar, pois estaria escrevendo por cima dos caracteres da string com espaços. Aliás, você nem precisa chamar essa função, daria pra fazer isso com atribuições, mas você que decide Note também que você precisa limitar a quantidade de caracteres com os quais o usuário pode entrar, prefira fgets() à scanf(), e também você deverá alocar quase o dobro de memória para a nova string, já que deverão ser inseridos espaços entre os caracteres.
  12. @PT_Richard_Assis Recomendo não usar a system(), é perigosa e você não poderá usar em lugar algum de qualquer maneira. Alguns professores deixam e até encorajam a usar esse tipo de coisa quando se está aprendendo: system(), fflush(stdin), gets(), etc, mas não recomendo, considerando que system() passa uma string para o sistema rodar. Sobre seu programa: A execução vai continuar até o fim do corpo do switch se você não colocar nenhum break lá. Dê uma olhada a respeito do comando switch na documentação, inclusive tem um exemplo aí.
  13. @PT_Richard_Assis Você pode ou não ter acesso à essas funções, dependendo do compilador creio eu. Talvez não façam parte do padrão ansi C. Testei seu código aqui no CodeBlocks, o compilador é esse aí que está escrito na primeira linha: No caso o nome da função é strlwr(), veja a documentação. lwr vem de lower.
  14. @RobertNL77 Entenda: Não podemos fazer seus trabalhos, mas podemos ajudar se tiver alguma dúvida, de preferência objetiva, ou um código. Aliás, não entendi a parte do PHP lá... Pra mim aquilo é C++.
  15. @Sandro Boneberg Isso aí não faz nada além de produzir uma onda quadrada... Não é nada milagroso não viu Olha o que aparece quando pesquiso por essa tal Hulda Clark: Pois é, até com 555 da pra fazer um desses aí, mas eles vendem como algo milagroso para que possam cobrar um preço digamos 30 vezes o valor dos componentes... Talvez até mais?
  16. @Joel Martins %s é o especificador de strings, se quer ler um único caractere, use %c, e use %*c logo depois para ler e ignorar o '\n' digitado. Se quiser ler uma string, então troque &mes[i] por mes na scanf(), mas ainda haverá um '\n' sobrando da leitura, então coloque um %*c lá. EDIT: caso se trate de um vetor de strings, daí sinto muito, você não mostrou como a variável mes foi declarada Sempre poste o código completo.
  17. @João computação Todos os pontos flutuantes que está imprimindo têm mais que 3 caracteres, então %3f não tem efeito, seria o mesmo que %f. "0.000000" tem 8 caracteres, e este é o mínimo que estará imprimindo. Tente usar %12f e veja o que acontece... Conte os espaços à esquerda e some com a quantidade de caracteres do ponto flutuante Aliás: Tem um espaço depois do último '\n' aí, então sempre vai ter um espaço a mais na primeira linha da matriz que está imprimindo.
  18. @ArielBeaul Não recomendo usar ctype se é iniciante, até porque basta 1 loop varrendo a string e verificando se o caractere está dentro de certo intervalo. Aliás, se realmente é iniciante, seu professor provavelmente não aceitaria o código com funções desse cabeçalho. É por meio desse tipo de exercício que somos introduzidos à tabela ASCII: Mas enfim, faça o que achar certo PS: está programando em C, mas criou o tópico referente à linguagem C++.
  19. @ArielBeaul A ideia é quase isso... Se deve programar em C, não use nada da biblioteca padrão do C++, como o cabeçalho iostream. Em C seria algo como: #include <stdio.h> int main(){ for (int i = 0; i < 5; i++){ printf("*\n"); } return 0; //A função principal deve retornar um inteiro } Mas como você havia dito: E para tal, bastam 2 loops: o primeiro (externo) para controlar a quantidade de caracteres a serem impressos, ou seja, por exemplo, um índice i seria inicializado com 5 e decresceria até atingir o valor 0, que é quando a condição do for deixa de ser satisfeita, e o segundo (interno) para imprimir os caracteres em si, então um índice j seria inicializado com o valor de i e decresceria até atingir o valor 0, que é quando a condição deste também deixa de ser satisfeita.
  20. @Marceloiniciante Foto 1 é um termistor (2D2-10). Foto 4 é um capacitor (MKP X2 - 220nK). Você pode observar na foto da placa em si os símbolos de termistor e capacitor
  21. @Bercesar O processo é sempre o mesmo: faça um loop, talvez com do-while, englobando o que quer que repita, e no final imprima algo como: "Quer continuar? (1) Sim ou (2) Nao", e leia algo.
  22. @RobertNL77 Já vi usarem erroneamente setbuf() pra zerar o tal buffer de entrada, mas qual seu uso aqui? já está lendo e ignorando o '\n' que sobra da leitura com %*c, e ainda chamou a função duas vezes entre a scanf()... Recomendo não usar: system() passa uma string para o sistema rodar, em certos casos pode não ser muito agradável e até perigoso. Da pra fazer isso usando a API do Windows em poucas linhas. De onde isso veio? Está simulando o pressionamento de teclas para deixar a janela do IDE em tela cheia? Se está fazendo um programa de console usando a API do Windows, pode chamar GetConsoleWindow() e ShowWindow(). Em 1 linha: ShowWindow(GetConsoleWindow(), SW_MAXIMIZE); Não comentou sobre... Da próxima vez, tente facilitar a vida de quem está disposto a te ajudar, disserte sobre os erros E sim, alguns erros: Pelo menos é isso (não só isso) que me é mostrado com esse compilador aí. Um exemplo: Basta interpretar: a função cabecalho está retornando o valor 0, porém, não deveria, pois é do tipo void. Se quiser, pode deixar lá um return sem nenhuma expressão subsequente, pois alguns compiladores acusam erro sem o comando. Agora sua vez... Leia e interprete todo o resto, e se tiver dúvidas objetivas, pergunte
  23. OFF-TOPIC Criei um tópico há um tempo, me disseram que o problema do botão Code não aparecer é relacionado com a resolução da tela, e realmente, porque deixo o zoom da página em 125% pra conseguir ler: Se deixo em 100%, todas as opções aparecem: Link para o tópico: Se esse não é o caso de vocês, então deve ser problema do software mesmo Isso do botão Responder não funcionar também acontece comigo, mas daí eu uso o scroll e volta a funcionar, e se não funcionar, recarrego a página
  24. @devair1010 Se o propósito é esperar por algo do teclado, então imagino que o caminho seria esse mesmo. No github do colega @arfneto tem uma função que ele criou usando a Peek(), acho que chamou de choice(). O comportamento parece ser semelhante ao da getch(), só não mando o link porque não sei se tenho autorização

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!