Печатный треугольник в C
Я новичок в C, и у меня есть эта программа, где я пытаюсь напечатать треугольник на основе его высоты как таковой:
/\
/__\
Таким образом, если высота равна 2, то есть 2 из '/', '\' и '_'.
Итак, я написал эти куски кодов:
#include <stdio.h>
int main(void)
{
int noOfRows;
printf("Enter height: ");
scanf("%d", &noOfRows);
int counter, rowNumber;
for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)
{
// For each row, insert numberOfRows - N spaces before printing
for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
printf(" ");
// For each row, print N times the character
printf("/");
for (counter = 0; counter < noOfRows; counter++)
printf("\\");
printf(" ");
printf("\n");
}
return 0;
}
Тем не менее, это дает мне вывод, когда я ввожу 3 в качестве высоты.
/\\\
/\\\
/\\\
Я хочу получить символ '\' с большим количеством пробелов по мере появления каждой новой строки, но я не уверен, как следует изменить цикл for таким образом, чтобы треугольник был сформирован правильно. Пожалуйста, дайте мне знать, если я должен добавить еще вопрос, чтобы прояснить его.
Я внес изменения в код и в настоящее время имею это:
#include <stdio.h>
int main(void)
{
int noOfRows;
printf("Enter height: ");
scanf("%d", &noOfRows);
int counter, rowNumber;
for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)
{
// For each row, insert numberOfRows - N spaces before printing
for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
printf(" ");
// For each row, print N times the character
printf("/");
for (counter = 0 ; counter < rowNumber ; counter++)
if(rowNumber >= 1)
for(int j=0; j<counter +1; j++)
printf(" ");
if(rowNumber != 0)
printf(" ");
printf("\\");
printf("\n");
}
return 0;
}
и теперь мой текущий вывод таков:
Height: 3
/\
/ \
/ \
Height: 5
/\
/ \
/ \
/ \
/ \
Что я сделал не так в коде, который заставляет некоторые '\' идти еще дальше?
4 ответа
Вы можете использовать только два цикла для печати этого шаблона, используя if else. если вы можете использовать несколько условий для пробела, обратной косой черты, прямой косой черты и подчеркивания.
1 #include<stdio.h>
2
3 int main()
4 {
5 int n;
6 int i,j,k;
7 printf("Enter hight of trangle\n");
8 scanf("%d",&n);
9 for(i=0;i<n;i++,printf("\n"))
10 {
11 for(j=-n;j<=n;j++)
12 {
13 if(j<0) k=-j;
14 else k=j;
15
16 if(j==0);
17 else if((j<0)&&(k==(i+1)))
18 printf("/");
19 else if((j>0)&&(k==(i+1)))
20 printf("\\");
21 else if((i+1)==n)
22 printf("_");
23 else
24 printf(" ");
25 }
26 }
27 }
Идея @ Бармара верна и больше не нужна
if(rowNumber != 0)
printf(" ");
Fullcode:
#include <stdio.h>
int main(void)
{
int noOfRows;
printf("Enter height: ");
scanf("%d", &noOfRows);
int counter, rowNumber;
for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++) {
for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
printf(" ");
printf("/");
for (counter = 0 ; counter < rowNumber ; counter++)
if(rowNumber >= 1)
for (counter = 0; counter < rowNumber*2; counter++) {
if (rowNumber == noOfRows-1) {
printf("_");
} else {
printf(" ");
}
}
printf("\\");
printf("\n");
}
}
Вам не нужны две вложенные циклы для печати пробелов между /
а также \\
, Следует просто напечатать rowNumber*2
пространства.
for (counter = 0; counter < rowNumber*2; counter++) {
printf(" ");
}
Вам не нужно тестировать if (rowNumber >= 1)
потому что когда это 0
цикл заканчивается немедленно.
Тем не менее, вам нужно проверить последнюю строку, потому что вы должны напечатать _
вместо места. Так и должно быть:
for (counter = 0; counter < rowNumber*2; counter++) {
if (rowNumber == noOfRows-1) {
printf("_");
} else {
printf(" ");
}
}
Кроме того, вы можете абстрагировать повторяющуюся печать символов в виде:
// print_char(n,c) prints c n-times.
void print_char(int n, char c) {
for (int i = 0; i < n; ++i) {
printf("%c", c);
}
}
так что вам нужно отслеживать только один цикл for при построении треугольника как:
void print_triangle(int height) {
for (int i = 1; i <= height; ++i) {
print_char(height-i, ' '); // print leading empty spaces
printf("/"); // print forward slash
if (i == height) { // print middle dashes/spaces
print_char((height-1)*2, '_'); // <--| |
} else { // |
print_char((i-1)*2, ' '); // <---------|
}
printf("\\\n"); // print backslash
}
}
Например,
int main(void) {
int height;
printf("Enter height: ");
if (scanf("%d", &height) != 1) {
// handle error if scanf fails
}
print_triangle(height);
return 0;
}
а потом,
$ Enter height: 1
/\
$ Enter height: 5
/\
/ \
/ \
/ \
/________\