алфавит — печать треугольника с заданной буквой в переполнении стека

Я хотел бы напечатать треугольник с данной буквой. Например, если я введу D, программа должна вернуть:

     A
AB
ABC
ABCD

До сих пор мне удавалось печатать все буквы до указанного в моем примере, но, как вы видите, этот метод не совсем эффективен, поскольку мне нужно сделать это для всех 26 случаев, поскольку английский алфавит составляет 26 символов. Есть ли способ оптимизировать мой код?

#include <iostream>

using namespace std;

int main() {
char i;
cout << "Enter char ";
cin >> i;
int c = static_cast<int>(i);
if (65 < c) {
cout << "A";
cout << endl;
}
if (66 < c) {
cout << "AB";
cout << endl;
}
if (67 < c) {
cout << "ABC";
cout << endl;
}

for (int i = 64; i < c; i++) {
cout << static_cast<char>(i + 1);
}

return 0;
}

3

Решение

Вы определенно должны работать над пониманием циклов. Этот работает просто отлично, и у него даже есть некоторые проверки того, что набрано, и в конечном итоге он преобразует строчные буквы в верхний.

char first = 'A';
char last = 0;

cout << "Enter a char: ";
cin >> last;
fflush(stdin);
cout << "\n\n";

if ((last > 96) && (last < 123)) //97 to 122 are lower case letters
{
last -= 32; //32 is the delta between each lower case letter and its upper case "twin"}

if ((last > 64) && (last < 91))
{
for (char i = 65; i <= last; i++)
{
for (char j = 65; j <= i; j++)
{
cout << j;
}
cout << "\n";
}
}
else
{
cout << "\nWrong character!!\n\n";
return 0;
}
3

Другие решения

Используйте структуру вложенного цикла. Используйте внешнюю петлю, чтобы «пройти» по вашему треугольнику,

lineLength = 1;
while(lineLength <= (c - 64)){
...stuff...

lineLength++;
cout << endl;
}

Используйте внутренний цикл, чтобы пройтись по алфавиту (вы уже сделали большую часть этого):

for (int i = 0; i < lineLength; i++) {
cout << static_cast<char>(i + 65);
}

Собираем это вместе:

lineLength = 1;
while(lineLength <= (c - 64)){
for (int i = 0; i < lineLength; i++) {
cout << static_cast<char>(i + 65);
}

lineLength++;
cout << endl;
}

Я вижу, что кто-то еще опубликовал аналогичный ответ. Между этими двумя ответами вы сможете найти свой путь. Я не скомпилировал и не запустил этот код, но я считаю, что он должен работать или быть очень близким.

3

Не вводите целочисленные значения ascii в код. Явно используйте символ или строковые литералы (например, 'A' вместо 65)

Начните с вспомогательной функции для печати ровно одной строки

// prints all the characters of the alphabetic sequence from "A" to the final char designated by <c>
void printTriangleLine(char c)
{
if ((c < 'A') || (c > 'Z'))
{
return;
}

for (char x = 'A'; x <= c; x++)
{
cout << x;
}

cout << endl;
}

Затем соберите все это вместе в главном:

int main()
{
char i;
cout << "Enter char ";
cin >> i;

if ((i < 'A') || (i > 'Z'))
{
return 0;
}

for (char x = 'A'; x <= i; x++)
{
printTriangleLine(x);
}
return 0;
}
3

Мы должны запустить цикл с позиции выше символа ‘A’
пока мы не достигли Charanter вы входите

    // procead until reached input letter
while (chNew != c)
{
// go to next letter
chNew++;

// start with 'A' until current char + 1
for (int j = 'A'; j < chNew + 1; j++)
cout << (char)j;
// go to next line
cout << endl;
}

в каждом цикле мы увеличиваем значение символа на 1, чтобы перейти к следующему значению

// go to next letter
chNew++;

внутренний цикл просто напечатать символ из A к следующему значению относительно текущего chNew + 1, это потому, что мы также хотим включить текущий символ в нашу печатную строку.

Вот ваш рабочий код.

#include <iostream>

using namespace std;

int main()
{
char i;
cout << "Enter char ";
cin >> i;
int c = static_cast<int>(i);

// start with 'A' - 1 character
char chNew = 'A' - 1;

// procead until reached input letter
while (chNew != c)
{
// go to next letter
chNew++;

// start with 'A' until current char + 1
for (int j = 'A'; j < chNew + 1; j++)
cout << (char)j;
// go to next line
cout << endl;
}

// we have done
return 0;
}
0
По вопросам рекламы [email protected]