2 / 2 / 1
Регистрация: 26.08.2009
Сообщений: 21
1

Вывод пустого квадрата из звездочек

28.08.2009, 00:18. Показов 17119. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу написать программу для вывода пустого квадрата из "*" в Си. Заполненный квадрат выводится без проблем, через 2 цикла for... Это задачка из Дейтла. Перепробовал и так и так, но не идёт. Заранее Вам большое спасибо!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2009, 00:18
Ответы с готовыми решениями:

Два квадрата из звездочек
Дейтлы, номер 3.33 "Напишите программу,которая считывает размер стороны квадрата и затем выводит...

Считываение размера стороны квадрата и вывод этого квадрата в виде звездочек
Помогите усовершенствовать программу: программа считывает размер стороны квадрата и затем выводит...

Вывод квадрата из звездочек заданного размера
Напишите программу, которая отображает у левого края экрана сплошной квадрат из звездочек, сторона...

Генератор квадрата из звездочек по заданным параметрам
В книге по с++ дали задание написать программу для генерации квадрата по заданному значению. Т.е...

21
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.08.2009, 00:33 2
давайте за основу возьмем ваш код "заполненного квадрата". где он?
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
28.08.2009, 00:40 3
А как заполненный вывел - покажи программу ?!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12453 / 7478 / 1752
Регистрация: 25.07.2009
Сообщений: 13,748
28.08.2009, 02:24 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от fern Посмотреть сообщение
Не могу написать программу для вывода пустого квадрата из "*" в Си. Заполненный квадрат выводится без проблем, через 2 цикла for... Это задачка из Дейтла. Перепробовал и так и так, но не идёт. Заранее Вам большое спасибо!!!
Можно так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <string.h>
 
/* квадраторисовалка */
 
#define SIDE_SIZE 10
 
int main(){
    char row[SIDE_SIZE + 1];
    int i;
    
    /* верхняя строка */
    memset(row, '*', SIDE_SIZE);
    /* завершающий ноль */
    row[SIDE_SIZE] = 0;
    printf("%s\n", row);
    /* середина */
    memset(row + 1, ' ', SIDE_SIZE - 2);
    for ( i = 0; i < SIDE_SIZE - 2; i++ )
        printf("%s\n", row);
    /* нижняя сторона */
    memset(row, '*', SIDE_SIZE);
    printf("%s\n", row);
    
    return (0);
}
но она прямоугольники рисует...

Добавлено через 52 минуты
Ну или примерно, как в учебниках пишут:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
 
/* квадраторисовалка c циклами */
 
#define SIDE_SIZE 10
 
int main(){
    
    int i, j;
    
    /* top */
    for ( i = 0; i < SIDE_SIZE; i++ )
        putchar('*');
    putchar('\n');
    
    /* middle */
    for ( i = 0; i < SIDE_SIZE - 2; i++ ){
        putchar('*');
        for ( j = 0; j < SIDE_SIZE - 2; j++ )
            putchar(' ');
        putchar('*');
        putchar('\n');
    }
    
    /* bottom */
    for ( i = 0; i < SIDE_SIZE; i++ )
        putchar('*');
    putchar('\n');
 
    return (0);
}
2
2 / 2 / 1
Регистрация: 26.08.2009
Сообщений: 21
28.08.2009, 11:50  [ТС] 5
Примерно так

C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
main()
{
    int a, b;
 
    for (a = 1; a <= 7; a++)
       for (b = 1; b <= 7; b++)
          printf ("%s", '*');
 
   return 0;
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12453 / 7478 / 1752
Регистрация: 25.07.2009
Сообщений: 13,748
28.08.2009, 12:25 6
Цитата Сообщение от fern Посмотреть сообщение
Примерно так

C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
main()
{
    int a, b;
 
    for (a = 1; a <= 7; a++)
       for (b = 1; b <= 7; b++)
          [U]printf ("%s", '*');[/U]
 
   return 0;
}
Или printf("%c", '*') или printf("%s","*") + конец строки как-то обозначить надо, а так она 56 звёзд в одну строку выведет.
1
47 / 47 / 3
Регистрация: 07.01.2009
Сообщений: 297
28.08.2009, 12:36 7
Вам что нужно,чтобы выводил ровный квадрат или выводилась матрица с одинаковым размером?
Просто таким способом,каким здесь написали(и котороый я выложил) не получится вывести в консоли квадрат с идеально одинаковыми сторонами,будет только одинаковое количество символов в строке и встолбцах,т.к. это не ascii art,для него нужен специальный алгоритм.А чтобы получился квадрат,который на глаз будет иметь одинаковые стороны ,нужно выводить каждый пиксель,на С не знаю как сделать,но знаю как на ассемблере.Выкладываю код на С,если нужен пример с выводом каждого пиксела,то выложу:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
 
const int N = 10;
 
int main()
{
    char symb[2] = { '*',0 };
    char symb1[2] = { ' ',0 };
    int i,j;
 
    for(i = 0;i < N; ++i)
    {
 
        if((i == 0)||(i == N - 1))
        {
            for(j = 0;j < N; ++j)
            {
                printf("%s",symb);
            }
            printf("\n");
        }
        else if((i > 0)&&(i < N))
        {
            printf("%s",symb);
            for(j = 0;j < N - 2; ++j)
            {
                printf("%s",symb1);
            }
            printf("%s\n",symb);
        }
    }
 
    return 0;
}
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12453 / 7478 / 1752
Регистрация: 25.07.2009
Сообщений: 13,748
28.08.2009, 12:43 8
заполненный можно так нарисовать:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
/* квадраторисовалка c циклами и заполнением */
 
#define SIDE_SIZE 10
 
int main(){
        
        int i, j;
        
        for ( i = 0; i < SIDE_SIZE; i++ ){
                for ( j = 0; j < SIDE_SIZE; j++ )
                        putchar('*');
                putchar('\n');
        }
 
        return (0);
}
1
Человек
97 / 82 / 7
Регистрация: 16.06.2009
Сообщений: 229
28.08.2009, 12:44 9
а можно так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
main()
{
    int a, b;
 
    for (a = 1; a <= 7; a++){
       for (b = 1; b <= 7; b++)
          (a>1 && a <7 && b>1 && b <7) ? printf ("%c", ' ') : printf ("%c", '*');
       printf("%c", '\n');
    }
 
   getchar();
   return 0;
}
1
47 / 47 / 3
Регистрация: 07.01.2009
Сообщений: 297
28.08.2009, 13:09 10
Вот набрал код на ассемблере (если нужно иметь идеальный квадрат) :
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
code_seg segment 
assume cs:code_seg, ds:code_seg, ss:code_seg 
org 100h 
start:
        
        
;  display mode is 80x25        
        mov Ah, 0h
        mov al, 13h 
        int 10h 
        mov Ah,0ch
        mov AL,02h
        
        mov DX,x_coord
        mov BX,size
        mov CX,y_coord
        
        bgg2: 
        add Dx, 1
        int 10h
        dec BX      
        cmp bx,0
        JE end_1
        jmp bgg2  
        
        end_1:  
        int 10h 
        mov BX,size
        
        bgg1:
        
        add CX, 1
        int 10h
        dec BX      
        cmp bx,0
        JE next_line
        jmp bgg1
        
         
 
        next_line:
        mov BX,size
        cycl: 
        sub DX,1
        int 10h
        dec BX      
        cmp bx,0
        JE next_line2
        jmp cycl
        
        
        next_line2:
        mov BX,size
        cycl1: 
        sub CX,1
        int 10h
        dec BX      
        cmp bx,0
        JE end_3
        jmp cycl1
        
        
        
        end_3:
 
        int 20h
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
size EQU 100
 
; original coordinates of the left verter of the square
y_coord EQU 50
x_coord EQU 20
                   
code_seg ends 
end start
Вот так он выглядит в консоли:
Изображения
 
2
Человек
97 / 82 / 7
Регистрация: 16.06.2009
Сообщений: 229
28.08.2009, 13:44 11
Ёрик, а можеш подробней описать как ты виводиш прямую?
1
47 / 47 / 3
Регистрация: 07.01.2009
Сообщений: 297
28.08.2009, 14:25 12
вывожу пиксель(в регистры кладу координаты пикселя),затем увеличиваю сначала y (x остается прежним) и вывожу определенное кол-во раз(длины стороны),затем увеличиваю x,также все вывожу,затем соответственно уменьшаю y и потом снова уменьшаю x.
Ну, начерти декартовую систему координат и посмотри,это очень легко!Если непонятно объяснил,то смотри внизу пошагово:
http://slil.ru/27934845
2
39 / 17 / 1
Регистрация: 21.08.2009
Сообщений: 63
28.08.2009, 14:38 13
Я бы это сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <cstdlib>
#include <iostream>
const int M=10;
using namespace std;
 
void Kvadrat(int w, int h, char ch,char ch1=' '){
     if((w==0)||(h==0))return;
     if (w>80) w=80;
     for(int i=0;i<w;i++)cout<<ch;
     if(w<80)cout<<endl;
     for(int i=2;i<h;i++){
             cout<<ch;
             for (int j=2;j<w;j++)cout<<ch1;
             if(w>1)cout<<ch;
             if(w<80)cout<<endl;             
     }
     if (h>1){
        for(int i=0;i<w;i++)cout<<ch;
        if(w<80)cout<<endl;  
     } 
}
int main(int argc, char *argv[]){
    Kvadrat(15,M,'*');
    Kvadrat(M,M,'*','0');
    system("PAUSE");
    return EXIT_SUCCESS;
}
1
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
28.08.2009, 14:51 14
вот простое решение в лоб
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <conio.h>
int main()
{
    setlocale(LC_ALL, "Russian");
    int m, n, i, j;
    printf("Введите высоту:\n> "),scanf("%d", &n);
    printf("Введите ширину:\n> "),scanf("%d", &m);
 
    for(i = 0; i < m; ++i, printf("*"));
    for(i = 1; i < n - 1; ++i, printf("*"))
    {
        printf("\n*");
        for(j = 1; j < m - 1; ++j, printf(" "));
    }
    printf("\n");
    for(i = 0; i < m; ++i, printf("*"));
    printf("\n");
    system("pause");
    return 0;
}

можно задавать размеры вручную
0
47 / 47 / 3
Регистрация: 07.01.2009
Сообщений: 297
28.08.2009, 17:01 15
Тут вообще на Си просят,нужно соответсвующие заголовочные файлы,т.е. не iostream,a <studio.h>.Видно,новичок создавал тему,поэтому нужно исправить,чтобы он не запутался,т.к. этот код не скомпилируется на С.
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
28.08.2009, 17:40 16
а вот
так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <conio.h>
int main()
{
    int m, n, i, j;
    printf("Enter a height:\n> "),scanf("%d", &n);
    printf("Enter a width:\n> "),scanf("%d", &m);
    for(i = 0; i < m; ++i, printf("*"));
    for(i = 1; i < n - 1; ++i, printf("*"))
    {
        printf("\n*");
        for(j = 1; j < m - 1; ++j, printf(" "));
    }
    printf("\n");
    for(i = 0; i < m; ++i, printf("*"));
    printf("\nFor continuation press any key...");
    _getch();
    return 0;
}

Я просто С не знаю
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
28.08.2009, 18:13 17
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdbool.h>
 
//........................................................горизонтальная линия
void line(unsigned length, bool filled)
{
    int n;
    char ch = filled? '*' : ' ';
 
    putchar('*');
    for(n = 0; n < length; ++n) putchar(ch);
    printf("*\n");
}
 
//.....................................................................квадрат
void rectangle(unsigned width, unsigned height, bool filled)
{
    int n;
 
    line(width, true);
    for(n = 0; n < height; ++n) line(width, filled);
    line(width, true);
}
 
int main()
{
    rectangle(10, 7, true);  // заполненный
    putchar('\n');
    rectangle(10, 7, false); // незаполненный
    return 0;
}
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12453 / 7478 / 1752
Регистрация: 25.07.2009
Сообщений: 13,748
28.08.2009, 20:30 18
Цитата Сообщение от rangerx Посмотреть сообщение
void rectangle(unsigned width, unsigned height, bool filled)
"Овал - это круг, в который можно вписать квадрат 25х40"(с)
Проще надо быть! Вот у DreamWolf был хороший вариант Разве, что строка с условием вот так:
C
1
printf("%c", (a>1 && a <7 && b>1 && b <7) ? ' ' : '*');
по-моему красивше смотрится, но сути не меняет. Думаю, что такое вот решение заданием и предполагалось...
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.08.2009, 22:07 19
с квадратом разобрались. эллипс, я думаю, тоже получится. давайте на чистом си нарисуем дракона или на худой конец кривую безье.
вспомнил как когда-то коллеге-ученому (сейчас коммерсантЪ-персионэр) понадобилось рисовать на фортране (на печати, естественно, "устройство 00F") графики функция, и как мне пришлось изощряться. давайте повторим это на си. условие:
имеем 133 символа в строке, "рисовать" можем только блоками по четыре байта, которые имеем возможность определить заранее:

"* "
" * "
" * "
" *"

давайте хотя бы x ** 2 нарисуем для начала. в диапазоне значений аргумента 0-11 (фя получится 0-121 если кто забыл).
1
2 / 2 / 1
Регистрация: 26.08.2009
Сообщений: 21
28.08.2009, 22:58  [ТС] 20
Индивидуальное спасибо DreamWolf!!! Задача с использованием тернарного оператора мне очень даже подходит и всё понятно. Скорее всего, в учебнике Дейтла имелась в виду квадратная матрица, а не правильная геометрическая фигура. Да и не под силу начинающему программисту написать сложную программу. Освоение ассемблера ещё в переди, пока ещё не дорос. Всем большое пребольшое спасибо за ваши ответы. Задача решена...
0
28.08.2009, 22:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2009, 22:58
Помогаю со студенческими работами здесь

Печать квадрата из звездочек. Как сделать лучше?
Я написал программу, которая печатает из звездочек квадрат с заданной стороной. Например, квадрат...

Вывод звездочек
Мне задали домашнее задание.В нем должен быть хотябы один цикл а желательно два программа должна...

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

Вывод звездочек в промежутке от 30 до 40
Ребят, подскажите как сделать чтобы с промежутка от 30 до 40 выводились звездочки) Например, если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru