Ir ao conteúdo
  • Cadastre-se

C++ para resolver este problema obrigado


Martim23

Posts recomendados

Escreva um programa que leia uma string, inverta os seus caracteres todos de minúscula para maiúscula e vice versa,  e apresente o resultado no ecrã.

<#include <stdio.h>
#include <locale.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
int main ()

{
    char texto [50];
    int i=0;
    
    
    printf ("Introduza uma frase: ");
    fgets (texto,50,stdin);
    
    for(i=0; texto != '\0'; i++){
        if (texto = strlwr)
                do{
                    printf ("%s",strlwr(texto));
                  }while 
    }
}>

Link para o comentário
Compartilhar em outros sites

Na tabela ASCII, as letras maisculas e minusculas estão distantes 32 posições. Então, para converter um caracterer de maisculo para minusculo e vice & versa, baster fazer um XOR com 32 (20h). Exemplo:

#include <stdio.h>



int main()
{
    char ch = getchar();
    ch = ch ^ 32; //converter de maiscula par miniscula e vice versa
    printf("%c", ch);
    return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

2 minutos atrás, Flávio Pedroza disse:

Na tabela ASCII, as letras maisculas e minusculas estão distantes 32 posições. Então, para converter um caracterer de maisculo para minusculo e vice & versa, baster fazer um XOR com 32 (20h). Exemplo:


#include <stdio.h>



int main()
{
    char ch = getchar();
    ch = ch ^ 32; //converter de maiscula par miniscula e vice versa
    printf("%c", ch);
    return 0;
}

 

Mas vou ter de fazer um ciclo para ler cada caracter e saber se muda para maiuscula ou para minuscula

 

Link para o comentário
Compartilhar em outros sites

55 minutos atrás, Flávio Pedroza disse:

Tera que varrer a string e para cada caracter aplicar a operação que mencionei em cima.

 

#include <stdio.h>
#include <locale.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
int main ()

{
    char texto [32];
    int i;
    
    
    printf ("Introduza uma frase: ");
    fgets (texto,50,stdin);
    
    for(i=0; texto != '\0'; i++){
    
    texto = texto ^ 32; //converter de maiscula par miniscula e vice versa
    printf("%c", texto);}
   
    
    
}

 

Link para o comentário
Compartilhar em outros sites

Vamos arrumar isso:

19 minutos atrás, Martim23 disse:

 

#include <stdio.h>
#include <locale.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
int main ()

{
    char texto [32];
    int i;
    
    
    printf ("Introduza uma frase: ");
    fgets (texto,50,stdin);
    
    for(i=0; texto != '\0'; i++){
    
    texto = texto ^ 32; //converter de maiscula par miniscula e vice versa
    printf("%c", texto);}
   
    
    
}

 

#include <stdio.h>

int main (){
    char texto [50];
    int i=0;
    printf("Introduza uma frase: ");
    fgets(texto,50,stdin);
    while(texto[i] != '\0'){
        if(texto[i] > 90){
            texto[i] -= 32;
        }
        i++;
    }
    printf("%s",texto);
    return 0;
}

Primeiro que só precisa de uma biblioteca.

adicionado 2 minutos depois

Depois, no lugar do for é um while.

O if(texto > 90) testa se a letra é minúscula, se for converte para maiúscula subtraindo 32 e o texto fica todo maiúsculo.

Para deixar minúsculo é só inverter.

adicionado 3 minutos depois

E outra que tem que percorrer os índices do texto.

 

Mas se não entendeu nada, recomece, ou comece, a estudar a linguagem C e sua estrutura.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Luís Roberto C. da Silva disse:

#include <stdio.h>
#include <locale.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
int main ()

{
    char texto [25];
    int i;
    
    
    printf ("Introduza uma frase: ");
    gets (texto);
    printf ("String original: %s\n",texto);
    
    for(i=0; texto; i++)
    
        if (islower (texto)) texto = toupper (texto);
        else if (isupper (texto)) texto = tolower(texto);
        
        printf ("string com caixa invertida:%s",texto);
        
        getch();
        return 0;    
}


#include <stdio.h>

int main (){
    char texto [50];
    int i=0;
    printf("Introduza uma frase: ");
    fgets(texto,50,stdin);
    while(texto[i] != '\0'){
        if(texto[i] > 90){
            texto[i] -= 32;
        }
        i++;
    }
    printf("%s",texto);
    return 0;
}

Primeiro que só precisa de uma biblioteca.

adicionado 2 minutos depois

Depois, no lugar do for é um while.

O if(texto > 90) testa se a letra é minúscula, se for converte para maiúscula subtraindo 32 e o texto fica todo maiúsculo.

Para deixar minúsculo é só inverter.

adicionado 3 minutos depois

E outra que tem que percorrer os índices do texto.

 

Mas se não entendeu nada, recomece, ou comece, a estudar a linguagem C e sua estrutura.

 

Link para o comentário
Compartilhar em outros sites

3 horas atrás, Luís Roberto C. da Silva disse:

Primeiro que só precisa de uma biblioteca.

adicionado 2 minutos depois

Depois, no lugar do for é um while.

O if(texto > 90) testa se a letra é minúscula, se for converte para maiúscula subtraindo 32 e o texto fica todo maiúsculo.

Para deixar minúsculo é só inverter.

 

  • Não precisa de uma biblioteca, na verdade.
  • for() while() e do{})while() podem ser usados indistintamente. Basta usar os índices de acordo.
  • Não é necessário testar minúscula ou maiúscula. Como @Flávio Pedroza mostrou, a diferença é sempre 32. Então se for uma letra basta inverter o bit 5, certo? E o operador em C para XOR é '^' como está lá no código que ele mostrou. Isso inverte o bit 5... É o significado de "ou exclusivo". Basta testar se é uma letra.
    'a' ^ 32 = 'A'
    'A' ^ 32 = 'a'

Esse trecho

    char letra = 'a';
    if (
        ((letra >= 'a') && (letra <= 'z')) ||
        ((letra >= 'A') && (letra <= 'Z'))
        ) letra = letra ^ 32;
    printf("char: '%c' char^32: '%c'\n\n", letra, letra ^ 32);
    
    letra = 'a' ^ 32;
    printf("char: '%c' char^32: '%c'\n\n", letra, letra ^ 32);
    if (
        ((letra >= 'a') && (letra <= 'z')) ||
        ((letra >= 'A') && (letra <= 'Z')) 
       ) letra = letra ^32;

    letra = '!';
    printf("(antes) char: '%c'\n", letra);
    if (
        ((letra >= 'a') && (letra <= 'z')) ||
        ((letra >= 'A') && (letra <= 'Z'))
        ) letra = letra ^ 32;
    printf("(depois) char: '%c'\n", letra);

mostra

char: 'A' char^32: 'a'

char: 'A' char^32: 'a'

(antes) char: '!'
(depois) char: '!'

O código do '!' é 33...  Você tem que testar se é uma letra porque caracteres como o '!' seriam corrompidos

 

Um pouco de história, off-topic


Ao invés de XOR com 32, a tecla Control faz AND com 32 e assim por exemplo Control+A e Control+a valem 1

 

Overhead


Chamar uma ou várias funções de biblioteca pode estar fora do enunciado. E na prática vai demorar umas 40 vezes mais pelo overhead de chamar funções... Para fazer o mesmo.

 

4 horas atrás, Martim23 disse:

Mas vou ter de fazer um ciclo para ler cada caracter e saber se muda para maiuscula ou para minuscula


Claro que tem que percorrer a string para testar as letras individualmente...

Link para o comentário
Compartilhar em outros sites

Em 18/03/2020 às 11:07, Martim23 disse:


 


#include <stdio.h>
#include <locale.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
int main ()

{
    char texto[32];
    int i;
    
    
    printf ("Introduza uma frase: ");
    fgets(texto, 32, stdin);
    
    for(i = 0; texto[i] != '\0'; i++){
    
    texto[i] = texto[i] ^ 32; //Expressão converter de maiscula para miniscula e vice versa
    printf("%c", texto);}
}


 

Boa noite! Realizei o que acredito ser o código original (antes de modificado pelo corretor da página).

 

Uma única falha aqui foi, se assegura de que somente os caracteres (intervalo =  ['A' ... 'z'] ) alfabéticos de intervalo fechado são os únicos atravessadores da expressão. Para tanto, tente e entenda o porquê de possível resolver acrescendo uma condição IF.

 

Ou seja, com 1x linha você resolve... "agora cuida que o filho é teu".

 

Bons Estudos!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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