Ir ao conteúdo
  • Cadastre-se

C exercicio de string em C


Tozzi22

Posts recomendados

Olá, alguém poderia me ajudar com um exercício de strings?

 

Escreva um programa que receba um valor N> 0 que indica a quantidade de
produtos eletrônicos. Em seguida, peça ao usuário para fornecer os nomes desses dispositivos N> 0
e contar quantos desses nomes são iguais, independentemente de serem escritos em letras
maiúsculas ou minúsculas. O programa termina quando um dos nomes recebe o valor 0 (zero).

Link para o comentário
Compartilhar em outros sites

@Tozzi22    para pegar o nome dos dispositivos você pode usar a função fgets , e para comparar se os nomes são iguais um com o outro e se é o número zero , você usa a função strcmp , da biblioteca

#include <string.h>

, mas para isso precisa remover o newline que o fgetrs pega na hora da leitura do teclado ,  e depois que você fizer um código sobre esse exercício , poste ele aqui e ajudaremos caso precise de alguma correção   . 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Tozzi22 Se N tiver uma quantidade limite, vai ser mais fácil e você pode fazer algo assim na declaração da lista de produtos,

char produtos[40][20];

 

Aí no caso seria um código de no máximo 40 produtos de até 20 letras cada (Mas se a quantidade não tiver limite, terá que fazer alocação dinâmica).

 

O enunciado não especifica, mas parece que na contagem tem que desconsiderar as posições do produto no vetor que já foram contabilizadas e testadas como iguais uma vez.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Oi @Tozzi22 uma maneira de pensar o problema é que cada NOVO aparelho na lista tem uma posição única no vetor de "strings", que se identifica na memória pelo índice.

 

Um segundo vetor de tipo inteiro com mesmo número de posições que o vetor de "strings" guarda as ocorrências (repetições) a cada entrada. Se identificar a entrada como uma repetição, incrementa o valor no vetor de ocorrências com mesmo índice do nome que já existe na matriz de "strings".

 

Nesse ponto, tem todas as entradas e o vetor de ocorrências terminados e com essa informação pode fazer o que pede o enunciado; por exemplo, eu pedi para meus alunos a exibição de um histograma (gráfico) de frequência.

 

***MAS, o enunciado acredito que quer a soma dos valores no vetor de ocorrências.

 

 

  

 

Link para o comentário
Compartilhar em outros sites

@devair1010 @Midori @mauro_b

entao, estou usando a a funcao fgets e usando strncmp pra comparar, mas nao sei se estou fazendo certo, estou tentendo colocar cada produto inserido em uma linha de uma matriz, e comparando as linhas da matriz, mas nao esta dando certo, talvez o jeito q eu pensei esteja errado.

 

 

#include <stdio.h>
#include <string.h>
#define TAM 50

int main()
{
    int n=0, i=0, j=0, k=0, m=1, iguais=0;
    char disp[TAM], mat[TAM][TAM];

    printf("INDIQUE A QUANTIDADE DE PRODUTOS ELETRONICOS: \n");
    scanf("%d",&n);
    printf("DIGITE O NOME DE CADA UM DOS DISPOSITIVOS\n");

    for(i=0;i<n;i++){
        fflush(stdin);
        printf("DIGITE O NOME DO DISPOSITIVO %d\n",m);
        fflush(stdin);
        fgets(disp, TAM, stdin);
        m++;
        for(j=0;j<TAM;j++)
            mat[i][j]= disp[j];
        if(disp[1]==0)
            i=50;
    }
    for(i=0;i<TAM;i++)
            for(j=0;j<TAM;j++){
                    
                          int ret = strncmp(mat[i], mat[j], TAM);
                          if(ret==0)
                            iguais++;
                }

    printf("\n%d",iguais);

    return 0;
}
 

Link para o comentário
Compartilhar em outros sites

@Tozzi22 Eu direi agora o que estou vendo, e que talvez você queira melhorar.

 

1 hora atrás, Tozzi22 disse:

printf("INDIQUE A QUANTIDADE DE PRODUTOS ELETRONICOS: \n");
 scanf("%d",&n);

 

Conforme enunciado o número de descrição (nomes) de aparelhos é definido pelo usuário. Digamos que sou o usuário e minha resposta a essa solicitação é: 51.

 

Na pior hipótese. os 51 nomes diferem, não tem nenhuma repetição entre eles, todos são NOVOS,

*** MAS, a capacidade da matriz é de 50 nomes, com isso é provável que o programa trave, e no pior momento, logo no fim do trabalho, após digitar 51 aparelhos.

>.<

 

Tenha um processo chamada alocação dinâmica que @Midori menciona, e que resolve o problema de tamanhos definidos em tempo de execução. 

 

 

Esse é o primeiro problema que talvez queira começar resolvendo.

Link para o comentário
Compartilhar em outros sites

@Tozzi22 Para contar acho melhor colocar um loop dentro do outro, onde o mais interno vem logo após a entrada do nome e tem o incremento dos nomes iguais. Acredito essa contabilização deve desconsiderar os índices iguais, então o critério que valida a repetição seria assim,

 

int repete = (
    (strcmp(produto[i], produto[j]) == 0) && (i != j)
);

 

E na contagem pode ser usado um vetor auxiliar para guardar as ocorrências já calculadas. A contagem dos iguais ficaria assim,

int contou[MAX] = {0};
...
if(repete){
    if(!contou[i] && !contou[j]){
        iguais += 2;
    }
    if(contou[i] ^ contou[j]){
        iguais += 1;
    }
    contou[i] = contou[j] = 1;
}

 

O incremento de 2 é na primeira ocorrência do número repetido da posição. Então para esta lista p.ex,  a quantidade ficaria = 5 (dos nomes repetidos: A = 3 e C = 2,

char produto[MAX][MAX] = {"A", "B", "C", "A", "D", "E", "A", "C"};

 

Link para o comentário
Compartilhar em outros sites

@Tozzi22 Imagino que você resolveu o problema do tamanho dinâmico do vetor...

Disso parte para preencher o vetor de produtos com nomes deles.

 

9 horas atrás, Tozzi22 disse:









printf("DIGITE O NOME DE CADA UM DOS DISPOSITIVOS\n");
for(int i= 0; i < n; i++ ){
        //fflush(stdin);
        printf("DIGITE O NOME DO DISPOSITIVO %d\n",m);
        //fflush(stdin);
        fgets( disp, TAM, stdin );
        m++;
        for(int j= 0; j < TAM; j++ ){
                mat[i][j]= disp[j];
        }
        if(disp[1] == 0){ i= 50;
        }
}

 

Perceba que pode está copiando um dispositivo que já existe, ou seja, não é NOVO. Contudo, na sua lógica primeiro você captura os nomes e depois faz a contagem no processo das comparações, isso pode funcionar.

 

 Pode incluir nesse processo os caracteres já convertidos para MAISÚSCULAS ou minusculas, conforme o enunciado 

Em 02/05/2021 às 22:20, Tozzi22 disse:

independentemente de serem escritos em letras
maiúsculas ou minúsculas

a diferença entre dois nomes pode ser só a caixa da letra? Penso que não.

 

 

Finalize o ‘loop’ antes de copiar "0" para matriz, aproposito, o primeiro caractere de uma ‘string’ fica no índice 0.

Ahh, 0 não é '0', portanto quando comparar o primeiro caractere da ‘string’ compare com '0'. E não é para comparar com '\0' só poque mat[1] == 0 quando entrar com 0 kkkk, penso que mat[1] == '\n'

Tem pergunta?

 

EDIT

9 horas atrás, mauro_b disse:

Um segundo vetor de tipo inteiro com mesmo número de posições que o vetor de "strings" guarda as ocorrências (repetições) a cada entrada. Se identificar a entrada como uma repetição, incrementa o valor no vetor de ocorrências com mesmo índice do nome que já existe na matriz de "strings".

 

 

Se identificar a entrada como uma repetição, incrementa o valor no vetor de ocorrências com mesmo índice do nome que já existe na matriz de "strings" E NÃO INSERE a entrada NA MATRIZ.

Link para o comentário
Compartilhar em outros sites

@mauro_b @Midori @devair1010

Pessoal, muito obrigado pela ajuda de vcs, consegui fazer o exercicio!

 

 

#include <stdio.h>
#include <string.h>
#define TAM 50

int main()
{
    int n=0, i=0, j=0, iguais=0,ret=0;
    char disp[TAM], mat[TAM][TAM], zero[TAM]="0";

    printf("INDIQUE A QUANTIDADE DE PRODUTOS ELETRONICOS: \n");
    scanf("%d",&n);
    printf("DIGITE O NOME DE CADA UM DOS DISPOSITIVOS\n");

    for(i=0;i<n;i++){
        fflush(stdin);
        printf("DIGITE O NOME DO DISPOSITIVO %d\n",i+1);
        fgets(mat[i], TAM, stdin);
        fflush(stdin);
        mat[i][strlen(mat[i])-1]='\0';
        ret=strcasecmp(mat[i],zero);
        if(ret==0)
           i=n;
    }
    for(i=0;i<n;i++)
        for(j=0;j<n;j++){
            if(i!=j){
                ret=strcasecmp(mat[i],mat[j]);
                if(ret==0)
                    iguais++;

            }
        }

    printf("\n%d",iguais/2);




    return 0;
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@Tozzi22 Seu código está com o problema do buffer do input que faz pular uma entrada do fgets, quando testei foi direto para a entrada do produto 2. A função fflush não é indicada para isso e não adiantou. Eu faria  assim, veja no scanf que usei "%d%*c", isso evita o problema do buffer,

 

#include <stdio.h>
#include <string.h>

#define MAX 50

int main(){
    char produto[MAX][MAX];
    int iguais = 0;
    int n;
    
    printf("Quantidade: ");
    scanf("%d%*c", &n);
    
    for(int i = 0; i < n; i += 1){
        printf("Dispositivo [%d]: ", i + 1);
        fgets(produto[i], MAX, stdin);
        for(int j = 0; j < (i + 1); j += 1){
            int repete = !strcmp(produto[i], produto[j]);
            if(repete && (i != j)){
                iguais += 1;
            }
        }
    }
    printf("Iguais = %d\n", iguais);
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!