А. Богатырев - Руководство полного идиота по программированию (на языке Си) (1109482), страница 3
Текст из файла (страница 3)
Руководство полного идиота<br> по программированию (на языке Си)}Тут в цикле проверяется четность индекса i.03.c/* Треугольник из звездочек */#include <stdio.h>/* putchar('c') - печатает одинокий символ c *//* символ \n - переводит строку*//* nstars - сколько звездочек напечатать*//* Функция рисования одной строки треугольника */void drawOneLine(int nstars){int i;/* номер печатаемой звездочки, счетчик */for(i=0; i < nstars; i++) /* Рисуем nstars звездочек подряд */putchar('*');putchar('\n');/* И переходим на следующую строку */}void main(){/* ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ */int nline;/* номер строки *//* ВЫПОЛНЯЕМЫЕ ОПЕРАТОРЫ (ДЕЙСТВИЯ) */for(nline=1; nline <= 25; nline++)drawOneLine(nline);/* сколько звездочек? столько же, каков номер строки */}04.c/* Треугольник из звездочек *//* Тот же пример со вложенным циклом, а не с функцией */#include <stdio.h>void main(){/* ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ */int nline;/* номер строки */int i;/* номер печатаемой звездочки, счетчик *//* ВЫПОЛНЯЕМЫЕ ОПЕРАТОРЫ (ДЕЙСТВИЯ) */for(nline=1; nline <= 25; nline++){/* сколько звездочек? столько же, каков номер строки */for(i=0; i < nline; i++)putchar('*');putchar('\n');}}05.c/* Треугольник из звездочек *//* Теперь треугольник должен быть равнобедренным */file:///Volumes/WININSTALL/assets/materials_informatiks.html17/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)#include <stdio.h>/* nstars - сколько звездочек напечатать*//* nspaces - сколько пробелов напечатать перед звездочками */void drawOneLine(int nspaces, int nstars){int i;/* номер печатаемой звездочки, счетчик *//* он же - номер печатаемого пробела */for(i=0; i < nspaces; i++)putchar(' ');for(i=0; i < nstars; i++)putchar('*');putchar('\n');}/*...*..***.************n (номер строки)1234Всего строк:Число звездочек в n-ой строке:Число пробелов спереди (обозначены точкой):LINESn*2 - 1LINES - nВсе эти числа подсчитываются с картинки...Их мы будем передавать в функцию drawOneLine в точке _вызова_,а не вычислять в самой функции.
Функция для того и заведена,чтобы не вычислять ничего КОНКРЕТНОГО все параметры ее переменные, и должны ПЕРЕДАВАТЬСЯ в нееиз точки вызова.В качестве параметра в точке вызова можно передавать нетолько значение переменной, но и значение выражения,то есть формулы.*/void main(){/* ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ */int LINES = 25; /* всего строк.Это описание переменнойсразу с ее инициализацией*/int nline;/* номер строки *//* ВЫПОЛНЯЕМЫЕ ОПЕРАТОРЫ (ДЕЙСТВИЯ) */for(nline=1; nline <= LINES; nline++)drawOneLine(LINES - nline, /* число пробелов --> nspaces */nline*2 - 1/* число звездочек --> nstars */);}06.c/* Треугольник из звездочек *//* Теперь треугольник должен быть равнобедренным */#include <stdio.h>file:///Volumes/WININSTALL/assets/materials_informatiks.html18/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)void drawOneLine(int nspaces, int nstars){int i;/* номер печатаемой звездочки, счетчик *//* он же - номер печатаемого пробела */for(i=0; i < nspaces; i++)putchar(' ');for(i=0; i < nstars; i++)putchar('*');putchar('\n');}void main(){/* ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ */int LINES = 25; /* всего строк. */int nline;/* номер строки *//* Для человека естественно считать с 1.Для машины же первое число - это НУЛЬ.Поэтому циклfor(nline=1; nline <= LINES; nline++)Следует записать в видеfor(nline=0; nline < LINES; nline++)Он тоже выполнится 25 раз, но значение переменной-счетчикаnline будет на каждой итерации на 1 меньше. Поэтому надопоменять расчет параметров для функции рисования.n (номер строки)0123...*..***.************Всего строк:Число звездочек в n-ой строке:Число пробелов спереди (обозначены точкой):LINESn*2 + 1LINES - n - 1*//* ВЫПОЛНЯЕМЫЕ ОПЕРАТОРЫ (ДЕЙСТВИЯ) */for(nline=0; nline < LINES; nline++)drawOneLine(LINES - nline - 1, nline*2 + 1);}07.c/*Тип переменных для хранения БУКВ называетсяchar(от слова character).Буквы изображаются в одиночных кавычках 'a' 'b''+'.Пример:char letter;letter = 'a';putchar(letter);letter = 'b';putchar(letter);file:///Volumes/WININSTALL/assets/materials_informatiks.html19/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)letter = '\n';putchar(letter);Символ '\n' обозначает "невидимую букву" переход на новую строку, new line.Есть несколько таких специальных букв, о них - позже.Зато сразу сделаем оговорку.Чтобы изобразить саму букву \следует использовать '\\'putchar('\');printf ("\");Надо:илиошибочны.putchar('\\'); printf("\\");Дело в том, что символ \ начинает последовательность из ДВУХ букв,изображающих ОДНУ букву, иногда вызывающую специальныедействия на экране или на принтере.*//*Число делится на n, если ОСТАТОК от деления его на n равен 0,то есть если(x % n) == 0В частности, так можно проверять числа на четность/нечетность,беря x%2.Остатки от деления числа x на nэто 0 1 2 ...
n-1.В случае деления на 2 остаток0 соответствует четному x1 соответствует нечетному x*//* Задача:Нарисовать треугольникиз звездочек в нечетных строкахиз плюсиков в четных строках*--------------------------------------------------------*Решение: используем прежнюю программу,добавив в функцию drawOneLine еще один аргумент - symbol каким символом рисовать строку.Далее в основном цикле используем условный оператор ипроверку номера строки на четность.*/#include <stdio.h>void drawOneLine(int nspaces, int nsymbols, char symbol){int i;/* счетчик */for(i=0; i < nspaces; i++)putchar(' ');for(i=0; i < nsymbols; i++)putchar(symbol);putchar('\n');file:///Volumes/WININSTALL/assets/materials_informatiks.html20/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)}/* Мы вынесем объявление этой переменной из функции,сделав ее "глобальной", то есть видимой во ВСЕХ функциях.*/int LINES = 25; /* всего строк. */void main(){/* ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ */int nline;/* номер строки *//* ВЫПОЛНЯЕМЫЕ ОПЕРАТОРЫ (ДЕЙСТВИЯ) */for(nline=0; nline < LINES; nline++){if((nline % 2) == 0)/* четное ? */drawOneLine(LINES - nline - 1, nline*2 + 1, '+');elsedrawOneLine(LINES - nline - 1, nline*2 + 1, '*');}}08.c/* То же самое, но теперь нужно еще и печатать номер строки.*/#include <stdio.h>/* Вообще-то глобальные переменныепринято объявлять в самом начале файла с программой.*/int LINES = 25; /* всего строк.
*//* Добавим к функции еще один аргумент, указатель - печатать линомер строки. Назовем его drawLineNumber.Не впадите в заблуждение по аналогии с именем ФУНКЦИИ drawOneLine() !В данном случае - это имя ПЕРЕМЕННОЙ - АРГУМЕНТА ФУНКЦИИ.Оператор if(x) .....;РАБОТАЕТ ТАКИМ ОБРАЗОМ (так он устроен):в качестве условия он принимает целое число (типа int).Условие истинно, если x != 0,и ложно, еслиx == 0.Второй добавленный аргумент - собственно номер строки.*/void drawOneLine(int nspaces,int nsymbols,char symbol,/* а это мы добавили */int drawLineNumber,int linenum){int i;/* счетчик */if(drawLineNumber)printf("%d\t", linenum); /* без перевода строки *//* На самом деле это условие более полно надо записывать какif(drawLineNumber != 0)file:///Volumes/WININSTALL/assets/materials_informatiks.html21/6803.06.2015Андрей Богатырев.
Руководство полного идиота<br> по программированию (на языке Си)но в языке Си это то же самое.*//* Тут мы снова видим новый специальный символ \t - ТАБУЛЯЦИЯ.Весь экран (или лист бумаги) условно поделенна колонки шириной по 8 позиций.Примерно так:|||||||||...Символ табуляции вызывает переход из текущей позиции в начало следующейколонки.
Например|||||||||...^ отсюда|||||^ в это место||||...*/for(i=0; i < nspaces; i++)putchar(' ');for(i=0; i < nsymbols; i++)putchar(symbol);putchar('\n');}void main(){/* ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ */int nline;/* номер строки *//* ВЫПОЛНЯЕМЫЕ ОПЕРАТОРЫ (ДЕЙСТВИЯ) */for(nline=0; nline < LINES; nline++){if((nline % 2) == 0)/* четное ? */drawOneLine(LINES - nline - 1, nline*2 + 1, '+', 1, nline);elsedrawOneLine(LINES - nline - 1, nline*2 + 1, '*', 9, nline);}/* А почему именно 1 или именно 9 ?* А все что попало, лишь бы не 0.* Можно 3, 333, 666, -13445, итп** Вопрос: что будет, если тут написать 0 ?*/}09.c/* Следующая задача будет касаться того,чтобы каждая строка треугольника печаталасьв виде:*+*+*+*.....*+*Тут нам уже придется модифицировать функцию рисования строки.*/#include <stdio.h>int LINES = 25; /* всего строк.
*/void drawOneLine(int nspaces, int nsymbols){int i;for(i=0; i < nspaces; i++)file:///Volumes/WININSTALL/assets/materials_informatiks.html22/6803.06.2015Андрей Богатырев. Руководство полного идиота<br> по программированию (на языке Си)putchar(' ');/* в цикле мы будем проверять на четность НОМЕРпечатаемого символа.*/for(i=0; i < nsymbols; i++){if((i % 2) == 0)putchar('*');elseputchar('+');}putchar('\n');}void main(){int nline;/* номер строки */for(nline=0; nline < LINES; nline++) {drawOneLine(LINES - nline - 1, nline*2 + 1);}}10.c/* Задача нарисовать РОМБ:**************/#include <stdio.h>int LINES = 10; /* всего строк в половине ромба.