Ir para o conteúdo
pr0zin

Duvidas C

Mensagens Recomendadas

pr0zin

Boas, tenho algumas duvidas basicas em C e gostava de saber se me podiam esclarecer:

a primeira e um erro num ciclo do/while

Quando eu declaro o vector o ciclo fica atrofiado e nem a opcao 0 me funciona (o break para sair do programa)

a 2 duvida esta no case 1 e 2, tenho de criar um codigo para que o programa leia um ficheiro txt e me diga quantos registos foram encontrados, para que depois com o 2 case que derivado do ficheiro txt possa os registos da primeira coluna do ficheiro txt


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

main(int argc, char *argv[])
{

int opcao, num, i , ultimo;

FILE *fp;
char nomes[5500][100];

do 
{
      		printf ("\t\t\nMENU!\n"); 
      		printf ("\t0 - Sair do Programa\n"); 
      		printf ("\t1 - Ler o ficheiro de texto\n"); 
      		printf("\t2 - Mostrar as marcas de iogurtes\n");
      		
      		fflush(stdin); /*limpar o buffer do teclado*/
		printf("\nEscolhe uma opcao: ");
      		scanf (" %c", &opcao);

	switch (opcao)
		{
			case '0': break;

			case '1':
				{
					puts("Escreva o nome do ficheiro: ");
					fscanf (stdin, " %s", &nomes);

			 	} break;


			default : printf("\n\nErro - selecionaste uma opcao invalida\n Volta a tentar\n"); break;
		}

}		
	while (opcao !='0');
	if (opcao='0') printf("Adeus!");

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

O break sai do switch, não sai do while. Se queres sair do programa, podes fazer um return. Se só queres sair do loop, utiliza uma flag.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Pontos que eu achei dignos de nota à medida que ia estudando o teu código:

1. A função main devolve um int. Especifica isso em vez de aceitares o comportamento antigo em que era tudo int

2. Nunca usas argc nem argv. Pura e simplesmente não os declares

3. A função fflush não está definida, no Standard, para "streams" de input. Arranja outra maneira de limpar o buffer do teclado se gostarias que o teu programa funcionasse em mais Sistemas Operativos além do Windows (que define o comportamento do fflush para "streams" de input)

4. No scanf pedes um char com "%c" mas passas o endereço dum int. Não faças isso. Para um int, o conversor a passar ao scanf é "%d"

5. No fscanf do case 2 tornas a especificar um tipo e um objecto diferentes. O "%s" requer um ponteiro para char, mas tu passas um ponteiro para nomes[5000][100].

6. Tens uma atribuição em vez duma comparação no último if.

7. Excepto se tiveres um compilador de C99, mete um "return 0;" antes do último } da função main.

----------------------------------------------------------------------------

Quanto às tuas dúvidas específicas:

1. Provavelmente isso acontece por causa dos tipos errados no primeiro scanf

2. no case 1 tens que abrir o ficheiro, ler as linhas para os nomes num ciclo, fechar o ficheiro; no case 2 tens que fazer printf aos nomes. Não queres o código completo, pois não?

---------------------------------------------------------------------------

Outra coisa: aumenta o nivel de warnings do teu compilador e tenta fazer "compilacoes limpas" (sem erros nem warnings).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pr0zin

Pontos que eu achei dignos de nota à medida que ia estudando o teu código:

1. A função main devolve um int. Especifica isso em vez de aceitares o comportamento antigo em que era tudo int

2. Nunca usas argc nem argv. Pura e simplesmente não os declares

3. A função fflush não está definida, no Standard, para "streams" de input. Arranja outra maneira de limpar o buffer do teclado se gostarias que o teu programa funcionasse em mais Sistemas Operativos além do Windows (que define o comportamento do fflush para "streams" de input)

4. No scanf pedes um char com "%c" mas passas o endereço dum int. Não faças isso. Para um int, o conversor a passar ao scanf é "%d"

5. No fscanf do case 2 tornas a especificar um tipo e um objecto diferentes. O "%s" requer um ponteiro para char, mas tu passas um ponteiro para nomes[5000][100].

6. Tens uma atribuição em vez duma comparação no último if.

7. Excepto se tiveres um compilador de C99, mete um "return 0;" antes do último } da função main.

----------------------------------------------------------------------------

Quanto às tuas dúvidas específicas:

1. Provavelmente isso acontece por causa dos tipos errados no primeiro scanf

2. no case 1 tens que abrir o ficheiro, ler as linhas para os nomes num ciclo, fechar o ficheiro; no case 2 tens que fazer printf aos nomes. Não queres o código completo, pois não?

---------------------------------------------------------------------------

Outra coisa: aumenta o nivel de warnings do teu compilador e tenta fazer "compilacoes limpas" (sem erros nem warnings).

obrigado, nem tinha reparado em alguns erros que mencionaste, ja corrigi grande parte :D

1- no entanto mesmo a corrigir isto o ciclo esta atrofiado ;)

2 - so qeria ter uma noçao de como fazer, nao qero qe me des o codigo :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

O que queres dizer com "atrofiado"?


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

no entanto mesmo a corrigir isto o ciclo esta atrofiado ;)

Nos cases e na condicao while estas a comparar a opcao com os caracteres '0', '1', '2', mas a variavel tem um valor de 0, 1, ou 2. Ou alteras a opcao para ser char (e voltas a por "%c" no scanf) ou alteras o valor nos cases para 0, 1, 2 ...


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pr0zin

http://imageshack.us/photo/my-images/94/erromenu.jpg/

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

main()
{

int opcao;
FILE *fp;
char leitura[30];
char *ptr = leitura;


do 
{
      		printf ("\t\t\nMENU!\n");
                printf ("\t0 - Sair do Programa\n");
                printf ("\t1 - Ler o ficheiro de texto\n");
                printf("\t2 - Mostrar as marcas de iogurtes\n");
      		

		printf("\nEscolhe uma opcao: ");
      		scanf (" %d", &opcao);

	switch (opcao)
		{
			case '0': puts("Adeus!"); exit(1); break;

			case '1':
				{

					puts("Escreva o nome do ficheiro: ");
					fscanf (stdin, " %c", ptr);

					/* Abrir o ficheiro */

					fp = fopen(ptr, "r");

					/* Fechar o ficheiro */

					fclose(fp);

			 	} break;


			default : printf("\n\nErro - selecionaste uma opcao invalida\n Volta a tentar\n"); break;
		}

}		
	while (opcao !='0');
	return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

switch (opcao) {
    case 0: //...
        break;
    case 1: //...
        break;
//....
}

Tal como o pmg disse.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Só utilizas as plicas se estiveres a utilizar um char. Como estás a utilizar um int, não colocas as plicas.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.