vetores

1. vetores

marcos jose moreira
marcosredes

(usa Debian)

Enviado em 27/11/2018 - 09:34h

Fazer um programa que cadastre o número de dez portas de redes (não permite entrada de portas
repetidas) e o seu respectivo serviço em dois vetores distintos. Depois permita ao usuário digitar o
número da porta, verifica se o número existe ou não. Caso exista, emita na tela o serviço
disponibilizado pela porta, caso contrário, emita a mensagem "Porta não cadastrada". Comentar o
código de acordo com as regras de algoritmo estudadas em sala de aula.



alguem pra me ajudar a melhora-lo
#include<stdio.h>
#include<locale.h>
#define tam 10

int main()
{

int portas[tam],ptaux,achou,i,j,ptachada,ptsolicitada;
char servicos[tam] [150];
ptaux = 0;
achou=0;
ptachada = 0;
ptsolicitada = 0;
j = 0;
setlocale(LC_ALL,"");
while(j< tam)
{
printf("\n Digite uma porta:\n");
scanf ("%d",& ptaux);

for(i=0;i<tam;i++)
{//comparação para saber se existe porta repetida
if(ptaux==portas[i])
{//caso exista a varivael achou muda para valor 1 emite a mensagem de porta repetida
achou=1;
printf("Porta repetida digite novamente:\n");
}
}

if(achou==0)
{//caso não seja porta repetida ela é armazenada e perguntado o tipo de serviço da porta
portas[j] =ptaux;

printf("Digite o nome do servico:\n ");
scanf ("%s", & servicos[j]);

j++;
}

achou=0;
}

while(1)
{ //local onde é feita a busca de portas já cadastradas ou não
printf("Digite uma porta a ser verificada sua existencia:\n ");
scanf ("%d", & ptsolicitada);

for(i=0;i<tam;i++)
{//laço de repetição


if(ptsolicitada == portas[i])
{//caso porta ja cadastrada o dado entra na condição
printf("Porta %d já está cadastrada :\n", portas[i]);
printf("A porta e possui o serviço (%s) :\n", servicos[i]);
ptachada = 1;
}
}

if(ptachada == 0)
{//caso porta não cadastrada é emetida a mensagem
printf("Porta não cadastrada :\n");
}

ptachada=0;

}

return (0);
}



  


2. Re: vetores

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/11/2018 - 10:34h

marcosredes escreveu:

alguem pra me ajudar a melhora-lo
#include<stdio.h>
#include<locale.h>
#define tam 10


Em C, quando você tem constantes definidas por meio de macros, é usual que todas as letras do nome da macro sejam maiúsculas.

Não é obrigatório, mas é uma convenção seguida universalmente, com raras exceções. Sendo assim, eu recomendo que você também a siga.


int main()


Como o código é em C, então essa forma de declarar main() é obsoleta. Na prática, ela significa que a função pode receber qualquer quantidade de argumentos de quaisquer tipos.

As forma prescritas pelo padrão são duas, a saber:

  • Se você não tiver interesse em receber argumentos pela função, ela deve ser declarada como “int main(void)”, que sintaticamente impede que se chame a função com argumentos.

  • Se você quiser receber argumentos, tais argumentos devem ser passados na forma de série lista de strings. Nesse caso, a função deve ter uma declaração compatível com “int main(int argc, char **argv)”, em que argc é um valor que informa a quantidade de argumentos e argv é um vetor com argc elementos que são ponteiros para as strings correspondentes a cada elemento (e mais um (argc+1)-ésimo elemento que é um ponteiro nulo, que é uma outra maneira de indicar o final da lista de elementos). Além disso, por convenção, o primeiro argumento, argv[0], traz uma representação do nome usado para invocar o programa.

{

int portas[tam],ptaux,achou,i,j,ptachada,ptsolicitada;
char servicos[tam] [150];
ptaux = 0;
achou=0;
ptachada = 0;
ptsolicitada = 0;
j = 0;


Eu suspeito que você poderia reduzir a quantidade de variáveis ou, no mínimo, mover algumas delas para dentro dos blocos em que elas serão relevantes.

	setlocale(LC_ALL,"");
while(j< tam)


Creio que aqui, um laço de repetição com for seria mais próximo do que se esperaria encontrar. Nem sempre é possível, mas quando o é, eu acho interessante ter num só lugar toda a informação sobre o controle da repetição, em vez de ter a inicialização num lugar, a condição de controle em outro, e a forma de progressão num terceiro ponto.

	{
printf("\n Digite uma porta:\n");


“Uma porta” é um tanto vago, não acha? Não está claro que o que ele tem de digitar é um número. Seria melhor dar ao usuário mais dicas de sobre como proceder, bem algum sentimento de quanto trabalho ele tem pela frente e quanto ele já realizou.
		printf("Digite o %dº (de um total de %d) número de porta de rede: ", j+1, max); 


		scanf ("%d",& ptaux); 


Hoje em dia, alguns sistemas alarmam quando você faz uma operação de leitura com scanf() e não testa se a leitura foi bem-sucedida. Isso é relevante porque quando scanf() falha por algum motivo, o argumento que foi(ram) destino(s) da leitura(s) pode(m) ficar com valor(es) indefinido(s), prejudicando a computação seguinte, e também porque o dado recusado por scanf() não é removido da entrada, podendo impactar negativamente todas as operações de entrada de dados posteriores.

Assim sendo, habitue-se a usar construções mais ou menos como o seguinte.
result=scanf("%d", &porta);
// ‘result’ vai receber o número de elementos convertidos com sucesso.
// como você pediu uma conversão, esse valor tem de ser igual a 1, ou
// a operação terá falhado. Em particular, se o resultado for ‘EOF’ (-1),
// o que se tem é um erro de leitura em nível de sistema. Se o resultado
// for 0, significa que o usuário digitou alguma coisa inválida.
if(result==EOF){
// Procedimento em caso de erro de leitura em nível de sistema.
}
else if(result!=1){
// Procedimento em caso de entrada inválida. Possivelmente você vai
// querer tirar o dado inválido do buffer e pedir ao usuário que repita a
// repita a operação.
}
else {
// Leitura bem sucedida.
}


		
for(i=0;i<tam;i++)


Aqui você provavelmente não deveria usar tam, mas sim j.

Do jeito como está no seu código original, você vai comparar com portas que ainda não foram digitadas, num array cujos elementos ainda não explicitamente definidos têm valores indeterminados (porque alocado em memória automática, que pode ter sido usada anteriormente para outra finalidade). Isso pode até levar a uma situação em que a primeira porta digitada já dá erro de ser uma porta repetida, o que aconteceria se o valor ainda indeterminado contido em portas[0] calhasse de ser igual ao primeiro valor digitado.

		{//comparação para saber se existe porta repetida
if(ptaux==portas[i])
{//caso exista a varivael achou muda para valor 1 emite a mensagem de porta repetida
achou=1;
printf("Porta repetida digite novamente:\n");
}
}

if(achou==0)
{//caso não seja porta repetida ela é armazenada e perguntado o tipo de serviço da porta
portas[j] =ptaux;

printf("Digite o nome do servico:\n ");
scanf ("%s", & servicos[j]);


Aqui não cabe usar o operador &, porque servicos[j] já é (convertido automaticamente em) um ponteiro para caracteres, que é justamente o que a conversão "%s" indica que scanf() deve receber. (Se você usar &, como fez, o tipo do ponteiro resultante será um ponteiro para o array inteiro, tomado como uma única unidade de dados).

Fora isso, considere usar outra forma de ler strings, que lhe permita ler espaços, por exemplo, mas principalmente que impeça a leitura de usar mais caracteres do que o espaço reservado no array

			
j++;
}

achou=0;
}

while(1)
{ //local onde é feita a busca de portas já cadastradas ou não
printf("Digite uma porta a ser verificada sua existencia:\n ");
scanf ("%d", & ptsolicitada);

for(i=0;i<tam;i++)
{//laço de repetição


if(ptsolicitada == portas[i])
{//caso porta ja cadastrada o dado entra na condição
printf("Porta %d já está cadastrada :\n", portas[i]);
printf("A porta e possui o serviço (%s) :\n", servicos[i]);
ptachada = 1;
}
}

if(ptachada == 0)
{//caso porta não cadastrada é emetida a mensagem

			printf("Porta não cadastrada :\n");
}

ptachada=0;

}

return (0);


O comando return não exige parênteses. Você pode muito bem dizer apenas “return 0;

} 


Fora os comentários acima, ajudaria de modo geral se você arrumasse a indentação do código.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts