Upload
robert-sullivan
View
240
Download
0
Embed Size (px)
DESCRIPTION
Σημειώσεις c
Citation preview
1
. /
C
( ANSI)
.
2011
2
1.
C . , C , BASIC Pascal. . bits, bytes , - .
, C , ' .
C , 32 ANSI 159 BASIC. - , - .
C "" ( C - ). -. - . - . "" C.
C - , - , - . C .
1.1 ANSI C++
C . - ANSI - . - .
, - , - C . - C++ C -. ANSI C C++. -
3
, , .
, , - ANSI 4.5 Borland. , , - .
1.2
C .
, - C, . - bit. bits 1 0 .
bits , 8 bits, bytes. bytes 0. byte, , byte.
1.3 /
/. -. bites.
bytes bits 0 1 . 351 - 101011111. 2 bytes, 16 bits
0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
To bit . + bit 0 bit 1.
x10 [0.1 , 1) - . 23,45 0,2345x10
2. 23,45 . 2345 2 . , bytes , . -
4
. - 2 .
4 bytes. byte - 3 -.
S S
bit . 7 bits 128 ( 2 - ). - 1038. - 38 31 bits - 6 7 . - .
- . , , . 5 .
bytes . 2 byte 6 10308 18 .
2. C
2-1 32 - ANSI C. - . C .
5
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
2-1. ANSI C
C . , for , FOR For .
C ; . C - , ; - . . C -. - ;. . C .
C blocks - .
block { }. blocks -. block -. block , - blocks. blocks - C.
C . C . .
( ) block. { }. block .
C . , , -. .
- main(). -
6
. main() , C, .
main()
{
}
.
.
.
.
.
fn()
{
}
2-1. C
C - (.. , ...). . , . - blocks block.
.
C - . /* */.
. -
/* : test.c
: ANSI C */
.
3. , , C
C, , - .
- , , - .
7
-.
3.1 C
C -, , . (strings) 1 32 . - a-z, A-Z, 0,1,...,9 _. .
Ab_d32 _aBC5
3Abcd .
3.2 .
bytes bytes .
. C, , .
C, bytes - , - bytes 8 bit, 3-1. ' .
Bytes
char 1 -128 127
int 2 -32768 32767 float 4 3.4E-38 3.4E+38
double 8 1.7E-308 1.7E+308 void 0 -
3-1. C
C structures, unions ...,. .
char int , float double . void - . , - . - , , void.
C - , char ASCII -. .
8
, ASCII , - .
TRUE FALSE .
3.3
- - bytes -. C - . :
signed
unsigned
long
short
signed unsigned char int. , -
signed char x;
x 1 byte .
unsigned int k;
k bit byte . - k 0 , 2 bytes, 0 65535 216-1.
int 2 4 bytes -. long short, int, - :
short , -, 2 bytes. - long 4 bytes . short long int short int long int short - long .
unsigned long k;
unsigned short k;
long long double bytes .
9
3.4
- . - :
_;
C - _, C . :
long n,m,z;
4 bytes, n, m z, - .
(declaration) . , (definition) .
3.5
, , -. - .
. - . :
) .
) - block .
) blocks .
block - block. - block - - block. block - .
, . ( - ) block - . block .
10
, - ' , .
int k;
int fun1(int x)
{
int z;
.
.
}
long m;
void fun2(float y)
{
long n;
.
.
}
k . x z fun1(). fun1(). . m . fun2() fun1(). y n fun2().
3.6
, , - . , ,
extern
static
register
auto
extern , , - . C - , - . , , -. - extern. , .
11
x,y,c
int x,y; char c; 1. 2 extern
int x,y; extern char c; , -
.
extern int x; fun1() 1 - x , .
1 2 int x,y;
char c;
void main()
{
.
.
.
}
void fun1()
{
extern int x;
x = 100;
}
extern int x,y;
extern cahr c;
void fun2()
{
y = 30;
}
void fun3()
{
x = y/10;
}
static, block, - block. block , , block. - static block - - . - .
static , , .
register . register - . register . - CPU - -. - . register - . - register .
, auto block .
12
3.7
C , . , - , - - .
, -, .
int x = 5,y = 7;
x y ' - 5 7 .
3.8
C -.
x = 5;
5 int. C.
- .
z=5.;
5. . , ,
.
c=A;
c 65 ASCII .
C , (strings). . "test" . - string - bytes byte - \0 ( \0 byte ASCII 0). string byte - .
string char .
3.9 C
.. , C \ (backslash). 3-2.
13
\a bell \\ backslash
\b backspace \? question mark
\f formfeed \' single quote
\n newline \" double quote
\r carriage return \o octal
\t horizontal tab \x hexadecimal
\v vertical tab
3-2. C
3.10
C . , . . , . - -.
3.10.1 =
= - .
. :
_ = ;
= =. . . , , , . -
short x;
unsigned char c;
x = 3000;
c = x;
c unsigned char byte. x, short, bytes x 255, c - byte x .
C . .
a = x+3 8 - a. 8 2 y - (10) z.
int x,y,z,a;
x = 5;
y = 2;
z = y+(a=x+3);
14
a = x+3 -
;. z = y+(a = x+3); ,
. C
.
x = y = z = a = 0;
0 .
3.10.2
C 3-3.
+
- *
/ %
-- ++
3-3 C
. % .
int x = 5,y = 3,k;
k = x%y;
k 2. -- ++, ,
. -- (++). --x (++x) x-- (x++). - x () . , --x (++x) , x () 1 - . - .
int x = 3,y = 2,z=3,k,m;
k = ++x+y;
m = (x++)+y;
k 6 x 4, m 5 z 4. - 3-4.
++ , -- * , / , %
+ , -
3-4 C
15
3.10.3
C, - 3-5 3-6. 3-7 - .
>
>= <
, >= , < , 3 && x < 5 && x%2 && 7 < 4;
x>3 FALSE, , - , k FALSE.
C . - . 1 0.
x = 2;
y=x+(x>1);
, x>1 , y 3.
3.10.4
C . . 3-8.
16
& AND OR
^ OR ~
>>
17
ASCII code Y = 89 = 0 1 0 1 1 0 0 1
ASCII code '8' = 56 = 0 0 1 1 1 0 0 0
Y^'8' = 0 1 1 0 0 0 0 1 = 97 = ASCII code a
~ ~x. x. , x 01100110, 10011001.
>> x>>N . - bit . bit - . , , x 01100110 2 x >> 2 00011001 ( ).
18
3.10.6 & * pointers
pointer - . - byte . , . - , byte . - .
pointers - pointers. . :
*;
. .
int *p;
p int.
pointer & . , pointer , , , pointer, *. -
, , m
int. m = &a; -
a m. b=*m; b m. m a b a.
int *m,a,b;
m = &a;
b=*m;
3.10.7 sizeof
sizeof bytes .
float a;
int k,n,m,b[10];
k = sizeof a;
n = sizeof(int);
m = sizeof b;
k bytes - a. n
19
bytes - . m bytes b[ ] .
.
3.11
C , , - . ,
x = x+100;
x += 100;
C - .
= ;
3.12 C
C , . - ' . . .
1. char short int. float double.
2. , long double, , , - long double.
, double, double.
, long, long.
, unsigned, - unsigned.
- 10-1.
() [ ]
! ~ ++ -- * & sizeof
* / %
+ -
>
< >=
20
== !=
&
^
&&
?
= += -= *= /=
3-9. C
- , -, . , x 3, x/2 1, (float)x/2 1.5.
: (float)(x/2) 1, - - .
4. C
- , . .
. TRUE, FALSE - . , TRUE FALSE, C TRUE , FALSE .
4.1 if
if C :
if () block x TRUE
else
block x FALSE
- . if - (TRUE), block if block else. (FALSE) block if block - else.
(FALSE), if else . , , if k 2.
21
0 . 0 if else . - if block . - block . -, , .
#include
void main()
{
int k;
scanf("%d",&k);
if(k%2)
printf(" %d \n",k);
else
printf(" %d \n",k);
if(!(k%5) && !(k%2)){
printf("O %d 5 \n",k);
printf("O %d 10 \n",k);
}
printf(" \n");
}
, - ,
if (a = b)
if (a == b)
, , - a ( b). 0, TRUE. FALSE. . a b, 1 - TRUE. FALSE.
4.2 if-else-if
- if-else-if. .
if () block
else if () block
else if () block
.
.
.
22
else
block
- TRUE. block - block else. , - block else. (0,1),(3,4) (5,7) . " ".
#include
void main()
{ float k;
scanf("%f",&k);
if (0 < k && k < 1)
printf(" %f (0,1)\n",k);
else if (3 < k && k < 4)
printf(" %f (3,4)\n",k);
else if (5 < k && k < 7)
printf(" &f (5,7)\n",k);
else
printf(" \n");
}
4.3 goto
goto C, . C . :
goto ;
1 20.
#include
void main()
{ int i = 0;
loop:
i++;
printf("%d\n",i);
if (i < 20) goto loop;
}
goto blocks . , -, C, goto - .
4.4 switch
switch - .
switch :
23
switch() {
case 1:
case 2:
.
.
.
default:
}
switch block - . case :. - , - , - case . . - default:.
case case default:. default:
block switch break; break; block switch.
, n, - a b. A n 1 - case 1: . a 100 b 200. break; block switch a b. n 2 case 2: b 200. H break; block switch. n 3 case 3: a b 300. H break; - block switch. , , default: - b to 0.
#include
void main()
{
int n,a=0,b;
scanf("%d",&n);
switch(n){
case 1:
24
a=100;
case 2:
b=200;
break;
case 3:
a=b=300;
break;
default:
b=0;
}
printf(" a = %d , b = %d\n",a,b);
}
4.5 (Loops)
block . C , for , while do/while.
4.5.1 for
for :
for (1; ; 2) block
for :
1 1
2
3 TRUE ( ) -
block .
4 2 2.
FALSE.
for block 1 2 - . - . 1 , 2 block . , - , , for 1 10.
1
#include
void main()
25
{
int i;
for(i=0; i
26
while ()
block
while , block . .
block while , . , , while, . - while while(1)
, k - 0+1+2+...+n n = 0,1,2,..., k.
#include void main()
{ int s = 0,k,i = 1;
scanf("%d",&k);
while (s < k) {
printf("%d\n",s);
s += i++;
}
}
4.5.3 do/while
for while - block . - , -.
do/while block , block - . :
do {
; } while ();
. , - . . block - , , .
x - a 5 -
new_x=(x+a/x)/2
#include
void main()
27
{
float x,new_x,a,e=0.00001,d;
char c=' ';
scanf("%f",&a);
if(a0?x-new_x:new_x-x;
x=new_x;
}while(d>e);
printf(" %f %c%f\n",a,c,x);
}
do/while - block new_x .
4.6 break
break blocks - block switch. - block - . break .
switch case case - . , - s=1+2+3+...+n n s - 7.
#include
void main()
{ int s = 0,n = 1;
for (;;){
s += n;
if (!(s%7)){
printf("%d\n",s,n);
break;
}
n++;
}
}
4.7 continue
continue blocks - . con-tinue block.
28
. , - 7 100.
#include
void main()
{ int i;
for (i = 0; i < 100; i++) {
if (i%7) continue;
printf("%d\n",i);
}
}
5.
(Array) C , , . - . - - . . C . .
. - . - - . - C - . - C .
5.1
, , .
[];
, , - . sizeof()*
. :
char p[10];
29
10 bytes (10 = 10 x sizeof(char)) char.
, , .
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
p[0] p[1] p[2] p[3] p[4] p[5] p[6] p[7] p[8] p[9]
p 1000. [ ]
[], . , - - bytes + - x sizeof(). p[3] 1000 + 3 x sizeof(char) 1003. 0. - . .
a[ ] 100 int b[ ] 100 float. - a[ ], , , b[ ] mean a[i] mean - a[ ].
#include
#define MAX 100
void main()
{
int i,a[MAX];
float mean=0,b[MAX];
for(i=0;i
30
5.2 (strings)
C - (strings). strings C - char, string. string, , strings, \0 (NULL).
, C string, . string .
" "
string. \0 strings
. strcpy()
"test" s[ ] %s printf(). strcpy() string.h.
#include
#include
void main()
{
char s[5];
strcpy(s,"test");
printf("%s\n",s);
}
s[ ] '\0'.
5.3
C . - - . :
[n]...[2][1];
, , - C , n n-1, n-2 ... - - . .
- .
31
byte - .
char a[3][2];
. () char . ( 1000).
1000 1001 1002 1003 1004 1005
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
.
a - char. , , , - . a[ ][ ] - a=1000.
a[i] i . - a[0]=1000, a[1]=1002 a[2]=1004.
- [ ]. , a[2][1] [ ] . a[2]. [ ] a[2] ( a) - 2 . 2 bytes a 1000 a[i]=1004. [ ] - 1*sizeof(char) , 1005. a[i][j] - i j . (- 0).
a[ ][ ], .
#include #define N 3
void main()
{
int i,j,a[N][N],t;
for(i=0;i
32
a[j][i]=t;
}
for(i=0;i
33
. 5 6 . .
6. Pointers
, pointer C . - . , , . pointer, , . - pointers. pointer pointer. :
*;
pointer . - * . -
:
int *tm;
tm .
, &, , , *,
pointer pointer. pointer byte.
pointers . bytes, byte - pointer, .
pointers -. pointers, pointers . .
pointers, , - . pointer - - pointer. , , , pointer - float - short , - pointer, . pointers , , (warning) - (errors). , , .
34
6.1 pointers
pointers, , , - < > - pointer.
pointer . - pointer , pointer N*sizeof() bytes pointer .
#include
void main()
{ short x[]={10,20,30};
short *p;
p = x;
printf("%d\n",*p);
p+=2;
printf("%d\n",*p);
p--;
printf("%d\n",*p);
}
x
1003 1004 1005 1006 1007 1008
x[0] = 10 x[1] = 20 x[2] = 30
p = x;
pointer p 1003
printf("%d\n",*p);
10.
p+=2;
pointer p 2*sizeof(short) p = 1007 30.
p--;
pointer p 1*sizeof(short) p 1005 20.
pointers - , .
6.2 Pointers
[];
35
sizeof()* bytes. -
, , byte . byte . pointer . pointers
*(+k)
k*sizeof() pointer . - [ ] [k] . , p pointers ,
p = ;
p [ ] . p[k] = [k]. , p - pointer k , *(p+k) p[k] . - a[ ] .
#include
void main()
{ int i,a[] = {1,2,3};
for (i = 0; i < 3; i++)
printf("%d = %d\n",*(a+i),a[i]);
}
, , pointers . - .
pointers - , , .
6.3 pointers
pointers - . pointers .
*[];
- . - bytes - . pointers .
- bytes .
36
. . ' . pointers -. pointers - . . a[ ] b[ ] p[ ] pointers int. p[ ] . - a[ ] b[ ].
#include
void main()
{ int i,a[] = {1,2,3},b[]={4,5},*p[2];
p[0]=a;
p[1]=b;
for (i = 0; i < 3; i++)
printf("%d ",p[0][i]);
printf("\n");
for (i = 0; i < 2; i++)
printf("%d ",p[1][i]);
printf("\n");
}
6.4 Pointers pointers
, pointer, , pointer . pointer pointer. pointer - pointer pointer. -
**;
int **v;
v pointer pointer int.
int *p;
int **v;
int x = 5;
p = &x;
v = &p;
1000 1001 2100 2101 3200 3201
x 5 p 1000 v 2100
37
: .
pointer . pointers pointer pointers. pointers pointers. - pointers pointers - pointers. , , - , , .
v pointers pointers int. p[ ] -, , pointers v p[ ] .
#include
void main()
{ int i,a[] = {1,2,3},b[]={4,5},*p[2],**v;
p[0]=a;
p[1]=b;
v=p;
for (i = 0; i < 3; i++)
printf("%d ",v[0][i]);
printf("\n");
for (i = 0; i < 2; i++)
printf("%d ",v[1][i]);
printf("\n");
}
7.
C . -.
-, , - , . - - .
, , - , - . , . ,
38
. . block .
( ) {
}
C . - C . - - . . void. int. - . - - void.
message() factorial(). message() . void . factorial() n int , long, n!=1.2.3n.
#include
long factorial(int n);
void message();
void main()
{
int m;
long f;
message();
printf(" m = ? ");
scanf("%d",&m);
f=factorial(m);
if(!f)
printf(" n = %d\n",m);
else
printf("%d! = %ld\n",m,f);
}
long factorial(int n)
{
long f=1,i;
if(n>12)return 0;
for(i=2;i
39
void message()
{
printf(" \n");
printf(" C\n\n");
}
- . , - . . , factorial() float int.
f=factorial(3.5);
f 3! 6.
7.1
- . -, , . , - , . ANCI -.
- - . , , - .
- . .
- . , , - .
C . . C . -
40
' #include . - stdio.h - - C. #include -.
#include
: #include .
7.2 return
. , - return. void. return . return, -, - . return, -, - , return .
print_ok() , ok, sum() 1+2+...+k.
void print_ok(void)
{
printf("ok\n");
}
int sum(int k)
{
int s = 0,i;
for (i = 1; i
41
, . , -, . . . - C .
-, , , . -. , , , , - . - fun() - int :
fun(int *p)
fun(), - x, int,
fun(&x);
x , , p. , ,
*p=7;
7 - p x x 7.
&, , *, , .
max() mod(). - max() , , . mod() point-ers . mod() , , pointer pointer .
#include
int max(int n,int m);
void mod(int n,int m,int *r,int *q);
void main()
{ int n,m,r,q;
scanf("%d %d",&n,&m);
mod(m,n,&r,&q);
printf(" = %d\n = %d\n",r,q);
}
42
int max(int n,int m)
{
return n>m?n:m;
}
void mod(int n,int m,int *r,int *q)
{
if(n==max(n,m)){
*r=n/m;
*q=n%m;
}
else{
*r=m/n;
*q=m%n;
}
7.4
C - , - . - - . , - . , , . .
myshort .
#include
#define MAX 10
void myshort(int *k,int n);
void main()
{
int i,a[MAX];
for(i=0;i
43
}
}
}
}
#define - .
7.5
, , , . , , . , , fun() -
char a[3][2];
void fun (char a[][2])
fun()
fun(a);
k[3][4] mean(), .
#include
#define R 3
#define C 4
void mean(int a[][4],int n,int m);
void main()
{ int k[R][C];
int i,j;
printf(" (%d %d -
)\n",R,C);
for (i = 0; i < R; i++)
for (j = 0; j < C; j++)
scanf("%d",&k[i][j]);
mean(k,R,C);
}
void mean(int a[][4],int n,int m)
{ int i,j;
float s;
for (i = 0; i < n; i++){
s = 0;
for (j = 0; j < m; j++)
s += a[i][j];
s /= m;
printf(" %d = %f\n",i,s);
}
}
, ,
44
. - . C - .
7.6 (Recursion)
. , . - .
C . , -. . - .
, . , , - . , .
- static . . . static - .
mcd m >m .
= max{x : M mod x = 0 m mod x = 0}
= mcd( M, m) m = 0 = = mcd( m ,M mod m)
m - m . m m m. - m m m. mcd - m - m m - M m.
45
#include
int mcd(int M,int m);
void main()
{
int M,m;
scanf(%d %d,&M,&m);
printf(%d\n,mcd(M,m));
}
int mcd(int M,int m)
{ int MKD;
if(m == 0)
MKD=M;
else
MKD=mcd(m,M%m);
return MKD;
}
7.7 exit()
exit(), , . exit() . - (.. ...). - ASCII - . ASCII [32,255]. ( ASCII 32 )
#include
#include
void main()
{
unsigned char n;
for(;;){
scanf("%d",&n);
if(n
46
* . -
, , pointer .
pointers pointer. point-ers ' .
- pointer .
int fun(int x);
void main()
{ int (*p)(int);
p = fun;
p(2);
.
.
}
p - .
p = fun;
( pointer) fun() p.
p(2);
, fun() 2.
fun(2);
pointers . - . pointers , - switch.
. pointers - . - root() - f(x) = 0
x x(x x )f(x )
f( x ) f( x )i 1 i
i i 1 i
i i 1
#include
#include
float root(float(*p)(float),float x1,float x0,float e,int n);
float f(float x);
void main()
{
float x1,x0,e,r;
int n;
47
scanf("%f %f %f %d",&x1,&x0,&e,&n);
r = root(f,x1,x0,e,n);
printf("root = %f\n",r);
}
float f(float x)
{
float r;
r = 2*(x*x)-8;
return (r);
}
float root(float (*p)(float), float x1,float x0, float e,int n)
{
int k = 0;
float x;
while (fabs(x1-x0) > e && k < n && p(x1) != p(x0)) {
x = x1-((x1-x0)*p(x1)/(p(x1)-p(x0)));
k++;
x0 = x1;
x1 = x;
}
if (k == n) {
printf(" \n");
exit(1);
}
if (p(x1) == p(x0)) {
printf("f(xi) = f(xi-1)\n");
exit(1);
}
return (x);
}
root() pointer -, p, , - - .
2x2-8=0 -
f() root(). f() root().
8.
- . . C . - .
C program segment, data segment, stack
48
heap. heap - .
C . , ANSI, malloc() realloc() - .
8.1 malloc()
() malloc()
void *malloc(size_t size);
malloc() stdlib.h.
size bytes void pointer. size_t - bytes . NULL. malloc() - .
8.2 realloc
realloc() malloc() . realloc() stdlib.h
void *realloc(void *r,_);
realloc() malloc(). pointer r byte - malloc(). , _, , bytes. , bytes, , -. - realloc() ' - . pointer p, , byte . - realloc() NULL.
8.3 free()
. free() stdlib.h.
() free() :
49
void free(void *p);
pointer p -. pointer free(), , -.
malloc() - n . , - , - . realloc() . , - - . - . - free().
#include
#include
#include
void main()
{ int *ip;
int n,m,k,j,i,fl;
printf(" =?");
scanf("%d",&n);
if((ip=(int *)malloc(n*sizeof(int)))==NULL){
printf(" 1\n");
exit(1);
}
for(i=0;i
50
for(i=0;i
51
int **a,**b,**c, i,j,n,m,k;
printf("
=?");
scanf("%d",&n);
printf(" =?");
scanf("%d",&m);
printf(" =
?");
scanf("%d",&k);
scanf("%d %d %d",&n,&m,&k);
a=(int **)malloc(n*sizeof(int *));
b=(int **)malloc(m*sizeof(int *));
c=(int **)malloc(n*sizeof(int *));
for(i=0;i
52
. , - . , - , - . .
9.
C . ' - . , , . , , . , , -,
struct salary {
char name[30];
int hours;
float pay;
float tax;
};
. - .
, , .
, salary -,
struct salary George;
George struct salary - . -
name 30 bytes x sizeof(char)
hours 2 bytes sizeof(int)
pay 4 bytes sizeof(float)
tax 4 bytes sizeof(float)
- . George, , 40 bytes . 30 , char, , 2 bytes , int, , 4, float 4, - float, .
53
.
struct salary {
char name[30];
int hours;
float pay;
float tax;
} George,Kathe,John;
- salary (120 bytes).
. (dot). | :
George.name = "Oikonomu Georgios";
George.hours = 42;
George.pay = 2400;
George.tax = 500;
George struct salary. - Kathe John.
. -
John =George ;
George John. - , George - John. - .
9.1
. -. . salary -
struct salary staff[100];
100 salary. 100*40 = 4000 bytes. -
.
staff[12].pay = 2530;
2530 pay staff. 0.
54
salary, - staff 100 . n . - .
#include
#include
#include
#define MAX 100
struct salary {
char name[30];
int hours;
float pay;
float tax;
};
void main()
{ int i,n;
float sum1 = 0,sum2 = 0, sum3 = 0;
struct salary staff[MAX];
printf(" = ? ");
scanf("%d",&n);
if(nMAX)exit(1);
for (i = 0; i < n; i++){
printf(" %d ",i+1);
scanf("%s",&staff[i].name);
printf(" %d
",i+1);
scanf("%d",&staff[i].hours);
printf(" %d ",i+1);
scanf("%f",&staff[i].pay);
printf(" %d ",i+1);
scanf("%f",&staff[i].tax);
}
for (i = 0; i < n; i++){
sum1 += staff[i].hours;
sum2 += staff[i].pay;
sum3 += staff[i].tax;
}
printf(" = %f\n",sum1);
printf(" = %f\n",sum2);
printf(" = %f\n",sum3);
}
9.2 Pointers
C pointers -. pointers .
pointer , , * .
struct salary *p;
55
p pointer salary.
, pointer byte - & . -, George salary,
p=&George;
George p.
pointer , - , ->. , -, hours George, p, 40
p->hours = 40;
H
George.hours = 40;
byte - . pointer . pointer .
struct salary *staff;
staff =(struct salary *)malloc(100*sizeof(struct salary));
100 salary. -> pointers, [ ]. -
(staff+2)->hours=40;
staff[2].hours=40;
, 40 hours staff.
9.3
, , - . . fun1()
void fun1(int n);
struct salary George;
fun1(George.hours);
hours George - fun1(). fun2()
void fun2(int *n);
56
struct salary George;
fun2(&George.hours);
fun2(). fun2() byte -
hours George, -
& . int.
- . , fun3() salary, .
void fun3(struct salary x);
. . . , - fun4() salary
struct salary funa4();
set_min() salary - . . -.
#include
#include
#include
struct salary{
char name[31];
int hours;
float pay;
float tax;
};
struct salary set_min(struct salary *p,struct salary
*new_emp,int n);
void main()
{
struct salary *staff,new_emp,min_emp;
int i,n;
float pay,tax;
printf(" ");
scanf("%d",&n);
57
staff=(struct salary *)malloc(n*sizeof(struct salary *));
if(staff==NULL){
printf(" \n");
exit(1);
}
for(i=0;ipay=min.pay;
return min;
}
9.4
, , . .
struct str1 {
short x;
float y;
};
struct str2 {
struct str1 st;
58
short p;
};
str1 str2 - st str1. str2 8 bytes. 6 bytes st 2 p.
, , . (dot). abc str2 y, st z
z = abc.st.y;
abc pointer p -, , abc, y z .
z = p->st.y;
address . - employee , , , . employee address. : get_address() . get_data() . out_order() out_address() - . main() - employee , .
#include
#include
#include
struct address {
char city[16];
char street[21];
int number;
long zip;
};
struct employee{
char name[31];
struct address addr;
float payment;
float reprise;
float pay;
};
void get_data(struct employee *p);
void get_address(struct address *ad);
void out_order(struct employee z);
void out_address(struct employee z);
59
void main()
{
int i,N;
struct employee *staff;
printf(" = ");
scanf("%d",&N);
staff=(struct employee *)malloc(N*sizeof(struct employee));
if(staff==NULL){
printf(" \n");
exit(1);
}
printf("\n \n");
for(i=0;ipayment);
printf(" = ? ");
scanf("%f",&p->reprise);
get_address(&p->addr);
}
void get_address(struct address *ad)
{
printf("( 15 ) = ? ");
fflush(stdin);
gets(ad->city);
printf(" ( 20 ) = ? ");
fflush(stdin);
gets(ad->street);
printf(" = ? ");
scanf("%d",&ad->number);
printf(" = ? ");
scanf("%ld",&ad->zip);
}
void out_order(struct employee z)
{
printf(": %s\n",z.name);
60
printf(": %8.2f\n",z.pay);
}
void out_address(struct employee z)
{
printf(": %s\n",z.name);
printf(": %s\n",z.addr.city);
printf(": %s\n",z.addr.street);
printf(": %d\n",z.addr.number);
printf("TK: %ld\n",z.addr.zip);
}
9.5
.
union { 1;
2; .
.
.
n;
};
. - . bytes .
union abc{
char a[10];
float x;
short k;
};
union ABC z;
abc z. z sizeof(char) x 10 bytes, - a[] . bytes - abc.
byte 0 byte 1 byte 2 byte 3 byte 4 byte 5 byte 6 byte 7 byte 8 byte 9
x
k
a
61
, - , . dot . ->. -
union abc *p;
z.x=7.5;
p=&z;
p->k=4;
o 7.5 , , - bytes z. , pointer p z, 4 bytes z.
x, p->k=4;, .
I_var 5 - long. , U uv - I_var n[] 5 long. n[] u, U uv u V I_var.
#include
struct I_var{
long b1;
long b2;
long b3;
long b4;
long b5;
};
union U{
long n[5];
struct I_var uv;
}u;
void main()
{
struct I_var V;
int i;
for(i=0;i
62
bits byte.
/ .
bits bytes.
C ' , , bits (bit-field). bits
struct _ { 1 : 1;
2 : 2; .
.
.
n : n; };
_ . i , bits, i. i 1 16, ( ). int, unsigned signed. , , 1, un-signed.
bits bytes. bits - ' .
struct port{
unsigned bit0 : 1;
unsigned bits1_3 : 3;
unsigned : 2;
unsigned bit6 : 1;
}device;
device, port, bits. - byte unsigned. bit0 1 bit, bits1_3 3 bits bit6 1 bit. bits 4 5 byte ' . bit 7 , byte, .
bits . .
struct st{
char ch[10];
unsigned k:3;
unsigned m:1;
}ts;
63
ts, st, bits bits. bytes (11 bytes).
.
ts.k = 2;
2 k . - , , bits . bits bits .
ts.k = 9;
k 1 9 - 4 bits (9 1001)
, , pointer, - , . (dot), ->.
bits. - . , . , , .
bits - string . - , string, [0,7] bit - . - bits 8 bits unsigned char - .
#include
#include
#define MAX 100
struct byte_change{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
};
union byte{
struct byte_change bits;
unsigned char c;
};
64
void code(char *c,unsigned long key)
{
union byte b;
unsigned long m;
int i=0;
srand(key);
while(c[i]){
b.c=c[i];
m=rand();
srand(m);
switch(m%8){
case 0:
b.bits.b0+=1;
break;
case 1:
b.bits.b1+=1;
break;
case 2:
b.bits.b2+=1;
break;
case 3:
b.bits.b3+=1;
break;
case 4:
b.bits.b4+=1;
break;
case 5:
b.bits.b5+=1;
break;
case 6:
b.bits.b6+=1;
break;
case 7:
b.bits.b7+=1;
}
c[i]=b.c;
i++;
}
}
void main()
{
char c[MAX];
unsigned long key;
printf("\n");
printf(" string ( %d
)\n",MAX);
fflush(stdin);
gets(c);
printf(" = ? ");
scanf("%lu",&key);
code(c,key);
printf("\n: %s\n",c);
printf("\n\n");
printf(" = ? ");
65
scanf("%lu",&key);
code(c,key);
printf("\n: %s\n",c);
}
: - rand() 232. srand() unsigned - rand().
- ASCII 32. - .
9.7
- .
enum { };
- .
, , .
enum week {Sunday, Monday, Tuesday, Wednesday, Thursday, Fri-
day, Saturday};
week, . , , day week
day = Friday;
day - Friday -. , 0 . , , week
Sunday = 0
Monday = 1
Tuesday = 2
Wednesday = 3
Thursday = 4
Friday = 5
Saturday = 6
66
. - .
enum week {Sunday, Monday, Tuesday = 50, Wednesday, Thursday,
Friday, Saturday} day;
Tuesday 50. Tuesday 50. .
Sunday = 0
Monday = 1
Tuesday = 50
Wednesday = 51
Thursday = 52
Friday = 53
Saturday = 54
string .
day = Monday;
printf("%s\n",day);
Monday day 1 - printf() , string day.
10. (I/O)
C - (stream) (file). I/O C . , , . -. . - . - (bytes) . , - .
bytes -. bytes .
ANSI C - , . . - , modem . C. , .
- C. -
67
fclose(). .
- . .
stdin stdout
stderr
C - . FILE stdio.h. pointer FILE .
10.1
. / , C - ' . - .
10.1.1 getch(), getchar() putchar()
getch() getchar(). stdio.h
int getch(void);
int getchar(void);
. getch() , getchar() enter. - byte .
putchar() . stdio.h
int putchar(int c);
- int char. , EOF.
getch() getchar() putchar() .
#include
void main()
{ char c1,c2;
68
c1 = getch();
c2 = getchar();
putchar(c1);
putchar(c2);
}
10.1.2 gets() puts()
gets() puts() strings -. stdio.h. gets() .
char *gets(char *s );
H gets() - pointer s. - . gets() ( Enter), string, . - string. string gets(). string , gets(), . -. gets(), string - - string .
puts() pointer char string - . puts()
char *puts(char *s);
char 30 gets() ' string . puts() string.
#include
void main()
{ char s[30];
gets(s);
puts(s);
}
10.1.3 printf()
printf() . "" . printf() C -.
printf() stdio.h
int printf(const char *format_string, );
69
string (format_string) . format_string - . - . % - . -
-
%c %d
%i %e
%f %g %e %f
%o %s String
%u %x
%% % %p pointer
printf()
printf() - short long. l %, %ld long. %hd short.
l e,f g, - double. L - long double.
format_string - .
char *p="HALLO";
int x=5;
printf("%s The value of x is %d\n",p,x);
HALLO The value of x is 5. \n format_string, , .
, - . , , % , . - string . string , -.
char *p="ABCD";
70
int k=12;
printf("%10d\n%10s\n",k,p);
printf("%2s\n",p);
printf() 10 k string ABCD. printf() - 2 string - .
, , - 0 . %010d
printf("%010d\n",k);
k, , - 0.
- , , , . %10.4f
printf("%10.4f\n",x);
, , x , , .
, string, %, - n.m, n m , , string , n m . , , string string. -
char *p="ABCDEFGH";
printf("%3.5s\n",p);
string 5.
ABCDE
. , % - . %-10d .
printf() . EOF.
printf() .
#include
void main()
{ int k = 12345;
float x = 543.437;
char s[] = "abcdefg";
printf("k = %08d\n",k);
printf("k = %3d\n",k);
printf("x = %6.2f\n",x);
71
printf("x = %4.2e\n",x);
printf("s = %-10s\n",s);
printf("s = %4.5s\n",s);
}
k = 0 0 0 1 2 3 4 5
k = 1 2 3 4 5
x = 5 4 3 . 4 4
x = 5 . 4 3 e + 0 2
s = a b c d e f g
s = a b c d e
.
10.1.4 scanf()
scanf() - C . scanf() stdio.h
int scanf(const char *format_string, );
string (format_string) - , , .
format_string . - , . , printf(), % , , - scanf() , , format_string. .
%c %d
%i %e
%f %h short
%o %s String
%x %p pointer
scanf()
" " tab newline. scanf() stdin,
72
, , , format_string. , format_string, scanf() - .
- . , format_string, scanf() -. scanf() , - , , . -
int x,y;
scanf("%d+%d",&x,&y);
2+3 %d , x, 2. format_string - + . scanf() + - y 3. 2-3 x 2 , +, scanf() y. 2 + 3 2 +. , scanf() +, - .
C - format_string. , , -
scanf("%d + %d",&x,&y);
+, 2 + 3 + . +, , + for-
mat_string scanf() , , -
. for-mat_string.
, & . scanf() k.
int k;
scanf("%d",&k);
73
, scanf(), string - . , ,
char str[51];
scanf("%s",str);
50 string str. scanf(), %s, - \0.
scanf() , tabs newlines. .
scanf("%d %d",&k,&m);
10 20 10 20 10,20.
, %, *
scanf() -. - ' .
scanf("%d %*c %d",&k,&m);
10$5 10 k, $ 5 m.
scanf() . - %. - , scanf() , scanf(). 12345678
scanf("%2d %2d %2d",&x,&y,&z);
12 x, 34 y 56 z - 7 8 - .
, . a b
scanf("%c%c%c",&x,&y,&z);
a x, y b z. ,
, a b, , b y. scanf() z.
format_string - .
scanf("%s ",str);
74
string enter, scanf() . , - -, enter.
. -
char x,y;
scanf("%c",&x);
printf("%c\n",x);
scanf("%c",&y);
printf("%c\n",y);
x y, x enter y, y . en-ter x. , , . - fflosh(). stdio.h
int fflush(FILE *strim);
.
char x,y;
fflush(stdin);
scanf("%c",&x);
printf("%c\n",x);
fflush(stdin);
scanf("%c",&y);
printf("%c\n",y);
fflosh() stdin x y.
scanf() scanset. scanset . - , scanf() . scanset format_string % - . scanset pointer . - %[ABC] - A,B C .
scanset -. scanset %[A-Z] . scanset. , -
75
, ^. scanset %[^0-9] 0 9.
1
#include
void main()
{ char s1[80],s2[80];
scanf("%[0123456789] %s",s1,s2);
printf("%s %s\n",s1,s2);
}
3210rt56u string s1 3210 s2 rt56u.
w1342rgu s1, , scanset, s2 w1342rgu.
2
#include
void main() { char s1[80],s2[80]; scanf("%[^0-3 7-9] %s",s1,s2);
printf("%s %s\n",s1,s2);
}
E scanf() s1 0,1,2,3 7,8 9 . s1 s2. , 56432ab56c, s1 564 s2
32ab56c.
10.2
, -. . .
, - , - buffer. buffer - . , , buffer .
, C . . bytes . \n
76
tex editor.
- bytes . \n byte ASCII 10 .
10.2.1
pointer FILE stdio.h. - pointers fopen() . fopen() - pointer FILE. fopen()
FILE *fopen(const char *_, const char *);
string . string path .
strig . - .
"r"
"w" "a"
"rb" "wb"
"ab" "r+"
"w+" "a+"
"r+b" "w+b"
"a+b" "rt"
"wt" "at"
"r+t" "w+t"
"a+t"
"" fopen()
fopen() pointer FILE C. fopen() , NULL. -
FILE *fp;
fp = fopen("test","w");
77
test - . fp.
. .
10.2.2
bytes - . ( ). , , byte . - .
C . stdio.h
10.2.3 feof()
int feof(FILE *);
fopen() - .
feof() . feof() -
. - . feof() . -, , , 0, .
10.2.4 rewind()
rewind() . rewind()
void rewind(FILE *);
fopen() .
10.2.5 fseek()
fseek() .
int fseek(FILE *, long num_bytes, int );
fopen() . num_bytes bytes ,
78
. - stdio.h .
SEEK_SET SEEK_CUR SEEK_END
"" fseek()
fseek() -. bytes - .
10.2.6. ftell()
ftell() . :
long ftell(FILE *);
fopen() .
H ftell() , bytes, .
10.2.7 fclose()
fclose() fopen() . , buffer -. fclose()
int fclose(FILE *);
fopen() .
fclose() EOF, 0.
10.2.8
C remove() . .
int remove(const char *_);
remove() _ 0 . - .
remove("d:t");
t d.
79
10.2.9 putc()
putc() (bytes) fopen().
int putc(int , FILE *);
, - pointer fopen() -
, int, byte . putc() , EOF.
10.2.10 getc()
getc() (bytes) .
int getc(FILE *);
H pointer fopen()
getc() - byte .
, , getc() EOF . - EOF . feof().
code(),decode() getstr(). code() - . . - , , 256 ASCII bytes - bytes .
decode() code(). - . - bytes - . bytes - getc() putc() feof() bytes .
getstr() .
#include
#include
#include
#include
80
void code(char *text,char *key,char *crypto);
void decode(char *crypto,char *key,char *text);
char *getstr();
void main()
{
char *text,*key,*crypto,c;
while(1){
printf(" C \n");
printf(" D \n");
printf(" \n");
c=getch();
if(c=='C'||c=='D'||c=='c'||c=='d')break;
exit(1);
}
if(c=='C'||c=='c'){
printf("
= ? ");
text=getstr();
printf("
= ? ");
key=getstr();
printf("
= ?" );
crypto=getstr();
code(text,key,crypto);
}
else{
printf(" =
? ");
crypto=getstr();
printf("
= ? ");
key=getstr();
printf("
= ? ");
text=getstr();
decode(crypto,key, text);
}
free(text);
free(key);
free(crypto);
}
void code(char *text,char *key,char *crypto)
{
unsigned char t,c,cr;
FILE *tep,*kep,*crp;
tep=fopen(text,"rb");
if(tep==NULL){
printf(" %s\n",text);
exit(1);
}
kep=fopen(key,"rb");
if(kep==NULL){
printf(" %s\n",key);
81
exit(1);
}
crp=fopen(crypto,"wb");
if(crp==NULL){
printf(" %s\n",crypto);
exit(1);
}
while(1){
t=getc(tep);
if(feof(tep))break;
c=getc(kep);
if(feof(kep)){
rewind(kep);
c=getc(kep);
}
cr=(t+c)%256;
putc(cr,crp);
}
fclose(tep);
fclose(kep);
fclose(crp);
printf(" \n");
}
void decode(char *crypto,char *key,char *text)
{
unsigned char t,c,cr;
FILE *tep,*kep,*crp;
tep=fopen(text,"wb");
if(tep==NULL){
printf(" %s\n",text);
exit(1);
}
kep=fopen(key,"rb");
if(kep==NULL){
printf(" %s\n",key);
exit(1);
}
crp=fopen(crypto,"rb");
if(crp==NULL){
printf(" %s\n",crypto);
exit(1);
}
while(1){
cr=getc(crp);
if(feof(crp))break;
c=getc(kep);
if(feof(kep)){
rewind(kep);
c=getc(kep);
}
t=(cr-c+256)%256;
putc(t,tep);
}
fclose(tep);
fclose(kep);
82
fclose(crp);
printf(" \n");
}
char *getstr()
{ int i=0;
char *p;
fflush(stdin);
while(1){
if(!i){
p=(char *)malloc(i+1);
}
else{
p=(char *)realloc(p,i+1);
}
scanf("%c",&p[i]);
if(p[i]==10)break;
i++;
}
p[i]='\0';
return p;
}
10.2.11 fgets() fputs()
- strings . .
int *fputs(char *string, FILE *);
char *fgets(char *string, int , FILE *):
string pointer - string. pointer fopen() .
fputs() puts() string .
fgets() string -1 . string fgets() - string '\0'. fgets() NULL, pointer char string .
fputs("abc",fp);
string "abc" fp,
fgets(s,50,fp);
fp 49 bytes - pointer s. \0.
10.2.12 fread() fwrite()
ANSI C - . fread() fwrite().
83
fread()
size_t fread(void *buffer, size_t num_bytes, size_t , FILE *);
buffer pointer -. num_bytes bytes - num_bytes . pointer fopen() .
fread() . . - fread() - \n (ASCII 10).
fwrite()
size_t fwrite(void *buffer, size_t num_bytes, size_t , FILE *);
buffer pointer . num_bytes bytes - num_bytes . pointer fopen() . fwrite() num_bytes .
fread() fwrite() - . , . - - bytes .
#include #include
void main()
{ FILE *fp;
int a[6][6],b[6][6];
int i,j;
for(i=0;i
84
}
fread(b, sizeof b,1,fp);
for(i=0;i
85
int fprintf(FILE *, const char *form_string,...);
int fscanf(FILE *, const char *form_string,...);
printf() scanf() , . fprintf() fscanf() - printf() scanf(). .
10.2.14 stdin, stdout stderr
stdin, stdout stderr - / . - .
putc(c,stdout);
c.
11. O C
C - . - #.
- . . - . - .
11.1 #define
. , - , .
#define MAX 10
int a[MAX],i;
for(i=0;i
86
for(i=0;i
87
#include stdio.h .
. , , .
88
.
1. 1
1.1 ANSI C++ 1
1.2 2
1.3 / 2
2. C 3
3. C 5
3.1 C 6
3.2 . 6
3.3 7
3.4 8
3.5 8
3.6 9
3.7 11
3.8 11
3.9 C 11
3.10 12
3.10.1 = 12
3.10.2 13
3.10.3 14
3.10.4 14
3.10.5 ?: 16
3.10.6 & * pointers 17
3.10.7 sizeof 17
3.11 18
3.12 C 18
4. C 19
4.1 if 19
89
4.2 if-else-if 20
4.3 goto 21
4.4 switch 21
4.5 (Loops) 23
4.5.1 for 23
4.5.2 while 24
4.5.3 do/while 25
4.6 break 26
4.7 continue 26
5. 27
5.1 27
5.2 (strings) 29
5.3 29
5.4 31
6. Pointers 32
6.1 pointers 33
6.2 Pointers 33
6.3 pointers 34
6.4 Pointers pointers 35
7. 36
7.1 38
7.2 return 39
7.3 39
7.4 41
7.5 42
7.6 (Recursion) 43
7.7 exit() 44
7.8 Pointers 44
8. 46
90
8.1 malloc() 47
8.2 realloc 47
8.3 free() 47
9. 51
9.1 52
9.2 Pointers 53
9.3 54
9.4 56
9.5 59
9.6 bits 60
9.7 64
10. (I/O) 65
10.1 66
10.1.1 getch(), getchar() putchar() 66
10.1.2 gets() puts() 67
10.1.3 printf() 67
10.1.4 scanf() 70
10.2 74
10.2.1 75
10.2.2 76
10.2.3 feof() 76
10.2.4 rewind() 76
10.2.5 fseek() 76
10.2.6 ftell() 77
10.2.7 fclose() 77
10.2.8 77
10.2.9 putc() 78
10.2.10 getc() 78
10.2.11 fgets() fputs() 81
10.2.12 fread() fwrite() 81
10.2.13 fprintf() fscanf() 83
10.2.14 stdin, stdout stderr 84
91
11. O C 84
11.1 define 84
11.2 include 85