Ir para conteúdo
Fórum Script Brasil

Exata0mente

Membros
  • Total de itens

    21
  • Registro em

  • Última visita

Posts postados por Exata0mente

  1. Olá amigo!

    O erro está no operador lógico que utilizou no if.

    A função strcmp retorna um inteiro 0 quando as palavras são iguais. O erro que seu código apresenta é que se uma das condições forem satisfeita ele dá acesso. O correto é usar o operador lógico OU (||). Veja

    "1 && 1 = 1" *** "1 || 1 = 1"

    "1 && 0 = 0" *** "1 || 0 = 1"

    "0 && 1 = 0" *** "0 || 1 = 1"

    "0 && 0 = 0" *** "0 || 0 = 0"

    Como a saída que diz "Acesso garantido!" é a saída else (0), se qualquer uma das condições tivesse uma ou nenhuma string correta a saída seria 0. Usando o operador lógico OU seria diferente: a única forma de o resultado ser 0 e ir para o else é se, e somente se, o retorno dos dois strcmp forem 0.

    if(strcmp(login.senha, "laranja") || strcmp(login.nome, "Angelo"))

     

  2. Pense no seguinte, a média aritmética nada mais é do que a soma de n elementos dividido por n:

    media = (x1 + x2 + x3 + x4)/n

    Matematicamente, esta expressão poderia ser representada por:

    media = x1/n + x2/n + x3/n + x4/n.

    Dado este rearranjo da expressão fica fácil você fazer um laço para calcular média. Exemplo:

    int main(){
    
        int i, n, idade[5] = {16, 18, 36, 40, 25};
        float media;
    
        n = 5;
        media = 0;
    
        for(i = 0; i < n; i++){
            media += idade[i] / (float)n;
        }
    
    return 0;
    }

    Veja:

    (16 + 18 + 36 + 40 + 25) / 5 => 135 / 5 = 27

    16/5 + 18/5 + 36/5 + 40/5 + 25/5 => 3,2 + 3,6 + 7,2 + 8 + 5 = 27

    Espero ter ajudado!

     

  3. Olá,

    Vamos ver se a lógica é essa:

    • Solicita número limite para a aleatoriedade N;
    • Solicita quantos elementos por linha será impresso M;
    • Imprime o vetor;
      • Se a quantidade de elementos for divisível por M pule uma linha;

    Me corrija se estiver errado por favor. Abaixo o código:

     

    
    #include <stdio.h>
    #include <stdlib.h> /*Biblioteca do srand() e rand(), não as esqueça :) */
    #include <time.h>
    #define TAM 100 /*Por convencao usar constante com letras maiusculas*/
    
    void atribuir_valor(int vet[], int N){ /*TAM e' uma constante global, ou seja, não se faz necessario passar como argumento pois já foi
    										definida no começo do programa*/
    
        int i;
        srand(time(0));
    
        for(i = 0; i < TAM; i++)
            vet[i] = rand() % N + 1; /*Apesar de não passar o tamanho do vetor como argumento para a funcao, dentro da funcao
                                        e' necessario informar a posicao de cada elemento*/
    }
    
    void exibe_vetor(int vet[], int M){ /*TAM e' uma constante global, ou seja, não se faz necessario passar como argumento*/
    
        int i;
    
        for(i = 0; i < TAM; i++){
            printf("Vet[%d] = %d\t", i + 1, vet[i]);
    
            if(!((i + 1) % M)) /*Condicao para pular linha*/
                printf("\n");
        }
    }
    
    int main(){
    
        int v[TAM], n, m;
    
        printf("Informe o limite N:\n");
        scanf("%d", &n);
    
        atribuir_valor(v, n);
    
        printf("Informe a quantidade de elementos por linha \'M\'\n");
        scanf("%d", &m); /*Vamos assumir que o usuario não digitara numero negativo*/
        printf("O vetor e: \n");
        exibe_vetor(v, m);
    
    return 0;
    }
    

     

  4. Olá!

    Tentei ser fiel ao máximo em seu código e deixá-lo bem simples, mas já adianto que não o corrigi (há alguns erros). É intuitivo os comandos então para seguir com as correções.

     

    #include <stdio.h>
    
    int main(){
    
        char nome[60], d, n, turdiario;
        int idade, diasmes, diastrabmes, horasdia;
        float valhrtrab, salario, inss, fgts;
    
        /*Obs: há variaveis que não foram utilizadas em seu codigo: diasmes, n, d*/
    
        printf("Digite o nome do funcionario: ");
        scanf("%s", nome);
        printf("Digite a idade do funcionario: ");
        scanf("%3d", &idade);
        printf("Digite quantos dias trabalhados no mes: ");
        scanf("%2d", &diastrabmes);
    
        do{
            printf("Regime de horas trabalhadas por dia. 6 ou 8 horas?: ");
            scanf("%2d", &horasdia);
        }while((horasdia != 6) || (horasdia != 8)); /*Aqui há um erro de logica, 6 é diferente de 8 e 8 é diferente de 6 portanto este laco nunca sera
                                                      nunca sera satisfeito*/
    
        printf("Digite o Turno. D para Diurno e N para Noturno ou Pressione S para Sair: ");
        scanf("%c", &turdiario);
    
        if((turdiario != 'D') && (turdiario != 'N')){
            printf("Programa Finalizado!!");
        }
    
        if((turdiario == 'D') && (idade <= 50))
            valhrtrab = 3.0;
        else
            if((turdiario == 'D') && (idade > 50))
                valhrtrab = 3 + 3 * 0.1;
            else
                if((turdiario == 'N') && (idade <= 50))
                    valhrtrab = 4;
                else
                    if((turdiario = 'N') && (idade > 50))
                        valhrtrab = 4 + 4 * 0.1;
    
        salario = (valhrtrab * horasdia * diastrabmes) + (valhrtrab * horasdia * diastrabmes * 1.5);
        fgts = salario * 0.08;
    
        if (salario <= (float)1556.94)
            inss = salario * 0.08;
        else
            if(salario >= (float)1556.95 && salario <= (float)2594.92)
                inss = salario * 0.09;
            else
                if(salario >= (float)2594.93 && salario <= (float)8189.82)
                    inss = salario * 0.11;
    
    
        printf("O salario bruto é: %.2f", salario);
        printf("\nO Total do Depósito do FGTS e: %.2f",fgts);
        printf("\nO depósito do INSS é: %.2f", inss);
    
    return 0;
    }
    

     

  5. Olá, se eu não entendi os conceitos de vetor erroneamente, não é uma boa prática definir o tamanho de um vetor por meio de uma variável pois o vetor é criado em tempo de compilação (antes do programa executar) já que é necessário destinar uma faixa na memória para o vetor.

    "Às vezes, a quantidade de memória a alocar só se torna conhecida durante a execução do programa. Para lidar com essa situação é preciso recorrer à alocação dinâmica de memória. A alocação dinâmica é gerenciada pelas funções malloc, realloc e free, que estão na biblioteca stdlib.(...)", este trecho retirei do site https://www.ime.usp.br/~pf/algoritmos/aulas/aloca.html

    Caso não tenha aprendido alocação dinâmica (o que é o meu caso) faça um vetor de um tamanho "aceitável" e no for determine o limite. Por exemplo:

     

    #include <stdio.h>
    #define MAX_T 50
      
    int main(){
    	int X, Y, i, j;
      	int matriz[MAX_T][MAX_T];
        
        printf("X: ");
        scanf("%d",&X); /*Linha*/
        printf("Y: ");
        scanf("%d",&Y); /*Coluna*/
        printf("\n");
      
      	for(i = 0; i < X; i++) /*Usando X como limite para linha (assuminto que X será menor que MAX_T, você pode validar antes*/
    		for(j = 0; j < Y; j++) /*Usando Y como limite para linha (assuminto que X será menor que MAX_T, você pode validar antes*/
      			/*Preenchimento da Matriz*/
    return 0;
    }

    Se falei alguma besteira me corrijam por favor :S

  6. Olha, se eu não entendi errado, o exercício 1 é muito simples e precisa apenas de dois números dados pelo usuário e não um laço:

     

    #include <stdio.h>
    #include <stdlib.h>
    
    
    /*Tipo void, pois as impressoes sairao direto das funcoes*/
    void soma(int, int);
    void subtracao(int, int);
    void multiplicacao(int, int);
    void divisao(int, int);
    
    int main(){
    
        int a, b; /*duas variaveis conforme o enunciado*/
    
        printf("Digite dois numeros separados por espaco: ");
        scanf("%d%d", &a, &b);
    
        soma(a, b);
        subtracao(a, b);
        multiplicacao(a, b);
        divisao(a, b);
    
        return 0;
    }
    
    void soma(int num1, int num2){
    
        printf("\n%d + %d = %d", num1, num2, num1 + num2);
    
    }
    
    void subtracao(int num1, int num2){
    
        printf("\n%d - %d = %d", num1, num2, num1 - num2);
    }
    
    void multiplicacao(int num1, int num2){
    
        printf("\n%d x %d = %d", num1, num2, num1 * num2);
    }
    
    void divisao(int num1, int num2){
    
        printf("\n%d / %d = %.1f", num1, num2, (float)num1 / num2);
    }

     

    O exercício 2 é mais simples ainda pois pede apenas uma operação

    #include <stdio.h>
    
    void soma(int, int);
    
    int main(){
    
        int a, b;
    
        printf("Digite dois valores separados por espaco: ");
        scanf("%d%d", &a, &b);
    
        soma(a, b);
    
    return 0;
    }
    
    void soma(int num1, int num2){
    
        int soma; /*Apenas para não jogar a conta direto no printf*/
    
        soma = num1 + num2;
    
        printf("\n%d + %d = %d", num1, num2, soma);
    }

     

    Caso eu tenha entendido errado peço desculpas :)

  7. Bom dia!

    @vangodp, você tem total razão. Fui pesquisar um pouco mais sobre o gets() e é de fato um limitadissímo!

    Em 12/11/2016 at 01:05, vangodp disse:

    Posso lhe dar uns quantos motivos para nunca usar gets mas o principal é que ele pode ler um string de qualquer tamanho, a conseqüência é pode ler textos inclusive maior que seu string.

    O erro que está ocorrendo é que você esta tratando uma string como se fosse um char quando você usa scanf troque scanf("%80[^\n]", &nome);
    por
    scanf("%80[^\n]", nome); //sem &

    você não deve por & adiante de ponteiros e strings. Um string nada mais é que um ponteiro que aponta para a posição numero 1 da sua seqüencia de caracteres, então ponteiros e strings guardam relação, por isso você não deve por & adiante de ponteiros e strings, lembre disso.

    @luisg5, lembre-se sempre que o nome de um vetor, é o "endereço" do primeiro elemento deste vetor, logo, não precisaria do & para indicar o endereço do vetor.

    Porém, caso você rode seu código fazendo apenas esta modificação, notará que o printf() retornará apenas a string nome.

    Acontece que o ENTER que você deu no primeiro scanf() não foi associado à string nome e acabou indo para o buffer. Quando o scanf() para a string contacorrente é chamado, primeiro analisa o buffer, que tem um "\n" o que encerraria a leitura da string contacorrente.

    Para resolver isto, será necessário a limpeza do buffer antes de ler a string contacorrente

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(){
      
        char nome[81], contacorrente[5];
        int val;
    
        printf("Informe seu nome: ");
        scanf("%80[^\n]", nome);
    
        __fpurge(stdin); /*Para windows use fflush(stdin)*/
    
        printf("Informe a conta corrente: ");
        scanf("%4[^\n]", contacorrente);
    
        val = atoi(contacorrente);
    
        printf("Seu nome e: %s\n", nome);
        printf("A conta e: %d", val);
    
    return 0;
    }

    Caso queira ver mais:

    https://www.vivaolinux.com.br/artigo/Parametros-interessantes-do-scanf-e-do-printf-em-C?pagina=2
    http://www.cprogressivo.net/2012/12/Buffer--o-que-e-como-limpar-e-as-funcoes-fflush-e-fpurge.html

  8. Olá, acho que não responderei sua pergunta mas, será que, alternativamente, a função gets() não poderia lhe ajudar?

     

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        char nome[81], contacorrente[5];
        int val;
        printf("Informe seu nome:\n");
        gets(nome);
        printf("Informe a conta corrente:\n");
        gets(contacorrente);
        val = atoi(contacorrente);
        printf("Seu nome e: %s\n", nome);
        printf("A conta e: %d", val);
    
    return 0;
    }

     

  9. Bom dia!

    Estou tendo uma baita dor de cabeça com esse exercício:

    "Escreva uma macro que encontre o maior entre seus três argumentos."

     

    O maior problema é que essa verificação, segundo o enunciado, deve ser nos três argumentos da macro.

     

    #include <stdio.h>
    #define MAIOR(a, b, c)  printf("%d %d %d", (a > b && b > c ? a, b, c : \
                                                (a > c && c > b ? a, c, b : \
                                                    (b > a && a > c ? b, a, c : \
                                                        (b > c && c > a ? b, c, a : \
                                                            (c > b && b > a ? c, b, a : \
                                                                c, a, b))))))
    
    int main(){
    
        int num1, num2, num3;
    
        scanf("%d%d%d", &num1, &num2, &num3);
        MAIOR(num1, num2, num3);
    
    return 0;
    }

     

  10. Olá!

    O seu vetor é do tipo char. Vetor deste tipo recebe caracteres únicos. Estes caracteres são representados por aspas simples. No seu caso o compilador está entendendo que você está associado variáveis A, B, C e D. Para corrigir este problema, use aspas simples em cada caractere que roda.

    Recomendo no final do programa utilizar o return ou usar a função main como void.

    Obs.: O erro que informou foi apresentado pelo compilador. É importante sempre analisar os erros que o compilador retorna.

    Forte abraço e bons estudos!

  11. Olá!

    Este enunciado realmente gera muita dúvida. Meu código simplificado em C ficou assim:

     

    #include<stdio.h>
    
    int main(){
    
        float quant_p1, quant_p2, valor_premio, prop_p1, prop_p2;
    
        /*Entrada de dados*/
        printf("Digite a quantia do apostador 1: ");
        scanf("%f", &quant_p1);
        printf("Digite a quantia do apostador 2: ");
        scanf("%f", &quant_p2);
        printf("Digite o valor do premio: ");
        scanf("%f", &valor_premio);
    
        /*Processamento dos dados*/
        prop_p1 = quant_p1 / (quant_p1 + quant_p2);
        prop_p2 = quant_p2 / (quant_p1 + quant_p2);
    
        /*Saida dos dados*/
        printf("\nO apostador 1 ganhou: %.2f\nO apostador 2 ganhou: %.2f", valor_premio * prop_p1, valor_premio * prop_p2);
    
    
    return 0;
    }

     

    Fiz também um vídeo explicando a parte matemática deste código, pois seu "maior problema" é apenas a interpretação matemática do exercício:

     

     

     

  12. Olá!

    Este livro é excelente. Aborda diversos conceitos e tem bastante exemplos e exercícios.

    Tenho um canal que tem as respostas comentadas deste livro. Recomendo que dê uma passada lá :)

    Já há respostas do Capítulo 1, 2 e 3. Estou trabalhando fortemente nos capítulos restantes:

     

     

×
×
  • Criar Novo...