Ir ao conteúdo

Posts recomendados

Postado

Oi pessoal, to criando um programa onde preciso que o programa leia as matrículas de todos os alunos da turma A, depois leia as matrículas de todos os alunos da turma B e, ao final, imprima as matrículas dos alunos que estão inscritos na turma A e na turma B. Estou com dúvida na parte do programa repetir o comando para armazenar as informações, ou seja

printf("Insira a quatidade de alunos na turma A: ");
        scanf("%d", &n);

a partir do n fornecido, repetir n vezes

 printf("Digite o nome do aluno: ");
                        scanf("%s",&nome);
                        getchar();

                    printf("Digite a matricula do aluno: ");
                        scanf("%d", &matricula);

                    while(matricula > 999999 && matricula < 111111){
                        printf("Matricula invalida! Insira novamente sua matricula: ");
                        scanf("%d", &matricula);

e depois armazenar em turmaA para que eu prossiga com o código. Alguém tem alguma sugestão com o que posso usar?

  • Obrigado 1
Postado

@nagatonie        

while(matricula > 999999 && matricula < 111111){

essa condição do while nunca vai acontecer  ,  pois esses dois && significa AND , e deveria ser OU  , que eh isso || .

e se você puder , poste o código todo .

//  poderia ser assim
while(matricula > 999999 || matricula < 111111){
ou assim   
while( matricula < 111111 && matricula > 999999 ){  

/// Que só vai aceitar valores maior que 111110
/// e menor que 999999  

 

  • Curtir 1
Postado

você pode usar um laço for... assim:

 

printf("Insira a quatidade de alunos na turma A: ");
scanf("%d", &n);

//a partir do n fornecido, repetir n vezes
for(int i=0; i<n; i++)
{
                    printf("Digite o nome do aluno: ");
                    scanf("%s",&nome);
                    getchar();

                    printf("Digite a matricula do aluno: ");
                    scanf("%d", &matricula);
                    // não entendi porque essa condição assim, mas pode usar como o devair mostrou também... 
                    while(matricula < 999999 && matricula > 111111)
                    {
                        printf("Matricula invalida! Insira novamente sua matricula: ");
                        scanf("%d", &matricula);
                    }
}

 

  • Obrigado 1
Postado

@devair1010  Esse é meu programa como está no momento, tentei usar o laço for mas não está funcionando @codigo rápido

#include<stdio.h>

int main () {

    int i, n, k,turmaA, turmaB, matricula; // turmaA recebe n alunos, turmaB recebe k alunos
    char nome;

       printf("Insira a quatidade de alunos na turma A: ");
            scanf("%d", &n);


            for(int i=0; i<n; i++)

                    {
                    printf("Digite o nome do aluno: ");
                    scanf("%s",&nome);
                    getchar();

                    printf("Digite a matricula do aluno: ");
                    scanf("%d", &matricula);
                    
                    while(matricula > 999999 && matricula < 111111)// matrícula é um número inteiro positivo de 6 dígitos (zeros à esquerda não contam).
                    {
                        printf("Matricula invalida! Insira novamente sua matricula: ");
                        scanf("%d", &matricula);
                    }
                    
}
}

 

  • Obrigado 1
Postado

@nagatonie    ok ,  poste o enunciado desse exercício ,    para um melhor entendimento . senão não sabe o que fazer .

   e não está funcionando , por que você criou a variáveL  i  duas vezes , 

int i, n, k,turmaA, turmaB, matricula; // turmaA recebe n alunos, turmaB recebe k alunos
char nome;
printf("Insira a quatidade de alunos na turma A: ");
scanf("%d", &n);
for(/*int*/ i=0; i<n; i++)  /// essa var i jáh existe , não pode ser criada 
                            /// novamente com esse mesmo nome . dentro da 
                            /// mesma função

 

  • Curtir 1
  • Obrigado 1
Postado

@devair1010

Um professor ministra aulas de Programação para duas turmas (turma A e turma B). Por
um erro no sistema acadêmico, alguns alunos que se inscreveram na turma A, também
foram inscritos na turma B. O professor precisa de um programa que leia as matrículas de
todos os alunos da turma A, depois leia as matrículas de todos os alunos da turma B e, ao
final, imprima as matrículas dos alunos que estão inscritos na turma A e na turma B.
Implemente, em C, esse programa.
Restrições:
a) Matrícula é um número inteiro positivo de 6 dígitos (zeros à esquerda não contam).
b) A turma A tem n alunos, onde n > 0.
c) A turma B tem k alunos, onde k > 0.

3

d) n pode ser igual ou diferente de k.
e) A leitura dos valores das variáveis n e k e as declarações dos vetores devem ser feitas,
obrigatoriamente, na função main.
f) Deverá ser implementada a função le_turma que lê os dados de uma turma.
g) Deverá ser implementada a função repetidos que calcula e imprime as matrículas
repetidas das turmas A e B.
h) Não são permitidas variáveis globais.

  • Curtir 1
Postado

@nagatonie As funções podem ter esses protótipos,

 

void le_turma(int matricula[], int n);
void repetidos(int A[], int B[], int a, int b);

 

Para ler a turma é só entrar com o valor durante loop enquanto < n. Na função repetidos pode ter dois loops aninhados (como os que são usados numa matriz). E aí é só testar A[i] == B[j] e imprimir qualquer um.

  • Curtir 2
Postado
11 horas atrás, devair1010 disse:

e não está funcionando , por que você criou a variáveL  i  duas vezes

desculpa... culpa minha. Não vi isso. Mas isso ai o compilador mostra e é simples de resolver. Sr. nagatone, já deve entender quando acontecer isso.

Agora olhe o que encontrei nesse fonte do senhor:

tem que ser delcarado char *nome. E não char nome. E como você combinou isso como ponteiro de char, então não é necessário passar o endereço da variavel, e sim o ponteiro. veja como funcionou aqui pra mim:
 


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

int main()
{
	int i, n, k, turmaA, turmaB, matricula;
	char *nome; // isso deveria ser assim?

	printf("Insira a quatidade de alunos na turma A: ");
	scanf("%i", &n);

	for(int j=0; j<n; j++)
	{
		printf("Digite o nome do aluno: ");
		scanf("%s", nome); // e aqui muda, ja que declarou como char*
		// o que aconteceu é que você fez sua variavel nome receber um valor maior
		// do que o combinado na sua antiga declaração... ai, isso tava sobrescrevendo 
		// o conteudo da variavel n. 
		// se voltar ao que era antes, isso aqui vai mostrar porque sua 
		// condicional do for não para:
		// printf("= %i %i ", j, n);

		printf("Digite a matricula do aluno: ");
		scanf("%d", &matricula);
		//mudei aqui só pra facilitar, mas use sua logica... 
		while(matricula<0)
		{
			printf("Matricula invalida! Insira novamente sua matricula: ");
			scanf("%d", &matricula);
		}
	}
	return 0;
}

 

  • Amei 2
Postado
Em 27/09/2021 às 18:47, devair1010 disse:

@nagatonie        

while(matricula > 999999 && matricula < 111111){

 

Isso é logicamente impossível, como que algo vai ser maior que 999999 e menor que 111111 ao mesmo tempo ? Confesso que me pegou de surpresa quando li, achei engraçado rsrs.

  • Obrigado 1
  • Haha 1
Postado

@Felipecfk errei na hora de usar o || e confundi com o &&, pois a matricula deve ser um numero de 6 digitos onde zeros a esquerda não contam.

@codigo rápido Meu compilador está com algum problema que não consigo resolver, esses erros simples não aparecem pra mim na hora de compilar o que acaba gerando mais duvida, mas entendi sim! muito obrigado pela ajuda

  • Curtir 2
Postado
33 minutos atrás, nagatonie disse:

Meu compilador está com algum problema que não consigo resolver, esses erros simples não aparecem pra mim na hora de compilar o que acaba gerando mais duvida, mas entendi sim!

tem algo errado no seu compilador... que compilador está usando? por padrão eles mostram mensagens. mesmo em linha de comando, que é o que uso aqui.

gcc nomeFile.c -o NomeFinalQueQuero.exe
 

  • Curtir 1
Postado

Acho o teste da matrícula mais simples fazendo entre 100 mil (inclusive) e 1 milhão, p.ex,

 

do{
    printf("Matricula: ");
    scanf("%d", &matricula);
    valida = matricula >= 1e5 && matricula < 1e6;
    if(!valida){
        puts("Matricula invalida");
    }
}while(!valida);

 

 

  • Curtir 1
Postado
1 hora atrás, Midori disse:

Acho o teste da matrícula mais simples fazendo entre 100 mil (inclusive) e 1 milhão, p.ex,

 

do{
    printf("Matricula: ");
    scanf("%d", &matricula);
    valida = matricula >= 1e5 && matricula < 1e6;
    if(!valida){
        puts("Matricula invalida");
    }
}while(!valida);

 

 

porque você está dizendo isso? não entendi... no primeiro momento que peguei esse exercicio a primeira coisa que fiz foi tirar essa condicional só pra não ter que digitar qualquer caractere.

  • Curtir 1
Postado

@Midori Por enquanto meu programa ta assim

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


void le_turmaA (int n) {

		int matricula[6];
		char *nome;
		

		printf("Insira a quatidade de alunos na turma A: ");
			scanf("%i", &n);

	for(int j=0; j<n; j++)
	{
		printf("Digite o nome do aluno: ");
		scanf("%s", nome);

		printf("Digite a matricula do aluno: ");
		scanf("%d", &matricula[6]);
		while(matricula[6] < 100000 || matricula[6] > 999999)
		{
			printf("matricula invalida! Insira novamente sua matricula: ");
			scanf("%d", &matricula[6]);
		}
		
	}
 
}

void le_turmaB (int k) {

		int matricula[6];
		char *nome;
		

		printf("Insira a quatidade de alunos na turma B: ");
			scanf("%i", &k);

	for(int j=0; j<k; j++)
	{
		printf("Digite o nome do aluno: ");
		scanf("%s", nome);

		printf("Digite a matricula do aluno: ");
		scanf("%d", &matricula[6]);
		while(matricula[6] < 111111 || matricula[6] > 999999)
		{
			printf("matricula invalida! Insira novamente sua matricula: ");
			scanf("%d", &matricula[6]);
		}

		
	}

}

void repetidos(int A[], int B[], int a, int b) {

}

int main()
{
	int n, k;
	le_turmaA (n);
	le_turmaB (k);


	return 0;
}

 

  • Curtir 1
Postado

@codigo rápido

13 horas atrás, codigo rápido disse:

desculpa... culpa minha. Não vi isso. Mas isso ai o compilador mostra e é simples de resolver. Sr. nagatone, já deve entender quando acontecer isso.

de acordo com essa postaGem

https://www.clubedohardware.com.br/forums/topic/1563000-cadastro-de-carro-linguagem-c/?tab=comments#comment-8270172

é sra. nagatonie

postagems.thumb.jpg.92cd242a2ac4333d1ac64a4beae4d15a.jpg

  • Amei 1
  • Haha 1
Postado

@nagatonie Não precisa criar duas funções para ler a turma, seu código deve ter apenas uma função para ler os dois vetores das turmas que serão passados como argumento para essa função. O nome também não é necessário já que o enunciado não pede.

 

43 minutos atrás, nagatonie disse:
int matricula[6];

Aí está declarando um vetor de inteiros. Não é assim que deve fazer para testar os dígitos, apenas declare um inteiro (int matricula) ou a posição da matrícula no vetor da turma e compare como tinha tentado antes.

  • Curtir 2
Postado
6 horas atrás, devair1010 disse:

valeu Devair! Eu não percebi.
Desculpa Sra Nagatonie! Eu não percebi mesmo.
Por favor, entenda que muitos usuários entram com avatares que não dá pra determinar se é homem ou mulher.

  • Obrigado 1
Postado

@Midori Meu código tá assim, mas tem algo de errado porque quando começa a ler para no nome

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



void le_turma (int n) {
        int turma=0;
		int matricula;
		char nome;

			for(int j=0; j<n; j++)
	{
		printf("Digite o nome do aluno: ");
		scanf("%s", nome);

		printf("Digite a matricula do aluno: ");
		scanf("%d", &matricula);
		while(matricula < 100000 || matricula > 999999)
		{
			printf("matricula invalida! Insira novamente sua matricula: ");
			scanf("%d", &matricula);
		}
		turma++;
	}

}



void repetidos(int A[], int B[], int a, int b) {


}

int main()
{
	int n, k;

		printf("Digite a quantidade de alunos na turma A: ");
            scanf("%i", &n);
        le_turma(n);

		printf("Digite a quantidade de alunos na turma B: ");
            scanf("%i", &k);
		le_turma(k);


	return 0;
}

 

  • Curtir 1
Postado

@nagatonie O nome você declarou como char e assim só poderá receber uma letra. Para entrar com mais letras e formar um nome terá que reservar mais espaço em um vetor de char, p.ex,

char nome[50];

 

Assim o vetor nome (ou string nome) poderá receber até 50 caracteres e a entrada pode ser com a função fgets,

fgets(nome, 50, stdin)

 

  • Curtir 1
  • Obrigado 1
Postado

@Midori Deu certo! Mas quando vou imprimir a lista de matriculas na turma A e B, aparece valores aleatórios, e a parte de repetição eu fiz mas não sei como implementar no codigo:

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



void le_turma (int n) {

		int matricula;
		char nome[50];

			for(int j=0; j<n; j++)
	{
		printf("Digite o nome do aluno: ");
		scanf("%s", nome, 50,stdin);

		printf("Digite a matricula do aluno: ");
		scanf("%d", &matricula);
		while(matricula < 100000 || matricula > 999999)
		{
			printf("matricula invalida! Insira novamente sua matricula: ");
			scanf("%d", &matricula);
		}

	}

}



void repetidos(int A[], int B[], int i, int j) {
int encontrou=0;

	for(i = 1; i <=6; i++)

		for(j = 1; j <=6; j++)

			if(A[i] == B[j]) {
				encontrou = 1;
				printf("Matricula encontrada nas duas turmas!");
			}
			if(encontrou == 0) {
				printf("Nenhum valor repetido!");
			}

}

int main()
{
	int n, k;


		printf("Digite a quantidade de alunos na turma A: ");
            scanf("%i", &n);
        le_turma(n);

		printf("Digite a quantidade de alunos na turma B: ");
            scanf("%i", &k);
		le_turma(k);

		printf("LISTA DE ALUNOS CADASTRADOS NA TURMA A: %i \n", &n);
		printf("---------------------------------------------------------\n");
		printf("LISTA DE ALUNOS CADASTRADOS NA TURMA B: %i \n",  &k);

		printf("MATRICULAS REPETIDAS: ");
		repetidos();



	return 0;
}

 

  • Curtir 1
Postado

@nagatonie A função para ler a turma pode ter dois parâmetros como comentei antes, como o vetor das matrículas e a quantidade, algo assim,

void le_turma(int matricula[], int n){
    for(int i = 0; i < n; i += 1){
        int valida;
        do{
            printf("Matricula %d: ", i + 1);
            scanf("%d", &matricula[i]);
            valida = 
                matricula[i] >= 1e5 && 
                matricula[i] < 1e6;
            if(!valida){
                puts("Matricula invalida");
            }
        }while(!valida);
    }
}

 

Na sua função dos repetidos não deixe os nomes dos parâmetros iguais aos dos contadores do loop já que o parâmetro pode ser usado na condição do loop assim,

void repetidos(int A[], int B[], int a, int b){
    for(int i = 0; i < a; i += 1){
        for(int j = 0; j < b; j += 1){
            if(A[i] == B[j]){
                printf("%d\n", A[i]);
                break;
            }
        }
    }
}

 

  • Curtir 1

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!