Informatică, întrebare adresată de Patrick100, 8 ani în urmă

Aliniere la dreapta
Nu credeai că vei fi prins și tu în trendul DIY, dar uite că folosind un editor de text pentru un proiect de la job ai descoperit funcționalitatea de "aliniere la dreapta".

Ai decis ca ai și tu nevoie de așa ceva în aplicația pe care o creezi și ai început să o implementezi singur...

Cerință
Se dă un text format din litere ale alfabetului englez și steluțe ('*'), care se poate întinde pe mai multe linii. Aliniază textul la dreapta, astfel încât:

numărul de steluțe dintre 2 cuvinte consecutive de pe aceeași linie să fie păstrate
fiecare linie să se termine cu o literă
la începutul fiecărei linii să fie adăugat un număr suplimentar de steluțe (poate fi 0) astfel încât toate liniile să aibă aceeași dimensiune (același număr de caractere)
numărul de caractere de pe fiecare linie să fie egal cu numărul maxim de caractere de pe o linie din textul inițial
Date de intrare
Se va da un text format din caractere ale alfabetului englez și caractere '*', distribuite pe una sau mai multe linii.

Date de ieșire
Programul va afișa pe ecran textul formatat după criterile prezentate mai sus.

Restricții și precizări
Fiecare linie va conține cel puțin un cuvânt (un grup de litere)
Fiecare linie va conține cel mult 1 000 caractere
1 ≤ numarul de linii din text ≤ 20
Exemplu
Date de intrare
Acesta*este
********un****text
***impartit*pe*mai
*multe*linii
Date de ieșire
*******Acesta*este
********un****text
***impartit*pe*mai
*******multe*linii

Răspunsuri la întrebare

Răspuns de andrei750238
3

#include <iostream>

#include <string>

#include <vector>

using namespace std;

int main() {

vector<string> v;

string rand_nou;

int nr_max_char=0;

//Citire randuri, determinare numar maxim caractere

while (cin) {

 cin >> rand_nou;

 if (rand_nou.length() > nr_max_char) nr_max_char = rand_nou.length();

 v.push_back(rand_nou);

 }

//Completare cu stelute

for (int i = 0; i < v.size()-1; i++) {

 for (int j = 0; j < nr_max_char - v[i].length(); j++) cout << '*';

 cout << v[i] << endl;

}

}

► Explicatie :

Determinam numarul maxim de caractere pe rand, in fata fiecarui rand afisam un numar de (nr_max_caractere - lungime_rand) stelute.

► Nota :

Pentru a opri citirea apasam CTRL+Z, apoi apasam Enter. Caracterul inserat va avea acelasi rol ca si EOF in fisier.

Anexe:

Patrick100: Am inteles multumesc.
Patrick100: Imi explici linia asta te rog vector v;
Patrick100: prima linie in int main
Patrick100: prog.cpp: In function 'int main()':
prog.cpp:12:25: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
if (new_line.length() > nr_max_char) {
~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~

~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Patrick100: prog.cpp:17:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
for (int i = 0; i < v.size() - 1; ++i) {
~~^~~~~~~~~~~~~~
prog.cpp:18:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string::size_type' {aka 'long unsigned int'} [-Wsign-compare]
for (int j = 0; j < nr_max_char - v[i].length(); ++j) {
Patrick100: Cum rezolv aceste erori?
andrei750238: Sunt avertismente nu erori
andrei750238: Apar pentru ca am comparat un int cu un unsigned
andrei750238: in loc de int i si int j pune unsigned i si unsigned j
andrei750238: vector⟨string⟩ v = declar un vector care are elemente de tip string cu numele v. E asemanator cu ceva de tipul "string v[n]" sau "string* v", dar avem avantajul ca nu trebuie sa stim dinainte cate elemente vom avea in vector si nici nu trebuie sa ne complicam cu alocarea/dealocarea dinamică a memoriei
Alte întrebări interesante