Grade 10 · Character stringsCitește în română

Converting to uppercase and lowercase

Original: Transformarea în majuscule și minuscule

O(n)C++1753 lines1 example

The idea

In the ASCII table the uppercase letters 'A'..'Z' and the lowercase 'a'..'z' are a constant distance apart: 'a' - 'A' = 32. A lowercase letter becomes uppercase by subtracting 32 (s[i] = s[i] - 'a' + 'A'), and the other way round by adding. The functions toupper and tolower from <cctype> do the same and leave other characters unchanged. The string is printed in uppercase, in lowercase, and then with the first letter of every word capitalized and the rest lowercase.

Original description (Romanian)

În tabelul ASCII literele mari 'A'..'Z' și cele mici 'a'..'z' sunt la distanță constantă: 'a' - 'A' = 32. O literă mică devine mare scăzând 32 (s[i] = s[i] - 'a' + 'A'), iar invers adunând. Funcțiile toupper și tolower din <cctype> fac același lucru și lasă neschimbate celelalte caractere. Afișăm șirul cu majuscule, cu minuscule și apoi cu prima literă a fiecărui cuvânt mare, restul mici.

Complexity
O(L)
Grade
Grade 10 (Clasa a X-a)

Examples

Example 1

Input

ana ARE mERe

Expected output

ANA ARE MERE
ana are mere
Ana Are Mere

The code

Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.

majuscule-si-minuscule.cpp
/*
 * Titlu: Transformarea în majuscule și minuscule
 * Clasa: 10
 * Capitol: Șiruri de caractere
 * Descriere: În tabelul ASCII literele mari 'A'..'Z' și cele mici 'a'..'z' sunt la
 *            distanță constantă: 'a' - 'A' = 32. O literă mică devine mare scăzând
 *            32 (s[i] = s[i] - 'a' + 'A'), iar invers adunând. Funcțiile toupper și
 *            tolower din <cctype> fac același lucru și lasă neschimbate celelalte
 *            caractere. Afișăm șirul cu majuscule, cu minuscule și apoi cu prima
 *            literă a fiecărui cuvânt mare, restul mici.
 * Complexitate: O(L)
 *
 * Exemplu
 * Intrare: ana ARE mERe
 * Ieșire:
 * ANA ARE MERE
 * ana are mere
 * Ana Are Mere
 */
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;

int main()
{
    char s[256], t[256];
    cin.getline(s, 256);
    int n = strlen(s);

    // majuscule, „de mână”
    strcpy(t, s);
    for (int i = 0; i < n; i++)
        if (t[i] >= 'a' && t[i] <= 'z')
            t[i] = t[i] - 'a' + 'A';
    cout << t << '\n';

    // minuscule, cu tolower
    strcpy(t, s);
    for (int i = 0; i < n; i++)
        t[i] = tolower(t[i]);
    cout << t << '\n';

    // prima literă a fiecărui cuvânt mare
    for (int i = 0; i < n; i++)
    {
        if (i == 0 || t[i - 1] == ' ')
            t[i] = toupper(t[i]);
    }
    cout << t << '\n';
    return 0;
}

Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.