Ir ao conteúdo
  • Cadastre-se

isrnick

Membro Pleno
  • Posts

    1.550
  • Cadastrado em

  • Última visita

Tudo que isrnick postou

  1. Porque deve receber um endereço de memória, no caso deve ser o endereço da primeira posição de um vetor de char contendo uma string. E é isso que você está passando quando passa uma string ou o nome de um vetor ao chamar essas funções. Pois usar o nome de um vetor é o mesmo que pegar o endereço de memória da primeira posição desse vetor. Ou seja, para um vetor criado como: int vetor[10]; Temos que usar o nome vetor é igual a usar &vetor[0]. vetor == &vetor[0] FILE é um tipo definido na biblioteca stdio.h que é capaz de armazenar todas as informações necessárias para controlar uma stream de entrada ou saída, usamos um ponteiro de FILE para lidar com arquivos no disco rígido ou SSD. Tem que ser const char * pois está dizendo que não deve fazer alterações no valor armazenado no local apontado por este ponteiro, ou seja o valor é constante. Dentro da função se tentasse alterar este valor daria erro ao tentar compilar. No protótipo da função o const também serve para te informar que a função não é destrutiva, ou seja a string passada como argumento não será alterada pela função.
  2. @devair1010 Claro, basta usar o especificador certo (%[^\n]), do mesmo modo que o scanf.
  3. - INTRODUÇÃO DA FUNÇÃO nscanf (N.o.o.b's scanf): Iniciantes na linguagem C tipicamente não entendem como a função scanf funciona e acabam cometendo erros que levam ao mal funcionamento do programa. Dois erros comuns são: - Não considerar que no fim da leitura do scanf normalmente sobra o caractere nova linha '\n' na entrada padrão stdin, e que isso deve ser tratado, ou seja o caractere deve ser lido para que não fique sobrando na stdin correndo o risco de afetar as próximas leituras. - Não considerar que o usuário pode não se comportar, ou seja não digitar aquilo que o programa solicitou e espera que ele digite. Por exemplo, pode digitar um texto quando se espera que digite um número, ou digitar um número com ponto flutuante (float ou double) quando se espera um número inteiro, ou não digitar nada, ou até mesmo digitar o que é esperado mas também continuar digitando coisas além disso na mesma linha, entre outros casos. Então, tendo em vista isto eu fiz esta função nscanf (N.o.o.b's scanf) que se comporta como os iniciantes em C esperam que a função scanf funcione: #include <stdio.h> #include <stdlib.h> char *__readline(void){ static char linebuffer[16384]; if(fgets(linebuffer, sizeof linebuffer, stdin) == NULL) linebuffer[0] = '\0'; return linebuffer; } #define nscanf(...) sscanf(__readline(), __VA_ARGS__) - COMO USAR: A função nscanf pode ser usada exatamente do mesmo modo que a função scanf , mas diferente da função scanf não ficará sobrando caracteres na entrada padrão em nenhuma situação, mesmo que o usuário não se comporte e a leitura falhe, na próxima leitura stdin já estará totalmente limpa permitindo usar nscanf novamente sem preocupações. #include <stdio.h> #include <stdlib.h> char *__readline(void){ static char linebuffer[16384]; if(fgets(linebuffer, sizeof linebuffer, stdin) == NULL) linebuffer[0] = '\0'; return linebuffer; } #define nscanf(...) sscanf(__readline(), __VA_ARGS__) int main() { int a; char b; printf("Numero: "); nscanf("%d", &a); printf("Letra: "); nscanf("%c", &b); printf("%d\n%c\n", a, b); return 0; } - COMO FUNCIONA: O funcionamento da função nscanf é simples, primeiro faz a leitura de todo o conteúdo da stdin com a função __readline , que usa fgets com um vetor/array de char "bem grande" para ler todo tudo que for digitado, e então a passa a string obtida como argumento da função sscanf para ser processada de acordo com os especificadores fornecidos na string de especificadores de formatação da função. O vetor usado na função __readline é declarado como static o que faz com que a memória fique reservada durante toda a execução do programa, não apenas durante a execução da função, permitindo retornar o ponteiro que aponta para o vetor que será usado pela função sscanf , e já que a memória é reservada permanentemente ela também pode ser reutilizada toda vez que usar a função nscanf . - DESVANTAGEM: A desvantagem óbvia de usar a função nscanf é o fato de deixar de aprender a usar a função scanf corretamente, isso pode ser um problema principalmente para alguém que é um aluno pois provavelmente vai ter que usar a função scanf durante provas e avaliações, então deve aprender como usar scanf. Então se for usar nscanf, eu recomendo que ainda assim aprenda a usar scanf , e o porquê ela pode não se comportar como você espera em certas situações, mas use nscanf para não precisar lidar com estas situações. Mas vendo isto por outro lado nscanf pode ajudar quem estiver estudando a focar em aprender a programar, ao invés de focar em aprender os comportamentos específicos de funções da linguagem C e como lidar com eles. - SOBRE AS FALHAS NA FUNÇÃO PARA PROGRAMADORES EXPERIENTES: Os programadores experientes aqui do fórum certamente vão notar que existe um problema na função __readline , pois como o vetor usado como buffer tem um tamanho fixo existe a possibilidade de que em um caso extremo seja lida uma quantidade de caracteres maior do que este tamanho, e isso causaria uma falha no funcionamento da função, e por outro lado essa pode ser uma quantidade de memória excessiva pois na grande maioria dos casos apenas uma pequena parte desse vetor será usado. Sobre este problema digo que esta versão da função __readline é propositalmente simples, pois é algo que poderia ser usado facilmente por um iniciante, bastando copiar um pequeno código, e adicionar um n aos scanfs usados no programa para poder usar, e é algo que um iniciante pode aprender exatamente como funciona sem muitas dificuldades. Se tiverem interesse em usar uma versão totalmente confiável da função nscanf , com uma função __readline que usa malloc para alocar a quantidade necessária de memória, eu também fiz uma versão assim, e posso postar aqui se desejarem. Espero ler seus comentários e criticas sobre a função nscanf... Existem problemas que eu não detectei? Situações que a tornariam pior do que a função scanf?
  4. @Jorge Curvelo Basta não usar inicializadores designados... #include <windows.h> int main() { /*Mover mouse para o centro da tela*/ MOUSEINPUT m1; m1.dx=32768; m1.dy=32768; m1.mouseData=0; m1.dwFlags=MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE; m1.time=0; /*Clicar com o botão direito do mouse*/ MOUSEINPUT m2; m2.dwFlags=MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP; m2.time=0; /*Vetor de entradas para juntar as ações do mouse:*/ INPUT in[2]; in[0].type=INPUT_MOUSE; in[0].mi=m1; in[1].type=INPUT_MOUSE; in[1].mi=m2; /*Realiza as ações de entrada do mouse:*/ SendInput(2, in, sizeof *in); return 0; } Tá usando qual IDE? Que compilador? No GCC só to conseguindo gerar esse tipo de warning se eu configurar para compilar seguindo o bem antigo padrão C90 da linguagem.
  5. @Jorge Curvelo #include <windows.h> int main() { //Mover mouse para o centro da tela MOUSEINPUT m1 = (MOUSEINPUT){.dx=32768, .dy=32768, .mouseData=0, .dwFlags=MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, .time=0}; //Clicar com o botão direito do mouse MOUSEINPUT m2; m2.dwFlags=MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP; m2.time=0; //Vetor de entradas para juntar as ações do mouse: INPUT in[2]; in[0]=(INPUT){.type=INPUT_MOUSE, .mi=m1}; in[1].type=INPUT_MOUSE; in[1].mi=m2; //Realiza as ações de entrada do mouse: SendInput(2, in, sizeof *in); return 0; } Foram usados: SendInput() INPUT MOUSEINPUT
  6. Também pode usar SendInput() para controlar o mouse, incluindo clicar e mover.
  7. Em C++ é fácil, dá pra seguir os mesmos passos do código do @Brazilian student em Python: #include <iostream> #include <vector> #include <string> #include <cmath> using namespace std; int main() { vector<string> heart; string nome = "Amor"; for(int y=39; y>-39; y--){ string linha = ""; for(int x=-39; x<39; x++){ if (pow(pow(x*0.05, 2.0) + pow(y*0.1, 2.0) - 1.0, 3.0) - pow(x*0.05, 2.0)*pow(y*0.1,3) <= 0){ linha.push_back(nome[(x - y) % nome.length()]); } else { linha.push_back(' '); } } if (linha.find_first_not_of(" ") != string::npos){ heart.push_back(linha); } } for (auto lin : heart){ cout << lin << endl; } return 0; }
  8. Outro jeito: #include <stdio.h> int main() { int i, j; for (i=0; i<10; i++){ for (j=0; j<10; j++){ if(i<=j) printf("*"); else printf(" "); } printf("\n"); } printf("\n"); for (i=0; i<10; i++){ for (j=0; j<10; j++){ if(i>=9-j) printf("*"); else printf(" "); } printf("\n"); } return 0; }
  9. @Mauro Britivaldo Posição é relativa ao ponto de origem escolhido para o plano cartesiano XY, você pode escolher qualquer ponto no espaço como origem, escolhendo outro ponto diferente de A como origem as coordenadas do ponto B em relação a esta origem seriam diferentes, o que significa que o vetor de posição do ponto B mudaria, ou seja o vetor de posição de um ponto (como qualquer vetor) depende de 2 pontos: O próprio ponto e o ponto onde está a origem. Note também que na nova origem os vetores u e v não mais seriam equipolentes/iguais ao vetor de posição do ponto B, logo é impossível dizer que u e v pertencem ao ponto B. Aí você vai dizer que na nova origem os vetores u e v pertencem a outro ponto? Como qualquer ponto pode ser escolhido como origem, então u e v pertencem a todos os infinitos pontos do plano? Isso seria o mesmo que dizer que eles não pertencem a nenhum ponto...
  10. Sim, precisa. A "enrolação" se chama rigor matemático. Existe uma definição matemática dizendo exatamente o que é um vetor. Me mostre uma fonte confiável que defina que vetores pertencem a 1 ponto, e que pode-se dizer que "vetor x é um vetor do ponto Y", e que todos os vetores paralelos e de mesma magnitude e sentido pertencem ao mesmo ponto, como você está afirmando.
  11. O operador de comparação == tem precedência sobre o operador lógico &&, então este if não vai funcionar corretamente, imagino que você queria fazer: if ((verde[1] && verde[4] && verde[7]) == HIGH) { vitoria(); // chama a função de vitória } Mas não sei que valor HIGH tem, seria 1? Ou 0? Ou 10?... Então eu preferiria simplesmente fazer: if (verde[1] && verde[4] && verde[7]) { vitoria(); // chama a função de vitória } E você pode fazer ciclos para comparar colunas, linhas, e um if para cada diagonal assim: // Verifica linhas; for(i=0; i<3; i++){ if(verde[i*3] && verde[i*3+1] && verde[i*3+2]){ vitoria(); } } // Verifica Colunas: for(i=0; i<3; i++){ if(verde[i] && verde[i+3] && verde[i+6]){ vitoria(); } } // Verifica Diagonal Principal: if(verde[0] && verde[4] && verde[8]){ vitoria(); } // Verifica Diagonal Secundária if(verde[2] && verde[4] && verde[6]){ vitoria(); } adicionado 12 minutos depois Isso tudo assumindo que os valores guardados no vetor verde são 0 (=falso) quando verde não jogou na posição, e algo diferente de 0 (=verdadeiro) quando verde já jogou nada na posição.
  12. O Vector((3, 2)) da imagem é apenas uma abreviação de Vector((0, 0), (3, 2)), é assumido que o vetor parte de um ponto na origem, logo sempre é necessária a existência de 2 pontos indicando início e fim do vetor para obter um vetor. Nova definição matemática por @Mauro Britivaldo. Publica a tese e fica famoso.
  13. @Matheus Maldi Como só vai guardar int ou char e nunca os dois ao mesmo tempo na struct pode usar uma união. typedef struct { union{ int int_value; char char_value; }; bool is_int; } int_or_char; Para que int_value e char_value usem o mesmo local da memória.
  14. Claramente não é. Se quer definir relacionando pontos terá que dizer que u = . Não há como descrever um vetor com apenas 1 ponto. ?? Não entendi. O vetor v não tem relação alguma com o ponto B.
  15. Então a solução que postei não funciona pois os números podem ter mais de 1 dígito. Mas você tem um problema maior, não há como diferenciar pois caracteres são números, ou seja o caractere 'A' na verdade é o número 65 (consulte a tabela ASCII para ver números correspondentes de cada caractere). Seria necessário usar uma struct com uma flag para indicar se é para tratar como int ou char... #include <stdio.h> typedef struct intorchar{ int i; char ischar; } intc; int main() { intc M[20][20]; M[0][0].i = 'A'; M[0][0].ischar = 1; M[0][1] = (intc){'B', 1}; M[0][2].i = 10; M[0][2].ischar = 0; M[0][3] = (intc){20, 0}; M[0][0].ischar ? printf("%c\n", M[0][0].i) : printf("%d\n", M[0][0].i); M[0][1].ischar ? printf("%c\n", M[0][1].i) : printf("%d\n", M[0][1].i); M[0][2].ischar ? printf("%c\n", M[0][2].i) : printf("%d\n", M[0][2].i); M[0][3].ischar ? printf("%c\n", M[0][3].i) : printf("%d\n", M[0][3].i); return 0; }
  16. Os números sempre tem só 1 dígito? Se sim, então pode converter para o respectivo caractere na hora de imprimir, por exemplo transformar um 7 em um '7' e sempre imprimir como caractere. Pra fazer essa conversão basta somar o dígito ao caractere '0'. printf("%c", M[i][j] < 10 ? M[i][j] + '0' : M[i][j]); Aí tem que se perguntar se existe a necessidade dos dígitos estarem na matriz na forma numérica, pois poderiam já estar como o caractere e não precisaria fazer essa conversão para imprimir.
  17. Veja os 2 vetores u e v no espaço 2D abaixo: Tem 4 pontos no plano: A (0, 0) B (2, 3) C (-2, 0) D (0, 3) Mas os vetores u e v são ambos definidos com: u = 2 i + 3 j v = 2 i + 3 j B é o único ponto em que as coordenadas coincidem com as magnitudes das projeções dos vetores na direção dos vetores unitários i e j . Observe também que o vetor v não tem relação alguma com o ponto B.
  18. A função pow recebe parâmetros do tipo double e retorna um valor do tipo double, mas você está armazenando numa variável int, então ocorre uma conversão de double para int, e dependendo do valor retornado pela função um vai obter um valor diferente no int. https://en.cppreference.com/w/c/numeric/math/pow Por exemplo, digamos que o retorno foi algo próximo de 25 (pois existe uma margem de erro quando se calcula com números de ponto flutuate), como 24.9999995, a parte inteira desse número é 24 então se pegar só isso vai resultar em 24, mas se a conversão é feita arredondando para cima então obterá 25, então depende de como o compilador implementa essa conversão. Então você tem 2 opções: Usar variáveis double ao invés de int, ou então fazer e usar sua própria função para calcular exponenciação de números inteiros.
  19. Lembre-se que a operação de multiplicação nada mais é do que várias somas do mesmo número. (0) E que potenciação são várias multiplicações do mesmo número. Então podemos fazer uma função f(n) tal que: Logo, pode resolver o exercício usando a operação de soma em ciclos (while, for, ou do-while) para ir calculando f(n) somando f(n-1) a sí próprio a vezes, até chegar em f(b) (ou seja quando n=b) obtendo o resultado da potência.
  20. Vetor não é um ponto... Vetor tem direção, sentido e magnitude, enquanto um ponto é apenas uma posição no espaço. O vetor u acima pode ser descrito de forma descomposta na direção dos vetores unitários i, j, k como: E as magnitudes x, y e z das decomposições do vetor u coincidem numericamente com as coordenadas do ponto A no espaço, mas o vetor u não é igual ao ponto A.
  21. struct vetor{ float x; float y; float z; }; typedef struct vetor Vetor; float escalar(Vetor* v1, Vetor* v2); x, y e z representam as magnitudes das projeções do vetor sobre as 3 dimensões X, Y e Z, e calcular o produto escalar é simples:
  22. Com o código indentado corretamente fica mais fácil de ver onde está o erro. O problema é que estava faltando o else para dizer que o com mês menor ou igual a 0 ou maior que 12, ou ano menor ou igual a 0 a data não é válida. #include <stdio.h> #include <stdlib.h> int main() { int dia, mes, ano; printf("*VERIFICACAO DE DATA VALIDA* \n"); printf("\n"); printf("DIGITE UM DIA: "); scanf("%d", &dia); printf("DIGITE UM MES: "); scanf("%d", &mes); printf("DIGITE UM ANO: "); scanf("%d", &ano); if(mes>0&&mes<=12 && ano>0){ if((mes==2) && (dia>0&&dia<=28 &&)){ printf("%d/%d/%d EH VALIDA", dia, mes, ano); } else if((mes==4||mes==6||mes==9||mes==1) && (dia>0 && dia<=30)){ printf("%d/%d/%d EH VALIDA", dia, mes, ano); } else if((mes==1||mes==3||mes==5||mes==7||mes==8||mes==10||mes==12) && (dia>0 && dia<=31)){ printf("%d/%d/%d EH VALIDA", dia, mes, ano); } else{ printf("%d/%d/%d NAO EH VALIDA", dia, mes, ano); } } else{ //<---Faltava esse else aqui printf("%d/%d/%d NAO EH VALIDA", dia, mes, ano); } return 0; } Ainda está faltando considerar os anos bissextos, quando fevereiro tem 29 dias.
  23. isrnick

    C Algorítmo MDC linguagem c

    Para MDC entre 2 números use o algoritmo de Euclides: int mdc (int a, int b){ int temp; while (b != 0){ temp = b; b = a % b; a = temp; } return a; } E para mais números, pode fazer o mdc do terceiro número com o resultado do mdc entre os 2 números, e continua fazendo isso pega o resultado e faz o mdc com o próximo número, para quantos números tiver.
  24. Sim, como o @Mauro Britivaldo apontou usar %s limita a ler apenas 1 palavra digitada, então se você digitar uma frase (como por exemplo um endereço completo, ou um nome com sobrenomes) não vai servir pois só vai obter a primeira palavra digitada. No caso poderia usar o outro tipo de especificador de string %[ , e usar assim %[^\n] (= ler e guardar qualquer caractere que não seja o caractere nova linha '\n'), assim vai ler tudo até encontrar um caractere nova linha '\n', ou seja pega tudo que tiver até o fim da linha e guarda no vetor de char. scanf(" %[^\n]", endereco);
  25. Coloque um espaço antes do % nos scanfs com %s, para descartar caractere o '\n' (nova linha) e qualquer outro caractere de espaço vazio (espaço, tabulação, etc) que tiver sobrado dos scanfs anteriores na entrada padrão (stdin). E para vetores (como nesses 2 vetores de char do seu programa) não vai & antes do nome do vetor, pois usando o nome diretamente já obtém um endereço de memória. Ex: scanf(" %s", endereco);

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!