
- •Какую ide(Среду разработки) выбрать?
- •3) Символьная переменная — char.
- •4) Логическая переменная — bool
- •1) Вывод
- •1) Ввод
- •1)Стандартные математические операции,
- •2)Бинарные операции,
- •2) Бинарные операции, продолжение
- •1) Sqrt(a)
- •3) Fmod(a,b)
- •2) While
- •2) Создание функции.
- •3) Функция для перевода из 10-ой системы счисления в k-ую.
- •Поделиться в соц. Сетях
- •Имя файла:
- •Поделиться в соц. Сетях Структуры данных. Стек
- •1) Сокращение выражений:
- •2) Инкремент, декремент
- •3) Считывание переменных в цикле
- •Поделиться в соц. Сетях
1) Сокращение выражений:
Часто в программе переменную нужно изменить используя ее в качестве параметра. Пример:
1 2 3 |
for (int i = 1; i <= n; i = i + 1) cout << a[i] << " "; cout << "\n"; |
Здесь мы присваиваем значение i + 1 для i, т.е. увеличиваем ее на 1.
Эту и подобные операции можно сократить таким образом:
a += b что равносильно a = a + b;
Также можно сократить любое выражение, включая бинарные.
Пример:
1 |
counter >>= (((a + b) / 15) % 13) & 1; |
Сначала будет выполнятся операции справа от «>>=», лишь затем затем значение counter будет изменено.
Вот все эти сокращения:
1 2 3 4 5 6 7 8 9 10 |
a += b -> a = a + b; a -= b -> a = a - b; a *= b -> a = a * b; a /= b -> a = a / b; a %= b -> a = a % b; a >>= b -> a = a >> b; a <<= b -> a = a << b; a &= b -> a = a & b; a ^= b -> a = a ^ b; a |= b -> a = a | b; |
Их использование не обязательно, но код с такими сокращениями более удобен.
2) Инкремент, декремент
Зачастую требуется увеличить / уменьшить переменную на 1.
Для этого есть операции инкремента и декремента:
i++; и ++i; инкремент
i—; и —i; декремент
Разница между i++ и ++i в том, что i++ сначала приравнивает, а затем увеличивает переменную, ++iнаоборот. Лучше всего пояснить на примере:
1 2 3 4 5 6 7 8 9 |
int a = 0, b = 0, i = 0, j = 0;
a = i++; cout << a << " " << i << "\n"; // вывод: 0 1
b = ++j; cout << b << " " << j << "\n"; // вывод: 1 1 |
Равносильным для него кодом будет:
1 2 3 4 5 6 7 8 9 |
int a = 0, b = 0, i = 0, j = 0;
a = i; i = i + 1; cout << a << " " << i << "\n";
j = j + 1; b = j; cout << b << " " << j << "\n"; |
Тоже самое и с операцией декремента.
3) Считывание переменных в цикле
Бывают случаи, когда нам нужно считать много переменных.
Если мы знаем количество переменных, то решение просто — пустить цикл.
1 2 3 4 |
int n; cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; |
Если мы не знаем количество переменных, то для решения этой задачи мы будем использовать while.
Вот сам код:
1 2 3 4 |
int a[1000], n; while (cin >> a[++n]) answer += a[i]; cout << answer << "\n"; |
Этим while-ом мы будим считывать переменные пока это возможно. Сама программа считывает некоторое количество чисел, попутно записывая их в массив, затем выводит их сумму.
На этом все, спасибо за прочтение. Темой следующего урока будут строки (string).
C++. Консольная змейка
Опубликовано 23.11.2012 автором admin
Любой начинающий программист мечтает написать игру.
Тем же грезил и я (а может и до сих пор). Конечно написать змейку с красивой 3D (ну хотя бы 2D) графикой у вас не получится, но поиграться в консоли нам не запрещали.
Тем кому лень читать код:
w — вверх
a — влево
s — вниз
d — вправо
пробел — секрет
Вот полностью рабочий код консольной змейки с комментариями:
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
# include <iostream> # include <windows.h> # include <time.h> // библиотека, нужна для использования функции Sleep() # include <conio.h> // библиотека, нужна для использования функций kbhit() и getch() using namespace std;char main_color[] = "color ##"; // шаблон для цвета int snake_size, change_x, change_y, coordinates_x[1000], coordinates_y[1000], food_x = -1, food_y = -1; /* snake_size - размер змейки change_x, change_y - в какую сторону движется змейка coordinates_x[1000], coordinates_y[1000] - массивы, хранящие координаты частей тела змейки food_x, food_y - координаты еды PS: координаты головы змейки хранятся в coordinates_x[1], coordinates_y[1] */ char symbol, a[1000][1000]; /* symbol - хранит в себе ASCII код нажатой клавиши a[1000][1000] - наша таблица, в которой происходит вся игра */ const int N = 13, M = 17, INTERVAL = 200; /* константы, N - размер таблицы, а именно высота M - ширина таблицы INTERVAL - интервал в миллисекундах, через каждый этот промежуток времени змейка будет передвигаться */ void change_color() // функция изменения цвета консоли { char x = rand() % 16, y = rand() % 16; if (x == y) ++y; y %= 16; if (x > 9) x += 'A' - 10; else x += '0'; if (y > 9) y += 'A' - 10; else y += '0'; // выбираем рандомные цвета main_color[6] = x; main_color[7] = y; system(main_color); // меняем цвет } void change_direction() // функция, считывающая нажатую клавишу { symbol = getch(); // считываем нажатую клавишу с помощью функции getch() switch (symbol) { case 'w': if(change_x != 1 || change_y != 0) { change_x = -1; change_y = 0; } break; case 'a': if(change_x != 0 || change_y != 1) { change_x = 0; change_y = -1; } break; case 's': if(change_x != -1 || change_y != 0) { change_x = 1; change_y = 0; } break; case 'd': if(change_x != 0 || change_y != -1) { change_x = 0; change_y = 1; } break; // управление змейкой у нас через wasd case 32 : change_color(); break; // если нажат пробел, то меняем цвет консоли default : break; } } void show_table() // функция для вывода таблицы { system("cls"); // очищаем консоль for (int i = 0; i <= N + 1; ++i) for (int j = 0; j <= M + 1; ++j) cout << (i == 0 || j == 0 || i == N + 1 || j == M + 1 ? '#' : a[i][j]) << (j <= M ? "" : "\n"); // выводим таблицу и края } void clear_snake_on_table() // очищаем координаты, в которых располагалась змейка { for (int i = 1; i <= snake_size; ++i) a[coordinates_x[i]][coordinates_y[i]] = ' '; } void show_snake_on_table() // красим координаты змейки { if(change_x == 1 && change_y == 0) a[coordinates_x[1]][coordinates_y[1]] = 'v'; if(change_x == -1 && change_y == 0) a[coordinates_x[1]][coordinates_y[1]] = '^'; if(change_x == 0 && change_y == 1) a[coordinates_x[1]][coordinates_y[1]] = '>'; if(change_x == 0 && change_y == -1) a[coordinates_x[1]][coordinates_y[1]] = '<'; // изменяем тип головы
for (int i = 2; i <= snake_size; ++i) a[coordinates_x[i]][coordinates_y[i]] = '@'; // красим змейку } bool game_over() // проверяем, съела ли змейка саму себя { for (int i = 2; i <= snake_size; ++i) if (coordinates_x[1] == coordinates_x[i] && coordinates_y[1] == coordinates_y[i]) return true; // если координаты головы змейки равны координате какой-либо части тела змейки, то змейка съела саму себя return false; // если все координаты различны, то все в порядке - играем дальше } void check_coordinates() // проверяем, не вышла ли змейка за поле, если да то возвращаем ее обратно { if (coordinates_x[1] > N) coordinates_x[1] = 1; if (coordinates_x[1] < 1) coordinates_x[1] = N; if (coordinates_y[1] > M) coordinates_y[1] = 1; if (coordinates_y[1] < 1) coordinates_y[1] = M; } void next_step() // функция следующего хода, в которой наша змейка сдвигается в сторону на 1 ячейку { clear_snake_on_table(); // чистим таблицу от змейки
for (int i = snake_size; i >= 2; --i) { coordinates_x[i] = coordinates_x[i - 1]; coordinates_y[i] = coordinates_y[i - 1]; } // передвигаем тело змейки
coordinates_x[1] += change_x; coordinates_y[1] += change_y; // передвигаем голову змейки
check_coordinates(); // проверяем в порядке ли координаты
if(coordinates_x[1] == food_x && coordinates_y[1] == food_y) { snake_size++; food_x = -1; food_y = -1; } // если голова змейки там же где и еда, то увеличиваем размер змейки и очищаем координаты змейки
show_snake_on_table(); // рисуем змейку
if (game_over() == true) // если змея укусила себя { cout << "You're looser! \n"; // сообщаем всю правду о игроке system("pause"); // приостанавливаем игру exit(0); // завершаем программу } } bool food_check() // функция проверки на наличие еды на карте { if(food_x == -1 && food_y == -1) return false; // если координаты еды неопределенны то возвращаем true return true; // в остальных случаях false } void place_food() // функция добавления еды на карту { srand(time(NULL)); for (int i = 1; i <= 9; ++i) { int x = rand(), y = rand(); if(x < 0) x *= -1; if(y < 0) y *= -1; x %= (N + 1); y %= (M + 1); if(x == 0) ++x; if(y == 0) ++y; if(a[x][y] != '@' && a[x][y] != 'v' && a[x][y] != '^' && a[x][y] != '<' && a[x][y] != '>') { food_x = x; food_y = y; a[x][y] = '+'; return; } } // ставим в рандомное место еду } void standart_settings() // начальные установки { snake_size = 2; // размер змеи - 2
coordinates_x[1] = 1; coordinates_y[1] = 2; coordinates_x[2] = 1; coordinates_y[2] = 1; // змейка занимает две клетки вправо от координаты {1,1}
change_x = 0; change_y = 1; // змейка движется вправо } int main () { standart_settings(); // задаем стандартные настройки
while (1) // бесконечный цикл { if (kbhit() == true) // если нажата клавиша change_direction(); // обрабатываем нажатую клавишу
next_step(); // двигаем змейку
if(food_check() == false) place_food(); // если нет еды, то ставим ее
show_table(); // рисуем змейку
Sleep(INTERVAL); // "усыпляем" программу на заданный интервал } } |
Текущая версия — 1.1
Обновления:
1.0 : реализовано движение змейки
1.1 : теперь появляется еда, которая увеличивает размер змейки, также можно менять цвет консоли
1.2 : обновлена функция random, теперь появление еды менее предсказуемо.
1.3: обновлена реализация изменения цвета
Код будет улучшаться, а статья обновляться. Все писалось и компилировалось в Dev-C++. Надеюсь было интересно, спасибо за внимание!
С++. Тренировка набора на клавиатуре
Опубликовано 10.11.2012 автором admin
Всем привет))) Сегодня решил выложить код программы для обучения быстрому набору на клавиатуре. Тут все просто, объяснять ничего не буду, только выложу скриншот работы (кстати программа консольная;) ). Все компилируется в Dev-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 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
|
#include<iostream> #include<windows.h> #include<string> #include<time.h> using namespace std; void divide() { cout<<"*-===========-*\n"; //строка для разделения } void after_game() { cout<<"-===********************************===-\n"; //строка для разделения (после игры) } main() { system("color 2F"); cout<<"Powered by Huzin Ruslan Copyright 2011, Inc. All rights reserved.\n"; Sleep(300); cout<<"Loading"; Sleep(500); for(int i=0; i<6; ++i) { cout<<"."; Sleep(500); } cout<<".\n"; cout<<" \n"; Sleep(1000); system("color 20"); system("cls"); start:; system("color 20"); system("title *==Fast_Writer==*"); string name; cout<<"Enter your name:\n"; cin>>name; string surname; cout<<"Enter your surname:\n"; cin>>surname; int word; sta:; system("color 20"); system("title *==Fast_Writer==*"); cout<<"How many words do you want to write?\n"; cin>>word; cout<<"************************\n"; int c=0,f=0,t=0; float duration,total=0,raiting=0; clock_t start,finish; string s[60]={"mother","form","pen","file","ok","phone","father","school","books","shoulder", "informatics","turkish","that","words","write","sister","car","notebook","pencils","house", "computer","socks","socket","netsend","samfile","profile", "hello","these","football","formula","chemistry","power","modem", "call","formation","information","horse","age","those","films","able", "time","rand","clock","read","memory","lyceum","english", "sea","think","mathematics","direct","connection","splitter","desk", "marker","paintball","paint","ball","ring"};//Массив слов(надо добавлять новые) Sleep(200); for(int i=1; i<=3; ++i) { Sleep(600); cout<<i<<endl; } Sleep(600); cout<<"GO\n"; Sleep(300); srand(word);
/*Основной цикл программы, производится вывод слова, сравнение и т.д.*/
for(int i=0; i<word; i++) { cout<<"---------------------\n"; string y=s[0+rand()%60]; cout<<"("<<i+1<<")"<<" "<<y<<"\n"; //вывод слова(рандомно) string m; start=clock(); cout<<" "<<" "<<" "<<" "; cin>>m; finish=clock(); duration=(float)(finish-start)/1000; total=(float)total+duration; if(duration>5){divide();cout<<"Time is up!!!\n";t++;goto next;}; divide(); if(m==y)cout<<"Correct\n",c++;else cout<<"False\a\n",f++; divide(); next: cout<<duration<<"\n"; Sleep(400); }
/*подсчет рейтинга, вывод результатов*/ system("color 30"); after_game(); cout<<" \n"; cout<<"Total time is: "<<total<<endl; cout<<" \n"; after_game(); cout<<" \n"; cout<<"You have "<<c<<" correct and "<<f<<" false answers\n"; cout<<" \n"; after_game(); cout<<" \n"; cout<<"And you didn`t write in time "<<t<<" answer(s)\n"; cout<<" \n"; after_game(); cout<<" \n"; raiting=(float)(word*c)/total+(f*t); cout<<"YOUR RAITING IS: "<<raiting<<endl; cout<<" \n"; after_game(); cout<<" \n"; cout<<" \n"; cout<<" \n"; cout<<"Exit(e)? If you want to continue write 'no'...\n"; exit: string q; cin>>q; if(q=="no") { system("cls"); goto sta; } while(q!="e") { goto exit; } return 0; } |
Ну и конечно же сам exe-шник))).
Вроде все, сегодня ничего нового. Кстати, сейчас пишу чат, в котором будут вкладки для общения с пользователями и т.д. Вообщем что-то похожее на mail.ru агент. Ну конечно далеко до него но все же) Следите за блогом, добавляйте в закладки, как допишу так выкладу цикл статей как писать такого рода чаты(это не просто чат;) )
Ладно вроде все)
C++. Персистентный стек
Опубликовано 23.10.2012 автором admin
В этой статье я хочу рассказать про персистентность, и самую легкую программу которую можно написать используя персистентность. В нашем случае персистентность будет хранить предыдущую информацию не «злоупотребляя» памятью.
Персистентный стек. (Если вы не знаете структуру данных стек, то предлагаю для начала изучить её.)
Изначально будем хранить массив из чисел. В простом массиве числа идут друг за другом, но в нашем случае мы будем подвешивать ячейки массива друг к другу.
Ниже приведен рисунок :
В
этом коде подробно приведена реализация
(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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# include <iostream> # include <cstdio> # include <cstdlib>
using namespace std;
const int MAXN = 10000;
int m[MAXN][3], n;
void insert(int val) {
int index = n; m[++n][1] = index; // Для каждой элемента массива будем хранить два типа данных : m[n][2] = val; // 1) Ячейка к которому подвешен наш эелмент. // 2) Само значение элемента. }
int pop(int ind) {
/* В этой функций мы будем "удалять" нашу ячейку и подвешивать ее к предку предыдущей ячейки. Тем самым присваивая себе значение нашего предка.
Кратко говоря, Сделаем наш элемент равный его предку. */
int ret = m[ind][2], prevind = m[ind][1];
m[ind][1] = m[prevind][1]; // Приравнять предыдущую для нее ячейку. m[ind][2] = m[prevind][2]; // ************************************
return ret; // Вернуть само значение элемента. }
int main () {
for (;;) { // Пускаем бесконечный цикл int x; char ch; cin >> ch; if(ch == '+') { cin >> x; // Вводим значение insert(x); // Добавляем его операцией insert } if(ch == '-') { cin >> x; // Вводим индекс массива // предназначенный для удаления. cout << pop(x) << ' '; // Выводим его старое значение. } }
system("pause"); } |