Ir ao conteúdo

Posts recomendados

Postado

Enunciado do exercício:

 

"Dada uma listagem contendo os nomes de vários arquivos de um determinado diretório e uma extensão, e.g., .java, .py. Escreva um programa em C que encontre o numero de arquivos na listagem que possuem aquela determinada extensão."

 

-Na entrada :

Na primeira linha haverá a listagem com os nomes dos arquivos separados por uma vírgula. Na segunda linha haverá a extensão.

-Na saída :

O numero de arquivos com a extensão.

 

Segue exemplos em anexos

 

observação o programa considera a digitação e a leitura termina com (.)

 

Não entendi o enunciado e não sei como fazer este programa !!

 

image.png

 

  • Obrigado 1
Postado

@lidy ane      creio que o usuário irá digitar uma lista com vários nomes seguidos de um ponto juntos e em seguida uma vírgula , e isso será pegado com o comando

 gets(nome);

, pois ele pega tudo que está na mesma linha até o NewLine ,  e depois que o usuário digitar todos os nomes  ele pressiona enter e digita um nome para o  tipo de arquivo  , que é um ponto seguido de um daqueles tipos , por exemplo  .java, .py , etc . . . ,  e depois comparar esse tipo com todos os nomes daquela primeira linha e ver quais são iguais , usando para isso o comando strcmp .   então faça um código sobre esse exercício e poste aqui para vermos como está e em que podemos ajudar   .

  • Curtir 1
Postado

@devair1010

 


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

int main () {
  // leitura das extenç. dos arquivos.
  char 1 = .c;
  char 2 = .java;
  char 3 = .cpp;
  char 4 = .py;
  char 5 = .jl;
  char 6 = .R;
  
  int n ; // numero de arquivos com dada extensão:

 

 

ou 

 

 

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

int main(){

FILE *arq;
// leitura das extenç. dos arquivos.
char nome, i;
arq = fopen("t1.c", "w");
arq  =fopen ("t2 . java, "w");
arq  =fopen ("t3 . cpp, "w");
arq  =fopen ("t4 . py, "w");
arq  =fopen ("t5 . jl, "w");
arq  =fopen ("t6 . R, "w");

  • Curtir 1
Postado
Em 10/06/2020 às 00:43, lidy ane disse:

Não entendi o enunciado e não sei como fazer este programa !!

 

Em 10/06/2020 às 00:43, lidy ane disse:

"Dada uma listagem contendo os nomes de vários arquivos de um determinado diretório e uma extensão, e.g., .java, .py. Escreva um programa em C que encontre o numero de arquivos na listagem que possuem aquela determinada extensão."

 

Talvez tenha superestimado esse lance de "listagem" e tal.

 

É só uma linha. Nada mais. Exagero chamar de listagem.

 

Eis o que importa: o programa vai ler uns grupos de letras, separados por ponto e virgula. Um formato conhecido, um padrão: nome do arquivo, ponto, extensão, vírgula, nome do arquivo.... até o  fim da linha.

 

scanf() foi escrita para isso: ler entrada formatada. E seria a opção séria pra escrever isso e eu iria divergir de @devair1010 

 

No entanto, como o programa é muito simples e tem só UMA linha de entrada, pode ser preciosismo se preocupar com algo mais.scanf() e extensões e arquivos e tal. Pode apenas fazer como ele sugeriu:

  • Leia a linha toda usando gets()
  • Leia a extensão na segunda linha
  • Num único loop varre a linha que leu e ao encontrar cada ponto veja se o que vem depois é a extensão que procura, e nesse caso some 1 a um contador
  • No final do loop vai sobrar o contador que é a sua resposta.
  • O exercício é muito simples: não precisa sequer listar os arquivos do tipo nem nada mais. Não perca seu tempo.

Mas se for perder tempo e fazer bonitinho use scanf() leia a entrada e liste os arquivos da extensão pedida e o total ao final. E depois tire na versão final, pois o enunciado pede só o número. Vai aprender alguns truques no caminho, por certo. Mas não é o enunciado.

 

 

  • Curtir 2
Postado

voce pode usar strstr para para saber a extensão de uma string ai usa um contador 

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


int main () {
   const char a[20] = "alunos.txt";
   const char b[10] = ".txt";
   char *ext;

   ext = strstr(a, b);

   printf("The substring is: %s\n", ext);
   
   return(0);
}

 

  • Curtir 1
  • Obrigado 1
Postado
22 minutos atrás, lidy ane disse:

não sei usar o gets pois nunca usei e o terceiro ponto destacado não entendi como fazer isso

 

Você não tem um livro? Sua escola não assina uma biblioteca online que você possa acessar? Acho que é muito, muito importante ter um livro...

 

De todo modo seu IDE --- sim, IDE é masculino --- não abre a documentação? Talvez devesse usar algum mais moderno se não abre. Em geral basta você parar o ponteiro do mouse sobre a função e acende algo.

Veja um exemplo
 

image.png.dd4e63ee3d75e93627716d9b8c2cd364.png

 

E já vem o protótipo da função. Só precisa ficar parada olhando uns 2s e já acende a definição. E se não for suficiente você claro pode ir no link "Search Online". Sim, tem em português também.


Não dá pra avançar sem procurar por novas coisas...

De todo modo tem aí o exemplo também: fgets() lê do arquivo, o último parâmetro, no caso stdin, o teclado, até o fim da linha ou até ler o total de caracteres que definiu no segundo parâmetro. Vai ler o '\0' final inclusive. Sem stress de limpar o buffer e comer caracteres ou algo assim como por vezes acontece quando você usa scanf() e não leu o manual nem uma vezinha. Os valores lidos vão para o Buffer, o primeiro parâmetro. E ela retorna também o ponteiro para os valores lidos.

 

Assim essa única linha lê a tal listagem e coloca em 'linha' a partir de linha[0]... Mais uma linha e você lê a extensão...

 

O "terceiro ponto" é o seu programa, na prática.

 

Exemplo

 

Imagine que o cara quer separar os arquivos .cpp.  E vai digitar 

a.cpp, b.cpp, teste.py x.pas
.cpp

Tem 8 arquivos na "listagem".

 

E o cara quer saber quantos são .cpp . Meio besta digitar o ponto na extensão, já que todos vão ter ponto. Mas que vou dizer?

 

Se você usar a única linha do exemplo acima ela vai ler em linha essa "listagem".
 

Imagine esse sofisticado programa em C

int main()
{
	char linha[150];
	fgets(linha, 100, stdin);
	return 0;
}

Se você testar ele com um debugger, aquele programa que testa programas e que deve ter no seu IDE vai ver que, se você digitar aquela linha no programa, no momento do return 0; vai ter

 

image.png.559e60f89cd37b44b9685230ab958f20.png

 

Viu lá o valor da linha? vai ter 30 posições com o valor que foi digitado e um \n ao final. Esse é o resultado de gets()

Aí você lê a extensão que o cara quer, e ele vai digitar .cpp e você vai ficar com isso em outra variável, e vai ter 5 bytes, certo?

 

Agora veja a linha com uma régua pra facilitar:

a.cpp, b.cpp, teste.py x.pas
0....5....0....5....0....5....0....5....0....5....
0         1         2         3

Sem novidades. A gente já viu que tinha 30 posições. A terceira parte, o seu programa, é um loop. Pode ser qualquer coisa, for, while do/while, goto

 

Tudo que você tem que fazer é ver, até o final da linha, marcada pelo '\n' na posição 29:

  • onde estão os pontos
  • se depois do ponto tem "cpp"
  • e contar

Nada mais. Lá estão os pontos em 1, 8, 19 e 24 se não li errado. Desses apenas o 1 e o 8 tem cpp depois e então a saída de seu programa será uma única linha com o número 2.

 

Como saber se achou?  pode usar um loop com um if dentro certo? Já tem com o que comparar: a string que tem a extensão. Se o cara digitou .cpp e você leu em

char extensao[30];

está claro que só precisa comparar extensao com linha, as duas de umas 4 variáveis que seu programa vai ter.

Qual o tamanho da extensao? strlen(extensao); mas nem precisa saber o tamanho. Basta comparar até o '\0' que finaliza toda e qualquer string em C.

 

Confirme se entendeu

 

  • Curtir 1
  • Obrigado 1
Postado

@lidy ane    bom começo  ,  mas seu código contém alguns erros ,  como forma de estudo veja :

#include <stdio.h>
#include <stdlib.h> 
int main () {        // este aqui não vai funcionar , apresenta erro por falta de aspas nas variáveis char
                     // leitura das extenç. dos arquivos.
  char 1 = .c;       // na linguagem c/c++ o char só pode ter 1 caractere e nesse foi adicionado dois ( o ponto e a letra c )
  char 2 = .java;    // aqui adicionou cinco ( o ponto e a letra j e a letra a e a letra v e a letra a )
  char 3 = .cpp;     // aqui foram quatro
  char 4 = .py;      // aqui três
  char 5 = .jl;      // aqui três também
  char 6 = .R;       // aqui dois
  //  então todos esses estarão com erro , primeiro por que as variáveis não podem ser números apenas , mas podem ser alfanuméricos
  //  com uma letra no início e depois pode conter números,  e para que estejam certos , precisa ser uma string , que seria informar isso
  //  na criação da variável e poderia ser assim  :
  //  na linguagem c++ ( .cpp  )
  char A2[6] = ".java";
  //  ou 
  //  na linguagem c ( .c  )
  char A2[6];        // primeiro declarar a variável do tipo string
  strcpy(A2 , ".java");
  
  int n ;            // numero de arquivos com dada extensão: 
  //  no início ele não sabe a quantidade de arquivos com essa extensão
}
  
//   ou  
  
// este aqui vai funcionar   
#include <stdio.h>
#include <stdlib.h> 
int main(){ 
    FILE *arq;
//  leitura das extenç. dos arquivos.
//  char nome, i;                  // aqui é a mesma situação do anterior , precisa ser string ou o nome só teria um caractere
//  arq = fopen("t1.c", "w"    );  // não vai realmente abrir nenhum arquivo , apenas Ler o tipo de um arquivo 
//  arq = fopen("t2 . java, "w");  // não pode ter espaços entre os caracteres
//  arq = fopen("t3 . cpp, "w" );  // aqui também
//  arq = fopen("t4 . py, "w"  );  // para abrir um arquivo é com fopen mesmo , ali faltou uma aspas dupla "t4.py","w" e sem espaço entre caracteres
//  arq =fopen("t5 . jl, "w"   );  // se estivesse certo criaria e abriria e rssetaria um arquivo do tipo ( .j1 ) para escrever nele desde o início dele
//  arq  =fopen("t6 . R, "w"   );  // aqui também

//  poderia ser assim  :
    arq = fopen("t6.R","w");       // criou o arquivo
//      e depois de gravar no arquivo feche - o  assim 
    fclose(arq);                   // fecha o arquivo para validar as gravações
    return 32768;
}

 

  • Amei 1
Postado
23 horas atrás, lidy ane disse:

char 1 = .c;
  char 2 = .java;
  char 3 = .cpp;
  char 4 = .py;
  char 5 = .jl;
  char 6 = .R;

 

Não entendi o que quer fazer. Poderia explicar um pouco mais?

 

23 horas atrás, lidy ane disse:

FILE *arq;
// leitura das extenç. dos arquivos.
char nome, i;
arq = fopen("t1.c", "w");
arq  =fopen ("t2 . java, "w");
arq  =fopen ("t3 . cpp, "w");
arq  =fopen ("t4 . py, "w");
arq  =fopen ("t5 . jl, "w");
arq  =fopen ("t6 . R, "w");

 

Também não entendo. Está tentando criar vários arquivos? Para que? Seu programa só gera um número. Só um número inteiro. Ou zero ou o número de arquivos da extensão pedida pelo usuário.

 

Entendeu o que eu expliquei no tópico anterior? Como está seu programa agora?

 

 

  • Curtir 1
Postado

O problema esta que não é para aparecer nenhuma mensagem impressa,printada além do numero respectivo a uma extensão que estaria na segunda linha da entrada

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

main(){

    //Lista de strings que irão ser lidas da entrada
	char **lista, extensao[10];
	int n, i, j, k, flag, cont;

	puts(" ");
	//Número de strings
	scanf("%d", &n);
	lista = (char **)malloc(n * sizeof(char *));

	if(lista == NULL)
		printf("Erro ao alocar memoria!!!");

	//Aloca memória para cada string
	for(i = 0; i < n; i++){
		lista[i] = (char *)malloc(20 * sizeof(char));
	}

	for(i = 0; i < n; i++){
        //Lê da entrada cada string
		scanf("%s", lista[i]);
	}

	puts("Digite a extensao");
	//Lê a extensão da entrada
	scanf("%s", extensao);
	k = 0;
	cont = 0;

	//Para cada string e compara cada caracter
	for(i = 0; i < n; i++){
		for(j = 0; j < strlen(lista[i]); j++){
			if(lista[i][j] == extensao[k]){//Se for igual a extensão
					flag = 1;
					k++;
			}else {
					flag = 0;
			}
		}
		if(flag == 1)
			cont++;
		flag = 0;
		k = 0;
	}
	//Imprime o resultado
	printf("%d\n", cont);

		return 0;
}

 

 

  • Curtir 1
  • Obrigado 1
Postado

@lidy ane @lidy ane    para postar seu código é melhor usar o botão  <>  que está desenhado lá na barra de ferramentas da janela de postar

barap.jpg.c29969072b0501a371da4a74f3da9c1e.jpg

para que seu código não fique faltando nenhum caractere devido ao corretor ortográfico , e facilitar na cópia e colagem do código no compilador para testar  ,  e esse exercício você pegou no Uri online judge ?  

  • Curtir 2
Postado

@devair1010

27 minutos atrás, devair1010 disse:

@lidy ane @lidy ane    para postar seu código é melhor usar o botão  <>  que está desenhado lá na barra de ferramentas da janela de postar

barap.jpg.c29969072b0501a371da4a74f3da9c1e.jpg

para que seu código não fique faltando nenhum caractere devido ao corretor ortográfico , e facilitar na cópia e colagem do código no compilador para testar  ,  e esse exercício você pegou no Uri online judge ?  

@devair1010 fiz como indicou obrigada .

32 minutos atrás, lidy ane disse:

O problema esta que não é para aparecer nenhuma mensagem impressa,printada além do numero respectivo a uma extensão que estaria na segunda linha da entrada


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

main(){

    //Lista de strings que irão ser lidas da entrada
	char **lista, extensao[10];
	int n, i, j, k, flag, cont;

	puts(" ");
	//Número de strings
	scanf("%d", &n);
	lista = (char **)malloc(n * sizeof(char *));

	if(lista == NULL)
		printf("Erro ao alocar memoria!!!");

	//Aloca memória para cada string
	for(i = 0; i < n; i++){
		lista[i] = (char *)malloc(20 * sizeof(char));
	}

	for(i = 0; i < n; i++){
        //Lê da entrada cada string
		scanf("%s", lista[i]);
	}

	puts("Digite a extensao");
	//Lê a extensão da entrada
	scanf("%s", extensao);
	k = 0;
	cont = 0;

	//Para cada string e compara cada caracter
	for(i = 0; i < n; i++){
		for(j = 0; j < strlen(lista[i]); j++){
			if(lista[i][j] == extensao[k]){//Se for igual a extensão
					flag = 1;
					k++;
			}else {
					flag = 0;
			}
		}
		if(flag == 1)
			cont++;
		flag = 0;
		k = 0;
	}
	//Imprime o resultado
	printf("%d\n", cont);

		return 0;
}

 

 

 

  • Curtir 1
Postado

@lidy ane    obrigado   !  ,   seu código compilou , mas não faz o que se pretende ,   não entendi por que você está usando uma matriz do tipo ponteiro ,  mas se quiser use , apenas não vejo necessidade para ela , e veja esse código aqui se pode te ajudar  ,,  , 

#include <stdio.h>
#include <string.h>
int main(){
    char linha[300],                                     // pode ter até 300 caracteres nessa linha
         tipo[ 020],                                     // pode ter até 20 caracteres nessa linha
         pedaco[50];                                     // pedaço da linha com o tipo de Arquivo
    int i,j,k,w,total=0;                                 // variáveis do tipo int
    Label_1:                                             // Label de início de um Loop
        printf("uma  Linha ");                           // para postar no URI não precisa dessa linha
        scanf("%s",linha);                               // pega todos os caracteres pois estarão juntos sem espaços
        if( strcmp( linha , "." ) == 0 )return 32768;    // condição de parada do Loop
        w = strlen(linha);                               // armazena a qtd de caracteres da linha digitada
        printf("Qual o Tipo ");                          // não precisa dessa Linha também não
        scanf("%s",tipo);                                // só pega os caracteres que estão juntos sem espaço em branco
        for(i=0; i<w; i++){                              // vai percorrer todos os caracteres da string
            k=0;                                         // inicializa um contador com valor zero
            if(linha[i]=='.'){                           // se encontrar um ponto na string
                for(j=i; j<w; j++){                      // continuar percorrendo a string até o final dela
                    if(linha[j]==',')break;              // se encontrar uma vírgula sai do Loop
                    pedaco[k] = linha[j];                // armazena o caractere nessa variável e nessa posição do contador
                    k++;                                 // incrementa o contador pois adicionou um caractere naquela variável
                }
                pedaco[k]='\0';                          // coloca o finalizador de string para
                if(strcmp(pedaco,tipo)==0)total++;       // comparar o tipo informado com o que está na string
            }
        }
        printf("\n\no total de Arquivos com o tipo ( %s ) eh  %d\n\n\n",
        tipo,total);                                     // mostra o resultado final
    goto Label_1;                                        // Loop Eterno
    printf("\n\n\n");
    return 32768;
}

 

  • Curtir 1
Postado
1 hora atrás, lidy ane disse:

O problema esta que não é para aparecer nenhuma mensagem impressa,printada além do numero respectivo a uma extensão que estaria na segunda linha da entrada

 

Você pode usar tantas mensagens quanto precise pra se orientar. Apenas quando o programa estiver pronto você tira... 

 

Você entendeu o que eu te expliquei? acho que está escrevendo algo muito complicado. Assim como achei complicados os exemplo que vi aqui. O problema é mais simples

 

  • Curtir 1
Postado
	//Número de strings
	scanf("%d", &n);
	lista = (char **)malloc(n * sizeof(char *));

 

8 horas atrás, lidy ane disse:

problema


Esse é um exemplo de complicar sem razão. Seu programa não tem memória entre uma linha e outra. Não há razão para
alocar um vetor de linhas se você processa uma de cada vez e o resultado de uma nada tem a ver com a próxima ou a anterior.

 

E se fez isso deveria ao final ter liberado a memória correspondente a cada alocação, o que não fez. Então pode perder pontos por ter feito de modo incompleto algo que nem precisava ter feito... E não é uma boa solução, apenas desperdiça tempo e memória.

 

Isso aqui já serviria para testar seu programa por exemplo

	const char exemplo[4][80] = {
		"grafo.c,AVL.java,lista.c,bubbleSort.java,ABB.java,matriz.cpp",
		"fila.py,quick_sort.py,Hashing.java,digrafo.c,pilha.jl",
		"knn.R,AVRubroNegra.cpp,busca_binaria.py,heapSort.cpp",
		"."
	};
	const char* final = ".";

E um programa simples assim
 

image.thumb.png.a91195cbbc7d54b493dfe0959c31c591.png

 

e na linha 21 você põe o código ou chama a função que faz o serviço. Para UMA linha. Só uma.
 

Quando estiver ok  com os exemplos basta trocar o strcmp() pela leitura por exemplo via gets() e o programa continua funcionando. Só muda uma linha.

 

E a função pode ser algo besta como

// linha, tamanho, extensao, tamanho
int resolve_para(const char*, int, const char*, int);

Que devolve o número de arquivos na listagem com a extensão procurada, como abaixo

	int  n = 0;
	while (strcmp(exemplo[n], final) != 0)
	{
		printf("\"Listagem\": '%s'\n", exemplo[n]);
		printf(" Extensao: '%s'\n", exten[n]);
		int res = resolve_para(
			exemplo[n],	strlen(exemplo[n]),
			&exten[n][1], strlen(exten[n])-1);
		printf("Resultado: %d\n\n", res);
		n = n + 1;
	};	// while()
	return 0;

Que se imagina mostre algo assim

"Listagem": 'grafo.c,AVL.java,lista.c,bubbleSort.java,ABB.java,matriz.cpp'
 Extensao: '.java'
Resultado: 3

"Listagem": 'fila.py,quick_sort.py,Hashing.java,digrafo.c,pilha.jl'
 Extensao: '.jl'
Resultado: 1

"Listagem": 'knn.R,AVRubroNegra.cpp,busca_binaria.py,heapSort.cpp'
 Extensao: '.c'
Resultado: 0

A diferença de escrever assim é que é mais seguro. Mais simples de testar e mais fácil de ler e de mudar depois.

 

Mas e a tal função resolve() ?


Vou repetir o que eu sempre escrevo: escreva seu programa em torno dos dados.  Sempre a partir dos dados. Nesse caso a única linha e a extensão. Eis o que importa:

  • você vai processar todos os caracteres da entrada. Todos. Então o mais simples é um loop até o fim da linha. Não precisa de um do/while(1) por exemplo, como no exemplo acima de @devair1010 porque o final é conhecido. Como você vai processar até uma linha que tenha um '.' apenas, é mais legível usar um while e testar logo no início ao invés de no final do loop. Usar do{}while() e testar a condição de saída no início do loop é algo que em geral se pode evitar , e fica estranho de ler. Você pode escrever assim, como está no exemplo acima:
    	do {                                               
    		printf("uma  Linha ");
    		scanf("%s", linha);          
    		if (strcmp(linha, ".") == 0)break; 
    
    		...
    			
    	} while (1);                                         // Loop Eterno

    Mas a realidade é:
     

    	while (strcmp(linha, final) != 0)
    	{
            ...
    	};	// while()

    E é mais legível. E você não tem que procurar pelo código dentro do loop as condições de saída possíveis.
     

     


     

  • o usuário pode entrar com '.' logo no início só pra ver se você pensou nisso...
     
  • fique alerta para casos como o do exemplo 3, procurando arquivos .c e vem dois arquivos .cpp
     
  • o delimitador entre os arquivos é a vírgula ou o '\n'. Cuidado!. Esse é o caso do exemplo 2. Uma pegadinha sutil

 

  • Curtir 2

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!