Binder Posted October 24, 2011 Report Share Posted October 24, 2011 Olá Pessoal, estou com uma dúvida, gostaria de saber como comparar um caracter (digitado pelo usuario) se possui no meu vetor de string.Pelo o que li a respeito a função strcmp compara apenas dois vetores ( de caracter ou inteiro)Exemplo //inteiro vet.codigo == x //string vet.nome == letra // supondo que letra esteje declarada como vetor(letra[30]).Meu código está assim:struct dados { int codigo; char nome[30]; float n1,n2;}; int main() { dados vet[100]; int ultimo=0,i; char achouletra; printf("==================\n"); printf("informe primeira letra do nome:"); scanf("%c",&achouletra); for(i=0;i<30;i++) // não sei se esse for esta correto { if(?) // como faço a comparação? { printf("codigo = %d\n",vet.codigo); printf("nome = %s\n",vet.nome); } } } Quote Link to comment Share on other sites More sharing options...
0 mJi Posted October 24, 2011 Report Share Posted October 24, 2011 (edited) Explica melhor isso ae. Se for um exercício, escreve a ordem dele, porque não deu pra entender quase nada.É pra procurar um caractere numa string? String da estrutura?Este caractere é a primeira letra da string?Tu citaste a função strcmp. Ela serve para comparar dois vetores de char, pura e simplesmente. Ou seja, não dá pra usar ela para comparar um caractere com uma string, visto que uma string é uma cadeia de caracteres, não há sentido algum.A forma mais comum de verificar se um caractere está presente numa string (e contar a frequencia com que ele aparece) é a seguinte:cont = 0; for(i=0, vet[i] != '\ 0';i++){ if(vet[i] == letra){ cont++; } } Onde: int i: variavel pras iterações do for; int cont: conta o numero de vezes que o caractere está na string. Deve ser inicializado com zero antes. char vet[] : vetor de char, ou seja, a string. É percorrida até o seu caractere nulo (até o fim); char letra: letra a ser procurada. Para aplicar este conceito aos vetores de char que estão na estrutura, não é dificil. Mesmo estando dentro da estrutura, continuam sendo vetores. Caso tu possa utilizar funções da biblioteca <string.h>, há várias que dizem respeito á busca de caracteres em strings. Poupa ter que percorrer as string, como fiz acima. Sobre o código que tu postou, se tu quiser declarar uma variavel do tipo de uma estrutura, a declaração correta é com a palavra 'struct' precedendo o nome da mesma e da variavel. Exemplo: struct dados { int codigo; char nome[30]; float n1,n2; }; int main(){ struct dados vet[100]; ....... Se tu quiseres suprimir a declaração com 'struct', pode utilizar um typedef: typedef struct { int codigo; char nome[30]; float n1,n2; } dados; int main(){ dados vet[100]; ............ Edited October 24, 2011 by mJi Quote Link to comment Share on other sites More sharing options...
0 Binder Posted October 24, 2011 Author Report Share Posted October 24, 2011 Olá mJi,primeiramente obrigado por responder a minha dúvida, e peço desculpas por não ser tão claro quanto a mesma.Vou explicar maisdetalhamente. Preciso criar um programinha em C, com menus(coforme abaixo). Porém não estou conseguindo fazer os itens 7 e 8 do Menu.Como está usando struct(estruturas) estou tendo uma certa dificuldade para fazer o FOR.Segue abaixo meus códigos da opção 7 e 8.Desde já Agradeço pela ajuda.Obs: Não posso utilizar funções do C "prontas". A variavel "ultimo" serve para percorrer o vetor apenas até a onde estiver preenchidocomo ele é de 100 posiçoes, se eu preencher apenas 3 vezes, o laço FOR vai de 0 até 2, e não até o final do vetor. ================opção 7: pede para localizar o nome no meu vetor, pela letra inicial que o usuario irá digitar.Ex: "informe a letra" : 'a'. Todos nomes que começam com a letra 'a', deve ser localizado no meu vetor de char.Não estou conseguindo fazer a busca.opção 8: pede para localizar nome conforme a letra digitada pelo usuario.Independente da posição que ela está.Ex: "Informe a letra" : 'a'. Vetor [maria].Achou a letra'a' na primeira(em c++ comeca com 0) e na ultima posição.#include<stdio.h>#include<stdlib.h>#include<string.h>struct dados { int codigo; char nome[30]; float g1,g2;}; int main() { dados vet[100]; int op=0,ultimo=0,i,achoucodigo=0,achou=0,x,resultado,j,auxcodigo; char achounome[30],achouletra,letra,auxnome[30]; float media=0; printf("\n==========================================MENU=================================\n"); printf("1-Cadastrar aluno: \n"); printf("2-Listar todos alunos: \n"); printf("3-Listar aluno de codigo igual a: \n"); printf("4-Listar aluno acima da media 6: \n"); printf("5-lançar notas do aluno de codigo: \n"); printf("6-Listar aluno de nome igual a: \n"); printf("7-Listar alunos que iniciam com a letra: \n"); printf("8-Listar alunos que possua a letra...nome: \n"); printf("9-Ordenar os alunos pelo codigo: \n"); printf("10-Ordenar os alunos pelo nome: \n"); printf("11-Listar alunos de maior media: \n"); printf("12-Listar alunos que possuam g1 ou g2 no intervalo de notas entre: \n"); printf("13-Sair\n\n\n"); scanf("%d",&op);Opção 7: if(op==7) { printf("==================\n"); printf("informe primeira letra do nome:"); scanf("%c",&achouletra); for(i=0;i<30;i++) { //if(?) { printf("codigo = %d\n",vet.codigo); printf("nome = %s\n",vet.nome); } } } Opção 8: if(op==8) { printf("==================\n"); printf("informe letra do nome que deseja encontrar:"); scanf("%c",&letra); for(i=0;i<ultimo;i++) { if(letra == i) { printf("codigo = %d\n",vet.codigo); printf("nome = %s\n",vet.nome); } } } Quote Link to comment Share on other sites More sharing options...
0 mJi Posted October 24, 2011 Report Share Posted October 24, 2011 (edited) Opa, obrigado por especificar melhor.Na opção 7, você deve percorrer todas as estruturas do tipo 'dados', e procurar nos vetores de char 'nome' o primeiro caractere (nome[0]). Se encontrar algum que bata com o caractere digitado pelo usuario, imprime na tela.Siga esta logica:for(i=0;i<ultimo;i++){ if(vet[i].nome[0] == achouletra){ printf("%s\n", vet[i].nome); } } Interpretando: Percorre o vetor de dados atéo ultimo (como tu disseste), e se nome[0] for igual ao caractere pedido pelo usuario, imprime o nome. Na opção 8, a técnica é a mesma. Como tu não pode utilizar funções prontas (há uma função para esta tarefa), terás de percorrer cada estrutura de dados do vetor e também percorrer os nomes. Eis uma solução: for(i=0;i<ultimo;i++){ for(j=0;vet[i].nome[j] != '\ 0';j++){ if(vet[i].nome[j] == achouletra){ printf("%s\n", vet[i].nome); break; } } }Interpretando:Percorre cada nome de cada estrutura existente (até 'ultimo') até o caractere '\ 0' (este fórum esconde o \ 0, então coloquei um espaço entre a barra e o zero, mas na hora de compilar, junte-os).Se encontrar o caractere no nome, imprime o nome e para de percorrer tal nome para passar para o nome da próxima estrutura. Não é necessário continuar a percorrer o nome se já achou a letra, não é mesmo?O 'break' este loop que percorre o nome pare.Não testei mas acredito que dê certo. Caso não der, siga a lógica que é mais ou menos por ae.Ah, e ao postar códigos, coloque-os entre as tags de código: Edited October 24, 2011 by mJi Quote Link to comment Share on other sites More sharing options...
0 Binder Posted October 25, 2011 Author Report Share Posted October 25, 2011 (edited) Obrigado mJi, funcionou perfeitamente os códigos citados. Abraço! Edited October 25, 2011 by Prog_Junior Quote Link to comment Share on other sites More sharing options...
Question
Binder
Olá Pessoal, estou com uma dúvida, gostaria de saber como comparar um caracter (digitado pelo usuario) se possui no meu vetor de string.
Pelo o que li a respeito a função strcmp compara apenas dois vetores ( de caracter ou inteiro)
Exemplo
//inteiro
vet.codigo == x
//string
vet.nome == letra // supondo que letra esteje declarada como vetor(letra[30]).
Meu código está assim:
struct dados {
int codigo;
char nome[30];
float n1,n2;
};
int main() {
dados vet[100];
int ultimo=0,i;
char achouletra;
printf("==================\n");
printf("informe primeira letra do nome:");
scanf("%c",&achouletra);
for(i=0;i<30;i++) // não sei se esse for esta correto
{
if(?) // como faço a comparação?
{
printf("codigo = %d\n",vet.codigo);
printf("nome = %s\n",vet.nome);
}
}
}
Link to comment
Share on other sites
4 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.