Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.

isrnick

Membros Plenos
  • Total de itens

    1.257
  • Registro em

  • Última visita

  • Qualificações

    0%

Reputação

480

2 Seguidores

Informações gerais

  • Cidade e Estado
    Sao Paulo
  • Sexo
    Masculino
  1. @Lucas Tezolini Herler Uma função "retornar" algo refere-se apenas a quando se usa a palavra-chave return para retornar um valor, se não precisou usar return então a função não retornou nenhum valor, esse tipo de função recebe o tipo void. Exemplo de função com retorno do tipo int: int dobro(int x){ return 2 * x; } Como essa função retorna um valor podemos usá-la em atribuições e outras operações, veja: a = 10 y = dobro(a); //A função retorna o número 20, e atribuimos esse valor a y Abaixo segue seu código com as alterações que mencionei (me informe se dá algum warning): #include<stdio.h> #include<locale.h> #define t 2 void preencher (int m1[t][t]) { int i,j; for (i=0;i<t;i++) { for (j=0;j<t;j++) { printf("Digite o valor de posição %d%d ", i, j); scanf("%d", &m1[i][j]); } } } void ler (int m1[t][t], int m2[t][t], int m3[t][t]) /* função que vai realizar a operação*/ { int i,j; for (i=0;i<t;i++) { for (j=0;j<t;j++) { if (m1[i][j] > m2[i][j]) { m3[i][j] = m1[i][j]; } else { m3[i][j] = m2[i][j]; } } } } void mostrar (int m3[t][t]) { int i, j; for (i=0;i<t;i++) { for (j=0;j<t;j++) { printf("%d \t", m3[i][j]); } printf("\n"); } } int main () //Main movido para o fim do código { setlocale(LC_ALL,"Portuguese_Brazil"); int m1[t][t], m2[t][t], m3[t][t]; // i, j; <- Declaradas mas não usadas preencher(m1); preencher(m2); ler(m1, m2, m3); //Estava faltando essa linha para funcionar corretamente mostrar(m3); return 0; //main() returna zero = programa acabou corretamente }
  2. O problema é que no main() você não usou a função ler() que é onde a matriz m3 receberia os valores maiores. Alguns detalhes que tabém pode corrigir: - Os tipos das funções que não retornam nenhum valor deveria ser void (não int). - A função main() está com o tipo correto, o tipo int, só que ficou faltando colocar o "return 0;" na última linha do main() para retornar zero indicando que o programa foi encerrado corretamente. - Algumas variáveis foram declaradas mas não são usadas dentro da função, então remova a declaração. - No C sempre deve-se declarar algo primeiro para depois usar, mas seu programa está com a função main() no começo do código e ela usa funções que só são declaradas depois dela... Então mova a função main() para o fim do código. adicionado 13 minutos depois @Simon Viegas Ele interpretou o enunciado de maneira diferente, quer que compare os números na mesma posição das 2 matrizes, e guarde o número maior na mesma posição da terceira matriz.
  3. Use variáveis inteiras (int) ao invés de ponto flutuante (float), e use %d ao invés de %f no scanf e no printf. Você está imprimindo as 2 variáveis hora e min no fim do programa, mas o total em minutos está na variável hora apenas. adicionado 2 minutos depois @Leonardo0308 A entrada de dados deve ser digitada como 2.40, então se usar %f vai ler e guardar em apenas uma variável.
  4. Para comparar strings use a função strcmp(string1, string2), que retorna 0 se string1 é igual a string2, um número maior que 0 se string1 > string2, e um número menor que 0 se string1 < string2 (maior e menor dependendo da ordem alfabética seguindo os valores dos caracteres na tabela ASCII). if (strcmp(nome, A[i].Nome) == 0) //Se 'nome' e 'A[i].Nome' são iguais
  5. Não se retorna vetores em C, pois só se retorna 1 valor, então seria possível retornar um ponteiro de um vetor alocado dinamicamente, ou retornar uma struct que contém um vetor, mas não retornar um vetor comum. Mas nesse caso não é necessário retornar nada, o vetor gab já é passado como parâmetro de entrada do função, e vetores são passados por referência, ou seja passa o endereço de memória onde os dados do vetor são guardados (ao invés de passar os valores guardados no vetor). Isso significa que as alterações/atribuições que fizer ao vetor gab dentro da função estão de fato sendo guardadas no mesmo lugar da memória do vetor gab fora da função (o gab do main() que foi passado como argumento). Então não precisa retornar o vetor pois o próprio gab que foi passado como argumento da função já funciona como uma espécie de variável de "retorno".
  6. É o típico problema de ficar lixo no buffer de entrada, você precisa limpar os caracteres que não foram lidos pelo scanf para evitar que o próximo scanf os leia ao invés do que deveria ser digitado e capturado pelo scanf. Coloque essa função no programa: void flush_stdin(){ int c; while((c = getchar()) != '\n' && c != EOF); } E use-a após cada scanf para limpar o que ficou no buffer: scanf("%s",&nome); flush_stdin(); Normalmente apenas o caractere nova linha '\n' fica sobrando (o caractere é inserido quando você aperta Enter após digitar algo no prompt/cmd/terminal), mas essa função vai limpar qualquer coisa. Aliás, se a intenção é fazer o scanf pegar nomes completos, não apenas o primeiro nome, use %[^\n] no scanf, ao invés de %s, pois %s captura apenas 1 palavra, ou seja para de capturar no primeiro caractere vazio encontrado (espaço, nova linha ou tabulação). scanf("%[^\n]",&nome);
  7. Palíndromos podem sim ter um número ímpar de algarismos, o próprio enunciado dá um exemplo 32423. Você está fazendo de um modo muito complicado, o modo mais simples é simplesmente inverter todos os algarismos do número, gerando um número invertido, ou seja com os mesmos algarismos de trás para frente. E se o numero invertido for igual ao número original então o número é palíndromo. 123231 -> invertido = 132321 -> 123231 é diferente de 132321 logo não é palíndromo 32423 -> invertido = 32423 -> 32423 é igual a 32423 logo é palíndromo
  8. Não entendi, o que você quer dizer com "retornar o vetor todo"?
  9. - A função main() deveria estar no fim do código, pois como está o main() chama funções que só estão definidas depois dele. - Colocar o tipo void das funções que não retornam valores. - Na função ler() está o vetor acertos[] está sendo declarado com comprimento i (int acertos[ i ]), mas deveria ser um número no lugar do i. - Usou = neste if(m[ i ][j] = gab[ i ]), mas deveria ser == pois este é o operador de comparação de igualdade. - São declaradas variáveis nas funções main() e gabarito() que não são usadas nas funções. - A função ler() não recebe o gabarito como parâmetro de entrada, logo não dá pra comparar pois não tem os valores do gabarito.
  10. @AnsiC Não tem problema ele quer números inteiros apenas, o calculo precisa ser feito com ponto flutuante para chegar no valor correto, mas dá pra converter para int depois de calcular e retornar inteiro: int transformando (int graus) { //Precisa colocar o .0 nos números literais para //calcular usando pontos flutuantes, senão ele faz //divisão inteira 9/5 = 1, o que não queremos. //Depois é só usar casting para inteiro (int): int f= (int)((9.0/5.0) * graus ) + 32; return f; } Fora isso tem problemas nos seus while(j=0) pois o operador com 1 único = é o operador de atribuição, ou seja j=0 está guardando o valor 0 na variável j, o operador de comparação de igualdade é o ==. while(j==0){ Mas esses while nem deveriam existir, são desnecessários, retire esses while e simplesmente use matriz[ i ][0] e matriz[ i ][1]. int grau=i; matriz[i][0]= grau; matriz[i][1]= transformando(grau); e printf ("%i %i\n", matriz[i][0], matriz[i][1]);
  11. Use ponteiros nos parâmetros pos_maior e pos_menor da função, e passe as referências das variáveis no main() quando chamar esta função. Assim toda alteração que fizer dentro da função no local apontado pelos ponteiros vai estar modificando os valores das variáveis fora da função, no escopo onde a função foi chamada. #include <stdio.h> #include <string.h> #define NCLI 3 struct cadastro { char nomes[30], escolaridade[30]; float renda; }; typedef struct cadastro TipoCliente; void flush_stdin(){ int c; while((c = getchar()) != '\n' && c != EOF); } int Le_Vetores(TipoCliente cliente[NCLI]) { int num=0; int i; for(i=0; i<NCLI; i++) { printf("\nDigite o nome: "); scanf("%30[^\n]", cliente[i].nomes); flush_stdin(); printf("\nDigite o nivel de escolaridade > 'fundamental', 'media' ou 'superior': "); scanf("%30s", cliente[i].escolaridade); flush_stdin(); printf("\nDigite a renda mensal: "); scanf("%f", &cliente[i].renda); flush_stdin(); num++; } return (num); } int Renda_Superior_5000(TipoCliente cliente[NCLI], int num, char nomes_5mil[NCLI][30]) { int cont=0; int i; for(i=0; i<num; i++) { if (cliente[i].renda > 5000 && strcmp(cliente[i].escolaridade,"media")==0) { strcpy(nomes_5mil[cont],cliente[i].nomes); cont++; } } return (cont); } void Exibe_Nomes(char nomes_5mil[NCLI][30], int cont) { int j; for(j=0; j<cont; j++) { printf("\nO nome do cliente acima de 5mil e escolaridade media: %s", nomes_5mil[j]); } } void Maior_Menor_Renda(TipoCliente cliente[NCLI], int num, int *pos_maior, int *pos_menor) { int i; int maior = 0; int menor = 0; maior = cliente[0].renda; menor = cliente[0].renda; for(i=0; i<num; i++) { if (cliente[i].renda > maior) { maior = cliente[i].renda; *pos_maior = i; } } for(i=0; i<num; i++) { if (cliente[i].renda < menor) { maior = cliente[i].renda; *pos_maior = i; } } } int main() { TipoCliente cliente[NCLI]; int numcli; int pos_maior, pos_menor; char nomes_5mil[NCLI][30]; int cont; numcli = Le_Vetores(cliente); cont = Renda_Superior_5000(cliente, numcli, nomes_5mil); Exibe_Nomes(nomes_5mil, cont); Maior_Menor_Renda(cliente,numcli, &pos_maior, &pos_menor); printf("\nO numero de clientes cadastrados foram: %d", numcli); printf("\nO numero de clientes com RENDA MAIOR que 5 MIL -- E ESCOLARIDADE MEDIA -- : %d",cont); printf("\n\nO maior salario e: [ %d ] e o menor salario e: [ %d ]", pos_maior, pos_menor); return 0; }
  12. O problema é o "float renda[10];" dentro da struct cadastro, pois renda não deveria ser um vetor, mas sim uma variável normal "float renda;". (Também incluí uma função para substituir fflush(), e limitei os números de caracteres lidos nos scanfs de strings) #include <stdio.h> #include <string.h> #define NCLI 3 struct cadastro { char nomes[30], escolaridade[30]; float renda; }; typedef struct cadastro TipoCliente; void flush_stdin(){ int c; while((c = getchar()) != '\n' && c != EOF); } int Le_Vetores(TipoCliente cliente[NCLI]) { int num=0; int i; for(i=0; i<NCLI; i++) { printf("\nDigite o nome: "); scanf("%30[^\n]", cliente[i].nomes); flush_stdin(); printf("\nDigite o nivel de escolaridade > 'fundamental', 'media' ou 'superior': "); scanf("%30s", cliente[i].escolaridade); flush_stdin(); printf("\nDigite a renda mensal: "); scanf("%f", &cliente[i].renda); flush_stdin(); num++; } return (num); } int Renda_Superior_5000(TipoCliente cliente[NCLI], int num, char nomes_5mil[NCLI][30]) { int cont=0; int i; for(i=0; i<num; i++) { if (cliente[i].renda > 5000 && strcmp(cliente[i].escolaridade,"media")==0) { strcpy(nomes_5mil[cont],cliente[i].nomes); cont++; } } return (cont); } void Exibe_Nomes(char nomes_5mil[NCLI][30], int cont) { int j; for(j=0; j<cont; j++) { printf("\nO nome do cliente acima de 5mil e escolaridade media: %s", nomes_5mil[j]); } } void Maior_Menor_Renda(TipoCliente cliente[NCLI], int num, int pos_maior, int pos_menor) { int i; int maior = 0; int menor = 0; maior = cliente[0].renda; menor = cliente[0].renda; for(i=0; i<num; i++) { if (cliente[i].renda > maior) { maior = cliente[i].renda; pos_maior = i; } } for(i=0; i<num; i++) { if (cliente[i].renda < menor) { maior = cliente[i].renda; pos_maior = i; } } } int main() { TipoCliente cliente[NCLI]; int numcli; int pos_maior, pos_menor; char nomes_5mil[NCLI][30]; int cont; numcli = Le_Vetores(cliente); cont = Renda_Superior_5000(cliente, numcli, nomes_5mil); Exibe_Nomes(nomes_5mil, cont); Maior_Menor_Renda(cliente,numcli, pos_maior, pos_menor); printf("\nO numero de clientes cadastrados foram: %d", numcli); printf("\nO numero de clientes com RENDA MAIOR que 5 MIL -- E ESCOLARIDADE MEDIA -- : %d",cont); printf("\n\nO maior salario e: [ %d ] e o menor salario e: [ %d ]", pos_maior, pos_menor); return 0; }
  13. Primeiro tem que incluir a biblioteca stdbool.h, e aí é possível usar o tipo bool e os valores true (=verdadeiro) e false (=falso) no programa. E as variáveis do tipo bool armazenam isto os valores verdadeiro ou falso. #include <stdio.h> #include <stdbool.h> int main() { bool continuar = true; int i = 0; while(continuar) { printf("Verdadeiro\n"); i++; if(i>2) continuar = false; } return 0; }
  14. Poderia colocar uma variável no while ao invés de True, e fazer o valor da variável mudar dependendo para False dentro do ciclo dependendo de alguma condição. Por exemplo: print('não use virgula e sim o ponto nas notas com numeros decimais') f = int (input ('\nmedia da escola ') ) continuar = True while continuar: b = float (input ('\nnota 1 ') ) c = float (input ('\nnota 2 ') ) d = float (input ('\nnota 3 ') ) e = float (input ('\nnota 4 ') ) g = (b + c + d + e) / 4 print('\nsua media foi ', round(g,1)) if g >= f: print('Você foi aprovado\n') else: print('Você foi reprovado\n') if (input('Deseja continuar (S/N)? ')).upper() == 'N': continuar = False Usar .upper() em uma string transforma as letras da string em letras maiúsculas, assim não importa se o usuário digitar 'n' ou 'N' a condição vai ser satisfeita.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×