2013-03-09 3 views
4

Я пытаюсь напечатать рисунок как этотпечать * узор в C++

******* 
*  * 
*  * 
*  * 
*  * 
*  * 
******* 

В этом он должен выглядеть как пустое поле. но почему-то я не получаю еще ближе

я закодированы это до сих пор

#include <iostream> 
using namespace std; 

int main(int argc, char ** argv) { 
for(int i=1;i<=7;i++) 
{ 
    for(int j=1;j<=7;j++) 
    { 
     if(j==1||j==7) 
     printf("*"); 
     else printf(" "); 
    } 

    printf("\n"); 
} 
return 0; 
} 

и мой выход

*  * 
*  * 
*  * 
*  * 
*  * 
*  * 
*  * 

будет хорошо иметь цикл только

+2

Ты почти там, я думаю! Только нужно, чтобы верхняя и нижняя строки отображали звезды везде, а не только в начале в конце. – flup

+1

Я бы заменил 'i' на 'y' и 'j' на 'x', чтобы сделать код более читаемым. «i» и «j» можно легко смутить с первого взгляда, а «x» и «y» более типичны для координат столбца/столбца. – Pete

+0

Поскольку вы, похоже, новичок в программировании, я хочу дать еще один намек: * Не * писать константы буквально в том месте, где они используются (здесь '7'). Вместо этого введите ** named константы ** ('static const int size = 7') и используйте это в циклах. Зачем?Это просто: если вы хотите ** изменить ** размер (скажем, до 10), вам не нужно смотреть на код, где он используется, и заменить 7 на 10 и забыть одно вхождение (или заменить другое 7, которое не размер). Кроме того, код более читается ** **: ваш 7 имеет значение, которое вы не пишете * в словах *. Если вы пишете 'size', это имеет смысл. – leemes

ответ

2

You необходимо вести себя по-разному в течение первого и последнего ряда:

int W = 7, H = 7; 
for(int i=0;i<=H;i++) 
{ 
    for(int j=0;j<=W;j++) 
    { 
    // if row is the first or row is the last or column is the first of column is the last 
    if (i == 0 || i == H-1 || j == 0 || j == W-1) 
     printf("*"); 
    else printf(" "); 
    } 

    printf("\n"); 
} 
+3

Stackoverflow, портит домашние задания для всех! :) – flup

+1

Моя личная политика в отношении домашней работы заключается в том, что я не собираюсь помогать, если вы ленивы, это не тот случай. Кроме того, я не вижу никаких домашних тегов, как бы вы знали, что это домашнее задание? Просто личная догадка? – Jack

+1

Вы помогаете лучше, если объясните, что следует менять вместо того, чтобы просто публиковать рабочий код, на котором вам даже не нужно смотреть снова. – leemes

6

Ваше if состояние просто должно быть:

if (i==1 || i==7 || j==1 || j==7) 

То есть, вы должны проверить, находитесь ли вы на первом или последнем рядах, а также либо в первом или последних столбцах, а затем распечатать a *.

+0

+1 для объяснения – leemes

0

Вы относитесь ко всем линиям одинаково и игнорируете тот факт, что первая и последняя строка должна обрабатываться по-разному. Вам нужно что-то вроде

if (i == 1 || i == 7) 
{ 
    for (j=1;j<7;j++) printf("*"); 
    printf("\n"); 
} 
else { /* your routine */ } 
0

Это то, что ваш код должен выглядеть следующим образом:

#include <iostream> 
using namespace std; 

int main(int argc, char ** argv) { 
for(int i=1;i<=7;i++) 
{ 
    for(int j=1;j<=7;j++) 
    { 
     if(j == 1 || j == 7) 
      printf("*"); 
     else if (i == 1 || i == 7) //added this check 
      printf ("*"); 
     else printf(" "); 
    } 



    printf("\n"); 
} 
return 0; 
} 

Live example

2

Вы очень близки. Проблема в этой строке:

if(j==1||j==7) 

Измените его так, чтобы он также учитывал верхнюю и нижнюю строки.

Успехов

+0

+1 для того, чтобы не просто выбивать какой-то код, а вместо этого давать OP толчок в правильном направлении. –

11
if(j==1||j==7) 
printf("*"); 
else printf(" "); 

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

[Предполагая, что это домашнее задание, я даю лишь намек. Вы почти сделали это, выше намека должно быть достаточно, чтобы заставить это работать.]

+1

+1 не просто рвота из тривиального кода, но вместо этого дает ответ, который фактически ПОМОЧЬ OP. –

1

Эта функция будет работать нормально:

#include <iostream> 
#include <string> 

void printBox(int width, int height) { 
    if (width < 2 or height < 1) return; 
    for (int i = 1; i <= height; i++) { 
     if (i == 1 or i == height) { 
      std::string o(width, '*'); 
      std::cout << o << std::endl; 
     } else { 
      std::string o(width-2, ' '); 
      o = '*' + o + '*'; 
      std::cout << o << std::endl; 
     } 
    } 
} 

Он может быть использован как:

printBox(2, 2); 

который печатает:

** 
** 

Или как:

printBox(6, 4); 

который печатает:

****** 
* * 
* * 
****** 
0

Вам нужен вложенный цикл. Поскольку у вас есть два варианта между ними, вам понадобятся два вложенных цикла. Один для пробелов и один для заполнения '*' в итерации 1 и 7 (0 и 6).

Распечатайте линии 1 и 7 с «*», заполняя граничные звезды. Использование

if (i == 0 || i == 7) // in-case you're initializing i with 0 
    // loop for printf ("*"); 
1

Поскольку я не специалист в области программирования, я придумал этот простой код:

#include <stdio.h> 

int main(void) 
{ 
    int i,j,k,n; 

    printf("Enter no of rows : \n"); 
    scanf("%d", &n); 

    for(i=0; i<n; i++) 
    { 
     if(i == 0 || i == (n-1)) 
     { 
      for(j=0; j <n-1; j++) 
       printf("*"); 
     }    
     else 
     { 
      for(k=0; k<n; k++) 
      { 
       if (k == 0 || k == (n-2)) 
        printf("*"); 
       else 
        printf(" "); 
      } 
     } 

     printf("\n"); 
    } 

    return 0; 
} 
+0

Благодарим атаравати за отступ. – PallavSharma

+0

Это приятно и просто. – CantGetANick

0

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

#include <string> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    int height = 7, width = 7; 

    for(int i=0; i<height; i++) 
    { 
     char c = (i == 0 || i == height-1) ? '*' : ' '; 
     string line(width, c); 
     line[0] = line[width-1] = '*'; 
     cout << line << endl; 
    } 
    return 0; 
} 
1
for(int j=1;j<=7;j++) 
{ 
    if(j==1||j==7) 
     printf("*******\n"); 
    else 
     printf("*  *\n"); 
} 

printf("\n"); 
0
#include <iostream> 
#include<iomanip> 
using namespace std; 

main() 
{ 
     int Width; 
     char MyChar; 
     int LCV; //Loop control 
     int LCVC, LCVR; //Loop control for LCVC=Columns LCVR=Rows 

     cout<<"\nEnter Width: "; cin>>Width; 
     cout<<"\nEnter a Character: "; cin>>MyChar; 

     for (LCV=1;LCV<=Width;LCV++) 
     {cout<<MyChar;} 
     cout<<endl; 
     for(LCVC=1;LCVC<=Width;LCVC++) 
     { cout<<MyChar<<setw(Width-1)<<MyChar<<endl; 

     } 
     for (LCV=1;LCV<=Width;LCV++) 
     {cout<<MyChar;} 
     cout<<endl; 
     system("pause"); 
} 

/* 
Enter Width: 6 

Enter a Character: # 
###### 
# # 
# # 
# # 
# # 
# # 
# # 
###### 
Press any key to continue . . . 
*/ 
0

Распечатать эту модель введите номер = каждый номер, например 23517 **



*


Тогда ** * ***** * ******* тогда ** * * * ***** *


и * * * * *

+1

Добро пожаловать в переполнение стека! Похоже, что ваш ответ подвергся некорректному форматированию. Ты можешь починить это? – Celeo