Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.47 Mб
Скачать

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");

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]