Ir ao conteúdo

Posts recomendados

Postado

Boa tarde.

Estou resolvendo o seguinte exercício.

 

Faca um programa para ler uma tabela contendo os nomes dos alunos de uma turma de 5 alunos. O programa deve solicitar ao usuário os nomes do aluno, sempre perguntando se ele deseja inserir mais um nome na lista. Uma vez lidos todos os alunos, o usuário ira indicar um nome que ele deseja verificar se esta presente na lista, onde o programa deve procurar pelo nome (ou parte deste nome) e se encontrar deve exibir na tela o nome completo e o índice do vetor onde esta guardado este nome.

 

Desenvolvi o algoritmo que segue. Só compilei, ainda não testei, tenho medo porque antes de chegar a esse resultado fiquei travado umas 2x e tive que começar do zero. Mais tarde volto e seria muito bom se já soubesse onde esta errado.Isso economiza um tempão. Segue script.

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

void main(void){
char alunos[5][30]; //lista de alunos de ate trinta caracteres
char cont=' '; //variavel para validar se continua ou nao
char nome_proc[30];//String a procura
int tam=0;

    printf("Digite o nome dos alunos ");

    for(int x=0;x<4;x++){ //Preencher lista alunos
    scanf("%s",&alunos[x]);
    cont=' ';
    printf("Deseja continuar inserindo nomes?(S/N)");
    scanf("%c",&cont);
        if (cont=='N'){ //Se não quzer preencher mais retorna 0 e passa para proxima instrução
            break;
        }
    }
    printf("Digite o nome que esta procurando: "); //Preenche votor com palvra que esta procurando
    scanf("%s",&nome_proc);

    for (int x=0;nome_proc[x]!='\0';x++){ //calcula o tamanho da string procurada, como a pesquisa pode ser feita por trechos o \0 não funcina
        tam=x;
        }

    for (int x=0;x<5;x++){  //Percorre coluna do vetor alunos
        for (int y=0;y<29;y++){ //percorre linha do vetor alunos
            int igual=0; //variavel booleana, se for diferentes
                for(int z=tam;z>tam;z--){ //percorre vetor da palavra que esta procurando
                if (nome_proc[z]==alunos[x][y]){ //verifica se os valores das posiçoes são iguais, iniciando com o valor maximo da palavra procurada e termina a pesquisa com valor min
                    while(z>0){
                        if(nome_proc[z]!=alunos[x][y]){
                            break;
                        }
                    }
                 printf("Nome completo: %s\n",alunos[x]);
                 printf("O indice %i",x);
                }
            }
        }
    }
}

 

  • Curtir 1
Postado

Desculpa a demora, estão trocando a fiação dos postes, fiquei sem internet.

 

Olá novamente Srs.

Consegui fazer ficou da maneira que segue abaixo...

Tenho algumas duvidas.

1- Porque a linguagem C interpreta o espaço " " como final de string ? Resolvi esse problema colocando underline "_" no lugar do espaço. Existe uma maneira simples de contornar esse problema colocando o espaço genuinamente?

2- Se fosse o caso de saber o lugar exato onde encontrou a palavra (índice da linha e índice coluna), existe uma maneira fácil de fazer isso?

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


void main(void){
    char alunos[5][30];
    char nome_procura[30];
    char perg;
    int loop=0;
    char *retorno;

    for(int x=0;x<5;x++){
       if(loop==0){
        printf("Digite os nomes dos alunos: \n");
        scanf("%s",&alunos[x]);
        fflush(stdin);
        if (x<4){
        printf("Deseja continuar inserindo nomes ? (S/N)\n");
        scanf("%c",&perg);
        fflush(stdin);

        if (perg ==('n' ||'N'))
            loop=1;
        }
      }
    }
    printf("Qual nome está procurando ?\n");
    scanf("%s",&nome_procura);
    fflush(stdin);
    for (int x=0;x<4;x++){
        if((retorno=strstr(alunos[x],nome_procura))!=NULL){
            printf("Nome completo : %s\n",alunos[x]);
            printf("O nome esta guardado na posicao: %d na lista",x);
            }
        }
    }

 

Postado

O problema não é o scanf, mas sim o especificador escolhido.

 

O especificador %s espera que sejam lidos caracteres até encontrar um caractere vazio (espaço, tabulação ou nova linha), logo lê apenas 1 palavra, o que em muitas situações é conveniente.

 

O especificador %[ é o especificador para selecionar quais caracteres podem ser capturados, ou que não podem ser capturados, na string digitada no terminal pelo usuário.

 

No %[^\n], o ^ logo após o colchetes indica que nos próximos caracteres estaremos indicando caracteres que não devem ser capturados, nesse caso está dizendo que não deve capturar o caractere nova linha '\n', então como apenas o caractere nova linha não deve ser capturado o comando pode capturar todos os outros caracteres que forem digitados (inclusive espaços e tabulações). Resultando, que %[^\n] é útil para capturar frases inteiras, e não apenas palavras.

  • Curtir 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!