Лекция 1
.pdfКраткое введение в assembler |
Краткое введение в C |
|
Оператор ветвления if-else |
||
1 // even_odd .c |
|
|
2 |
# include < stdio .h > |
|
3 |
# include < stdlib .h > |
|
4 |
|
|
5 int main ( int argc , char |
* argv []) |
|
6 |
{ |
|
7srand ( time ( NULL ));
8 const int r = rand ();
9if (r % 2 == 0)
10printf ("%d is even number \n", r);
11else
12printf ("%d is odd number \n", r);
13return 0;
14}
$ gcc -c even_odd.c -o even_odd.o && gcc even_odd.o -o even_odd $ for i in `seq 0 2`; do
>./even_odd
>sleep 1
>done
1266093312 is even number
953012229 is odd number
652176710 is even number
Браницкий А.А., СПбГУТ |
Лекция 1, Санкт-Петербург, 2021 |
30/38 |
Краткое введение в assembler |
|
Краткое введение в C |
|||
|
Оператор выбора switch-case |
||||
1 |
// |
number .c |
$ gcc -c number.c -o number.o |
||
2 |
# include |
< stdio .h > |
$ gcc number.o -o number |
||
3 |
# include |
< stdlib .h > |
$ ./number |
|
|
4 int |
main ( int argc , char * argv []) |
$ ./number |
1 |
||
5 |
{ |
|
|
one |
|
6 |
|
if ( argc < 2) return 1; |
$ ./number |
2 |
|
7 |
|
const |
int n = atoi ( argv [1]); |
two |
|
8 |
|
switch (n) |
$ ./number |
3 |
|
9 |
|
{ |
|
three |
|
10 |
|
case |
1: |
$ ./number |
4 |
11 |
|
printf (" one \n" ); |
I forgot |
|
|
12 |
|
break ; |
$ ./number |
5 |
|
13 |
|
case |
2: |
I forgot |
|
14 |
|
printf (" two \n" ); |
$ ./number |
6 |
|
15 |
|
break ; |
I forgot |
|
|
16 |
|
case |
3: |
$ ./number |
7 |
17 |
|
printf (" three \n" ); |
I forgot |
|
|
18 |
|
break ; |
$ ./number |
8 |
|
19 |
|
case |
4: |
I forgot |
|
20 |
|
case |
5: |
$ ./number |
9 |
21 |
|
case |
6: |
I forgot |
|
22 |
|
case |
7: |
$ ./number |
0 |
23 |
|
case |
8: |
I don't know |
|
24 |
|
case |
9: |
$ ./number |
10 |
25 |
|
printf ("I forgot \n"); |
I don't know |
||
26 |
|
break ; |
$ ./number -1 |
||
27 |
|
default : |
I don't know |
28printf ("I don 't know \n");
29break ;
30}
31return 0;
32}
Браницкий А.А., СПбГУТ |
Лекция 1, Санкт-Петербург, 2021 |
31/38 |
Краткое введение в assembler |
Краткое введение в C |
|
Цикл со счетчиком |
|
|
1 // sum_for .c |
|
|
2 |
# include < stdio .h > |
|
3 |
|
|
4 int main ( int argc , char |
* argv []) |
|
5 |
{ |
|
6printf (" Enter a non - negative number : ");
7 int n = 0;
8scanf ("%d", &n);
9if (n < 0) return 1;
10 int i = 1, s = 0;
11for (; i <= n; ++i)
12s += i;
13printf ("0 + ... + %d = %d\n", n, s);
14return 0;
15}
$ gcc -c sum_for.c -o sum_for.o $ gcc sum_for.o -o sum_for
$ ./sum_for
Enter a non-negative number: 7 0 + ... + 7 = 28
Браницкий А.А., СПбГУТ |
Лекция 1, Санкт-Петербург, 2021 |
32/38 |
Краткое введение в assembler |
Краткое введение в C |
|
Цикл с предусловием |
||
1 // sum_while .c |
|
|
2 |
# include < stdio .h > |
|
3 |
|
|
4 int main ( int argc , |
char * argv []) |
|
5 |
{ |
|
6printf (" Enter a non - negative number : ");
7 int n = 0;
8scanf ("%d", &n);
9if (n < 0) return 1;
10 int i = 0, s = 0;
11while (++i <= n)
12s += i;
13printf ("0 + ... + %d = %d\n", n, s);
14return 0;
15}
$ gcc -c sum_while.c -o sum_while.o $ gcc sum_while.o -o sum_while
$ ./sum_while
Enter a non-negative number: 7 0 + ... + 7 = 28
Браницкий А.А., СПбГУТ |
Лекция 1, Санкт-Петербург, 2021 |
33/38 |
Краткое введение в assembler |
Краткое введение в C |
|
Цикл с постусловием |
||
1 // sum_do_while .c |
|
|
2 |
# include < stdio .h > |
|
3 |
|
|
4 int main ( int argc , |
char * argv []) |
|
5 |
{ |
|
6printf (" Enter a non - negative number : ");
7 int n = 0;
8scanf ("%d", &n);
9if (n < 0) return 1;
10 int i = 0, s = 0;
11do
12s += i;
13while (++i <= n);
14printf ("0 + ... + %d = %d\n", n, s);
15return 0;
16}
$ gcc -c sum_do_while.c -o sum_do_while.o $ gcc sum_do_while.o -o sum_do_while
$ ./sum_do_while
Enter a non-negative number: 7 0 + ... + 7 = 28
Браницкий А.А., СПбГУТ |
Лекция 1, Санкт-Петербург, 2021 |
34/38 |
Краткое введение в assembler |
Краткое введение в C |
|
Цикл через оператор goto |
||
1 // sum_goto .c |
|
|
2 |
# include < stdio .h > |
|
3 |
|
|
4 int main ( int argc , |
char * argv []) |
|
5 |
{ |
|
6printf (" Enter a non - negative number : ");
7 int n = 0;
8scanf ("%d", &n);
9if (n < 0) return 1;
10 int i = 0, s = 0;
11lab:
12s += i;
13if (++i <= n)
14goto lab;
15printf ("0 + ... + %d = %d\n", n, s);
16return 0;
17}
$ gcc -c sum_goto.c -o sum_goto.o $ gcc sum_goto.o -o sum_goto
$ ./sum_goto
Enter a non-negative number: 7 0 + ... + 7 = 28
Браницкий А.А., СПбГУТ |
Лекция 1, Санкт-Петербург, 2021 |
35/38 |
Краткое введение в assembler |
|
|
|
|
|
Краткое введение в C |
||
|
Рекурсивное вычисление чисел Фибоначчи |
|||||||
1 |
// rec_fib .c |
|
|
|
|
$ gcc -c |
rec_fib.c -o rec_fib.o |
|
|
|
|
|
|||||
2 |
# include < stdio .h > |
|
|
|
|
$ gcc rec_fib.o -o rec_fib |
||
3 |
|
|
|
|
|
|
$ for i in `seq 0 20`; do |
|
4 int |
fib ( int n) |
|
|
|
|
echo $i | ./rec_fib | |
||
5 |
{ |
|
|
|
|
|
sed -e 's/^.\+: // '; |
|
6 |
|
if (n == 0 || n == 1) |
|
|
done |
|
||
7 |
|
return n; |
|
|
|
|
fib(0) = 0 |
|
8 |
|
return fib (n - |
1) + |
fib (n |
- |
2); |
fib(1) = 1 |
|
9 |
} |
|
|
|
|
|
fib(2) = 1 |
|
10 |
|
|
|
|
|
|
fib(3) = 2 |
|
11 int |
main ( int argc , |
char |
* argv []) |
|
fib(4) = 3 |
|||
12 |
{ |
|
|
|
|
|
fib(5) = 5 |
|
13 |
|
printf (" Enter a non - negative number : "); |
fib(6) = 8 |
|||||
14 |
|
int n = 0; |
|
|
|
|
fib(7) = 13 |
|
15 |
|
scanf ("%d", &n); |
|
|
|
fib(8) = 21 |
||
16 |
|
if (n < 0) return 1; |
|
|
|
fib(9) = 34 |
||
17 |
|
printf ("fib (%d) = %d\n", |
n, |
fib(n)); |
fib(10) = 55 |
|||
18 |
|
return 0; |
|
|
|
|
fib(11) = 89 |
|
19 |
} |
|
|
|
|
|
fib(12) = 144 |
|
|
|
|
|
|
|
|
fib(13) = 233 |
|
|
|
|
|
|
|
|
fib(14) = 377 |
|
|
|
|
|
|
|
|
fib(15) = 610 |
|
|
|
|
|
|
|
|
fib(16) = 987 |
|
|
|
|
|
|
|
|
fib(17) = 1597 |
|
|
|
|
|
|
|
|
fib(18) = 2584 |
|
|
|
|
|
|
|
|
fib(19) = 4181 |
|
|
|
|
|
|
|
|
fib(20) = 6765 |
|
|
|
|
|
|
|
|
Браницкий А.А., СПбГУТ |
Лекция 1, Санкт-Петербург, 2021 |
36/38 |
Краткое введение в assembler |
|
Краткое введение в C |
||||||
|
Итеративное вычисление чисел Фибоначчи |
|||||||
1 |
// iter_fib .c |
|
|
$ gcc -c |
iter_fib.c -o iter_fib.o |
|||
|
|
|||||||
2 |
# include < stdio .h > |
$ gcc iter_fib.o -o iter_fib |
||||||
3 |
|
|
|
|
|
|
$ for i in `seq 0 20`; do |
|
4 int |
fib ( int |
n) |
|
|
echo $i | ./iter_fib | |
|||
5 |
{ |
|
|
|
|
|
sed -e 's/^.\+: // '; |
|
6 |
|
int a = 0, b = 1, c; |
done |
|
||||
7 |
|
while |
(n -- |
> |
0) |
fib(0) = 0 |
||
8 |
|
{ |
|
|
|
|
fib(1) = 1 |
|
9 |
|
c |
= |
a |
+ |
b; |
fib(2) = 1 |
|
10 |
|
a |
= |
b; |
|
|
fib(3) = 2 |
|
11 |
|
b |
= |
c; |
|
|
fib(4) = 3 |
|
12 |
|
} |
|
|
|
|
fib(5) = 5 |
|
13 |
|
return |
a; |
|
|
fib(6) = 8 |
||
14 |
} |
|
|
|
|
|
fib(7) = 13 |
|
15 |
|
|
|
|
|
|
fib(8) = 21 |
|
16 int |
main ( int |
argc , char * argv []) |
fib(9) = 34 |
|||||
17 |
{ |
|
|
|
|
|
fib(10) = 55 |
|
18 |
|
printf (" Enter a non - negative number : "); |
fib(11) = 89 |
|||||
19 |
|
int n |
= |
0; |
|
|
fib(12) = 144 |
|
20 |
|
scanf ("%d", &n); |
fib(13) = 233 |
|||||
21 |
|
if (n < 0) return 1; |
fib(14) = 377 |
|||||
22 |
|
printf ("fib (%d) = %d\n", n, fib(n)); |
fib(15) = 610 |
|||||
23 |
|
return |
0; |
|
|
fib(16) = 987 |
||
24 |
} |
|
|
|
|
|
fib(17) = 1597 |
|
|
|
|
|
|
|
|
fib(18) = 2584 |
|
|
|
|
|
|
|
|
fib(19) = 4181 |
|
|
|
|
|
|
|
|
fib(20) = 6765 |
|
|
|
|
|
|
|
|
Браницкий А.А., СПбГУТ |
Лекция 1, Санкт-Петербург, 2021 |
37/38 |
Краткое введение в assembler |
Краткое введение в C |
|
|
Упражнения
1Реализовать программу рекурсивного вычисления факториала заданного числа на assembler
2Реализовать программу итеративного вычисления факториала заданного числа на assembler
3Реализовать программу рекурсивного вычисления факториала заданного числа на С
4Реализовать программу итеративного вычисления факториала заданного числа на С
5 Реализовать программу вычисления суммы ряда 112 + 212 + 312 + 412 + + n12 (íà Ñ èëè assembler)
Браницкий А.А., СПбГУТ |
Лекция 1, Санкт-Петербург, 2021 |
38/38 |