Clasa a X-a · Șiruri de caractereRead in English

Înlocuirea unui cuvânt cu altul în C++

În engleză: Replacing one word with another

O(n)C++1755 de linii1 exemplu

Ideea

Se citesc un text și două cuvinte, vechi și nou (fiecare pe câte un rând). Construim rezultatul într-un șir nou: copiem spațiile așa cum sunt, iar fiecare cuvânt îl extragem întreg și îl comparăm cu vechi folosind strcmp (întoarce 0 la egalitate). Dacă se potrivește scriem nou, altfel cuvântul original. Așa înlocuim doar cuvinte întregi: „ana” nu se înlocuiește în interiorul cuvântului „banana”.

Descrierea în engleză

A text and two words, old and new, are read (each on its own line). We build the result in a new string: spaces are copied as they are, and every word is extracted whole and compared with the old one using strcmp (which returns 0 when equal). If it matches we write the new word, otherwise the original one. This way only whole words are replaced: 'ana' is not replaced inside the word 'banana'.

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

Exemple

Exemplul 1

Intrare

ana are mere si banana iar ana are pere
ana
maria

Ieșire așteptată

maria are mere si banana iar maria are pere

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

inlocuirea-unui-cuvant.cpp
/*
 * Titlu: Înlocuirea unui cuvânt cu altul
 * Clasa: 10
 * Capitol: Șiruri de caractere
 * Descriere: Se citesc un text și două cuvinte, vechi și nou (fiecare pe câte un
 *            rând). Construim rezultatul într-un șir nou: copiem spațiile așa cum
 *            sunt, iar fiecare cuvânt îl extragem întreg și îl comparăm cu vechi
 *            folosind strcmp (întoarce 0 la egalitate). Dacă se potrivește scriem
 *            nou, altfel cuvântul original. Așa înlocuim doar cuvinte întregi:
 *            „ana” nu se înlocuiește în interiorul cuvântului „banana”.
 * Complexitate: O(L)
 *
 * Exemplu
 * Intrare:
 * ana are mere si banana iar ana are pere
 * ana
 * maria
 * Ieșire: maria are mere si banana iar maria are pere
 */
#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    char text[256], vechi[51], nou[51], rezultat[1024];
    cin.getline(text, 256);
    cin.getline(vechi, 51);
    cin.getline(nou, 51);

    int i = 0, k = 0;
    while (text[i] != '\0')
    {
        if (text[i] == ' ')
        {
            rezultat[k++] = text[i++];
        }
        else
        {
            char cuvant[256];
            int lung = 0;
            while (text[i] != '\0' && text[i] != ' ')
                cuvant[lung++] = text[i++];
            cuvant[lung] = '\0';

            const char *deScris = (strcmp(cuvant, vechi) == 0) ? nou : cuvant;
            for (int j = 0; deScris[j] != '\0'; j++)
                rezultat[k++] = deScris[j];
        }
    }
    rezultat[k] = '\0';
    cout << rezultat << '\n';
    return 0;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.