\- 1. Маленькие хитрости
\- контроль корректности при исполнении программы
assert(z\[i\] \!= LLONG_MAX);
\- измерение времени выполнения и производительности процесора
cerr << fixed << setprecision(0)
<< "TIME = " << clock() / (ld)CLOCKS_PER_SEC * 1000 << "\n";
\- для выхода из множества циклов внутри процедуры
return 0
\- 1LL - константа 1 типа long long
ans+=1LL*(выражение типа int), когда сумма превысит int
\- да и нет по русски
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,a\[50\],i;
char d,dd,u,uu,uuu;
d=164; dd=160; u=173; uu=165; uuu=226;
cin >> m >> n;
for(i=0;i<n;i++) cin >> a\[i\]; i=0;
while(i<n && a\[i\]\!=m) i++;
if(i==n) cout << u << uu << uuu;
else cout << d << dd;
}
0. Для передачи значения обратно из функции в вызывающую программу
пишем знак & (передать адрес), например
bool Good(int &x) {...}
Пример
#include <bits/stdc++.h>
using namespace std;
void Split(int x, int &x1, int &x2, int &x3)
{
x1=x%10;
x3=x/100;
x2=(x/10) % 10;
}
int main()
{
int i,i1,i2,i3,
j,j1,j2,j3,
n,a2,a3;
cin >> n;
...
Split(i,i1,i2,i3);
Split(j,j1,j2,j3);
if (((i1+i2+i3)==(j1+j2+j3)) && (abs(i-j)>a3))
a3=abs(i-j);
}
1. Порядок вычисления логических выражений
Для && слева направо
&& гарантирует что второй операнд не вычисляется, если первый - ложь.
while ( (k<=es) && (s\[k\]\!=t) ) k++;
к s\[k\] не происходит обращения, если k>es
2. iostream::sync_with_stdio(false);
cin.tie(NULL);
\- для ускорения потокового ввода
3. Объявление файлов
(стандартный потоковый ввод-вывод)
ifstream cin("round.in");
ofstream cout("round.out");\\
или так
freopen("auto.in", "r", stdin);
freopen("auto.out", "w", stdout);
или так - потоковый ввод-вывод
с файловыми переменными fin fout
ifstream fin("perimeter.in");
ofstream fout("perimeter.out");
fin >> n;
fout << n;
Работа с файлом, если он есть
и с клавиатурой в противном случае
if (fopen("boarding.in", "r"))
{
freopen("boarding.in", "r", stdin);
freopen("boarding.out", "w", stdout);
}
Работа с файлом, на своей машине
и с клавиатурой/экраном на DL
#ifndef CONTEST
ifstream cin("input.txt");
ofstream cout("output.txt");
#endif
Работа до конца входного файла
ifstream cin("input.txt");
ofstream cout("output.txt");
cin >> a;
while (not cin.eof())
{
...
cin >> a;
}
4. Знаковые
2 байта - int
4 байта - long int
8 байт \- long long
беззнаковые \- unsigned (int, long int, long long)
5. Константы
#define MaxN 1e5;
const int MaN = 1e5;
6. ans = (ans==INF) ? \-1 : ans; // если ans=INF занесnи туда \-1
условие true false
7. Как вернуть значение в вызывающую программу ?
\- написать & перед именем переменной
то есть в подпрограмму передаётся не значение, а адрес
и потому в подпрограмме модифицируется сама переменная
из вызывающей программы
bool Found(int &x, int &y)
{
for (int i=0; i<8; i++)
for (int j=0; j<8; j++)
if (not Marked\[i\]\[j\])
{ x=i; y=j; return true;};
return false;
}
8. Работа в Codeblocks
\- ДУБЛИРОВАНИЕ СТРОКИ
ctrl+D
\- СДВИГ ТЕКСТА ВПРАВО/ВЛЕВО
отмечаем несколько строк и можно сдвигать их
вправо - клавишей TAB
влево \- клавишами Shift + TAB
9. Массив инициализируется нулями при объявлении?
Массивы в C+\+ по стандарту по умолчанию не обнуляются.
Но для обнуления есть отдельный краткий синтаксис:
http://stackoverflow.com/questions/1920430/c-array-initialization
Поэтому можно писать по вкусу:
int a\[10\] = {0};
int a\[10\] = {};
int a\[10\] {0};
int a\[10\] {};
Тогда отдельный обнуляющий цикл не понадобится.\\
Некоторые компиляторы, такие как GCC, заполняют все элементы массива нулями при его создании.
https://code-live.ru/post/cpp-arrays/
А вот эта программа без ручного обнуления не проходит:
\#include <bits/stdc++.h>
using namespace std;
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int g\[15\],n,m,k,i,x,y,ans;
cin>> n >> m >> k;
for (i=0; i<n; i++) g\[i\]=0; // без этого оператора не сдаётся
for (i=0; i<n; i++)
{
cin >> x >> y;
g\[--x\]=1; g\[--y\]=1;
}
ans=0;
for (i=0; i<n; i++)
if (g\[i\]==0) ans++;
cout << ans;
}