Dúvida sobre estruturas em C++

Caveira

Power Member
Oi pessoal, tenho o seguinte array em c++:

struct meses {
int n, ndias;
char nome[10];
} mes[12];

é um array com 12 estruturas, cada uma com o número do mês, o número de dias do mês e o nome do mês.

strcpy(mes[0].nome, "Janeiro");
strcpy(mes[1].nome, "Feveiro");
strcpy(mes[2].nome, "Março");
strcpy(mes[3].nome, "Abril");
strcpy(mes[4].nome, "Maio");
strcpy(mes[5].nome, "Junho");
strcpy(mes[6].nome, "Julho");
strcpy(mes[7].nome, "Agosto");
strcpy(mes[8].nome, "Setembro");
strcpy(mes[9].nome, "Outubro");
strcpy(mes[10].nome, "Novembro");
strcpy(mes[11].nome, "Dezembro");

Agora eu queria que o utilizador introduzisse o nome do mês e depois o programa descobrisse o número do mês. Ou seja, descobrir x onde:
mes[x].nome = "nome introduzido pelo utilizador"

Espero que me esteja a fazer entender. Isto é para um trabalho de bases de programação. Obrigado por qualquer ajuda!
 
Em C ficaria:

Código:
int i,numero;
for (i=0;i<12;i++)
    if (strcmp(mes[i].nome,[COLOR=Red]mesIntroduzido[/COLOR])==0)
        numero=i+1;

onde mesIntroduzido seria o mês pelo qual estarias a procurar e numero seria o nº do mês em questão que pode ser obtido através do índice do array.
 
Oi pessoal, tenho o seguinte array em c++:



é um array com 12 estruturas, cada uma com o número do mês, o número de dias do mês e o nome do mês.



Agora eu queria que o utilizador introduzisse o nome do mês e depois o programa descobrisse o número do mês. Ou seja, descobrir x onde:
mes[x].nome = "nome introduzido pelo utilizador"

Espero que me esteja a fazer entender. Isto é para um trabalho de bases de programação. Obrigado por qualquer ajuda!

O método que o Baderous te disse é aquele que acho que se deve implementar para este problema. Só lhe fazia uma pequena alteração:

Código:
int i,numero;
for (i=0;i<12;i++)
    if ([COLOR=red]![/COLOR](strcmp(mes[i].nome,[COLOR=white]mesIntroduzido[/COLOR][COLOR=#ffffff]))
        numero=i+1;[/COLOR]

A função strcmp() indica que duas strings são iguais quando retorna 0 (isto acontece pois o que a função na verdade avalia é a diferença entre as duas strings).

Assim, se alguma expressão ou variável tem o valor zero, o if considera isso como FALSE, logo não se entrava dentro do corpo do if. Para contrariar isto, usa-se o operador !, que nega o valor da condição. Assim, imaginando que x=0, ao fazer !x teria-se que x=1;

Espero que tenhas compreendido a explicação.

Vá, cumps
 
O método que o Baderous te disse é aquele que acho que se deve implementar para este problema. Só lhe fazia uma pequena alteração:

Código:
int i,numero;
for (i=0;i<12;i++)
    if ([COLOR=red]![/COLOR](strcmp(mes[i].nome,[COLOR=white]mesIntroduzido[/COLOR][COLOR=#ffffff]))
        numero=i+1;[/COLOR]
A função strcmp() indica que duas strings são iguais quando retorna 0 (isto acontece pois o que a função na verdade avalia é a diferença entre as duas strings).

Assim, se alguma expressão ou variável tem o valor zero, o if considera isso como FALSE, logo não se entrava dentro do corpo do if. Para contrariar isto, usa-se o operador !, que nega o valor da condição. Assim, imaginando que x=0, ao fazer !x teria-se que x=1;

O que tu dizes está correcto mas é exactamente a mesma coisa, visto que só depois de fazeres o strcmp é que sabes o valor da expressao a ser avaliada pelo if (igual a 0 ou diferente de 0). E atenção que ser diferente de 0 não implica que seja igual a 1.
 
O método que o Baderous te disse é aquele que acho que se deve implementar para este problema. Só lhe fazia uma pequena alteração:

Código:
int i,numero;
for (i=0;i<12;i++)
    if ([COLOR=red]![/COLOR](strcmp(mes[i].nome,[COLOR=white]mesIntroduzido[/COLOR][COLOR=#ffffff]))
        numero=i+1;[/COLOR]
A função strcmp() indica que duas strings são iguais quando retorna 0 (isto acontece pois o que a função na verdade avalia é a diferença entre as duas strings).

Assim, se alguma expressão ou variável tem o valor zero, o if considera isso como FALSE, logo não se entrava dentro do corpo do if. Para contrariar isto, usa-se o operador !, que nega o valor da condição. Assim, imaginando que x=0, ao fazer !x teria-se que x=1;

Espero que tenhas compreendido a explicação.

Vá, cumps

Sera que é por isso? ou sera porque a comparação é feita com a instrução xor?
 
O que tu dizes está correcto mas é exactamente a mesma coisa, visto que só depois de fazeres o strcmp é que sabes o valor da expressao a ser avaliada pelo if (igual a 0 ou diferente de 0). E atenção que ser diferente de 0 não implica que seja igual a 1.

Certo. Mas em termos lógicos acho que sim.

Vá, cumps
 
Certo. Mas em termos lógicos acho que sim.

Vá, cumps

Exactamente pelo facto de não estares a tratar valores lógicos mas sim inteiros deveria escrever-se a condição como strcmp(...)==0, tornando o código muito mais legível.

Quando usas operações lógicas (!, &&, ||) o zero vale por falso e qualquer outra coisa, não necessariamente 1, vale por verdadeiro.
 
Última edição:
Oi pessoal, tenho o seguinte array em c++:



é um array com 12 estruturas, cada uma com o número do mês, o número de dias do mês e o nome do mês.



Agora eu queria que o utilizador introduzisse o nome do mês e depois o programa descobrisse o número do mês. Ou seja, descobrir x onde:
mes[x].nome = "nome introduzido pelo utilizador"

Espero que me esteja a fazer entender. Isto é para um trabalho de bases de programação. Obrigado por qualquer ajuda!

afinal é C++ ou C?
std::string é tua amiga!
 
Exactamente pelo facto de não estares a tratar valores lógicos mas sim inteiros deveria escrever-se a condição como strcmp(...)==0, tornando o código muito mais legível.

Quando usas operações lógicas (!, &&, ||) o zero vale por falso e qualquer outra coisa, não necessariamente 1, vale por verdadeiro.

OK, se achas que torna o código mais legível, tudo bem. Eu pessoalmente uso o operador !. É uma opção pessoal.

Cada um escolhe o código que melhor se adapta a cada um.

Vá, cumps
 
Back
Topo