1、ACM程序员大赛讲座,讲授人:王敬华,_C语言程序设计要点,一、数据类型,1、int /short 2、char 3、unsigned int/short 4、unsigned char 5、float/double/long double,二、运算符,1、按位运算&、|、 2、算术运算+、-、*、/、% 3、条件运算&、|、! 4、转义符ddd (8进制)、xhh (16进制),三、格式化输入/输出,1、printf(“格式控制字符”,表达式1,.,表达式n)%d、%i-有符号10进制整型%x、%X-无符号16进制整型%o-无符号8进制整型%u-无符号10进制整型%c-字符型%s-字符串%f
2、-浮点型(10进制小数形式)%e、%E-浮点型(指数形式),三、格式化输入/输出,2、输出有符号整数%-+width.precisiond-:表示左对齐,缺省时是右对齐;+:输出正数时,在数前加上+号;width:对于无符号整数,表示输出整数的最小域宽(即占屏幕的多少格),若实际宽度超过了width,则按实际宽度输出;.precision:针对无符号整数,表示至少要输出precision位,如果整数的位数大于precision,则按实际位数输出,否则在左边的空位上补0。,三、格式化输入/输出,main() int a=123;long L=34567;printf(“a=%dn“,a);pri
3、ntf(“a=%6dn“,a);printf(“a=%6.4dn“,a);printf(“a=%-6dn“,a);printf(“a=%+6dn“,a);printf(“L=%ld“,L);,运行结果:a=123 a= 123 a= 0123 a=123 a= +123 L=34567,三、格式化输入/输出,3、输出无符号整数%-#width.precisionl u|o|x|X#:表示以8进制形式输出数据(%o)时,在数字前输出0;当以16进制形式输出数据(%x或%X)时,在数字前输出0x或0X;,三、格式化输入/输出,main() int a=-1;unsigned u=32767;uns
4、igned long L=655352;printf(“a=%u:a=%dn“,a,a);printf(“u=%on“,u);printf(“u=%x:u=%Xn“,u,u);printf(“u=%#o:u=%#Xn“,u,u);printf(“L=%lxn“,L);printf(“L=%#.8lXn“,L);,运行结果:a=65535:a=-1u=77777u=7fff:u=7FFFu=077777:u=0X7FFFL=3fffcL=0X03FFFC,三、格式化输入/输出,4、实数的输出%-+#width.precisionlLf|e|E|g|G.precision:规定输出实数时,小数部分
5、的位数;l:输出double型数据(缺省时也是输出double型数据);L:输出long double型数据;#:必须输出小数点;,三、格式化输入/输出,main() double f=2.5e5;printf(“123456789123456789n“);printf(“f=%15fn“,f);printf(“f=%-15.0fn“,f);printf(“f=%#15.0fn“,f);printf(“f=%+15.4fn“,f);printf(“f=%15.4en“,f);,运行结果:123456789123456789 f= 250000.000000 f=250000 f= 250000
6、. f= +250000.0000 f= 2.5000e+05,三、格式化输入/输出,5、字符和字符串的输出%-widthc%-width.precisions.precision:表示只输出字符串的前precision个字符;,三、格式化输入/输出,main() char ch=A;printf(“ch=%cn“,ch);printf(“ch=%3cn“,ch);printf(“ch=%-3cn“,ch);printf(“%sn“,“ABCD“);printf(“%6sn“,“ABCD“);printf(“%6.3sn“,“ABCD“);,运行结果:Ch=A Ch= A Ch=A ABCDA
7、BCDABC,三、格式化输入/输出,6、scanf(“格式控制字符串”,变量1地址,变量n地址)例:scanf(“%d”,格式控制字符的一般形式:%*width lTypewidth:是无符号整数,表示输入数据所占的宽度;* : 表示输入的数据不会赋值给相应的变量;l : 表示输入长整型数据(%ld,%lu,%lx,%lo)和double型数据(%lf,%le);,三、格式化输入/输出,scanf函数规定,当输入一项数据时,遇到以下情况scanf认为该数据输入结束:1)遇到空格、回车、Tab键;2)指定的宽度结束;如:scanf(“%3d”,&a);输入1234,a的值将是123;3)遇非法输
8、入;如:scanf(“%d”,&a);如果用户输入12a3,a的值将是12;4)当用%c输入字符型数据时,可显示字符、空格、回车以及其它转义字符都是有效输入;如:scanf(“%c%c%c”,&a,&b,&c);,三、格式化输入/输出,Scanf(“%c%c”,&c1,&c2); aA Scanf(“%d,%d”,&x,&y); 12,-23 Scanf(“%s%s”,&x,&y); aa AA,四、文件操作,1、文件的打开与关闭FILE *fopen(char *filename,char *mode);int fclose(FILE *fp);int feof(FILE *fp);mode
9、:由两类字符组成,一类字符表示打开文件的类型,t-文本文件,b-二进制文件;另一类字符是操作类型,r-读,w-写,a-追加,+-可读可写;,四、文件操作,2、文件的读写int fscanf(FILE *fp,char *format,v1,vn);int fprintf(FILE *fp,char *format,e1,en);int fgetc(FILE *fp);int fputc(int c,FILE *fp); char *fgets(char *s,int n,FILE *fp);从fp中读n-1个字符=s,最后补0int *fputs(char *s,FILE *fp);正确,返回
10、写入文件的实际字符数;错误,则返回EOF(-1);,四、文件操作,unsigned fwrite(void *ptr,unsigned size,unsigned n,FILE *fp);size-写入文件的每个数据所占用的字节数,通常用sizeof()形式;正确,返回n值,错误,返回NULL(0) unsigned fread(void *ptr,unsigned size,unsigned n,FILE *fp);,四、文件操作,3、文件的定位void rewind(FILE *fp);将文件指针置于fp所指向的文件头;int fseek (FILE *fp,long offset,int
11、 from);offset:从from开始的偏移字节数,+-(-)- -(-) 0不动from: SEEK_SET(0)、SEEK_CUR(1)、SEEK_END(2) long ftell(FILE *fp);返回当前位置指针的值,如出错,ftell返回-1;,五、指针,1、一级指针int *p; char *pstr; 2、数组指针(指向二维数组的指针)int a23 = 1,2,3,4,5,6;int (*p) 3;p = a; aij 等价于pij 3、指针数组int a3;int *p3;p0 = ,五、指针,4、二级指针int a; int *p; int *pp; p = ,五、
12、指针,6、指针作为函数的返回值int *getdata(int num)int *p; int k;p = (int *)malloc(num*sizeof(int);if (p != NULL)for (k=0; knum; k+)scanf(“%d”,int *getdata(int num) static int a100;int k;if (num 100)return NULL;for (k=0;knum;k+)scanf(“%d”, ,五、指针,7、指针函数int *getdata(int num); 8、函数指针int (*pf) (int a);例:int getmax(int
13、 x,int y) return(xy?x:y); void main()int (*pf) (int,int); int a;pf = getmax; a = (*pf) (3,2);printf(“a=%d”,a); ,六、常用函数,1、int getch(void); 2、int getche(void); 3、sizeof(expression)/sizeof(type); 4、break/continue; 5、memset(void *s,int c,size_t n) 6、void *malloc(size_t size); 7、void free(void *block); 8
14、、strcpy(char *dest,const char *src); 带0,六、常用函数,9、strncpy(char *dest,const char *src,size_t maxlen); 不带0 10、memcpy(void *dest,cont void *src,size_t n); 不带0 11、movmem(void *src,void *dest,unsigned length); 带0 12、strcat(char *dest,const char *src); 带0 13、strncat(char *dest,const char *src,size_t maxlen
15、); 带0 14、char *strchr(const char *s,int c); 找到返回其指针,否则null 15、int strcmp(const char *s1,const char *s2); 16、int strncmp(const char *s1,const char *s2,size_t maxlen);,六、常用函数,17、char *strstr(const char *s1,const char *s2) 18、strset(char *s,int ch); 19、char *strupr(char *str); 20、double atof(const char
16、 *nptr); 21 、int atoi(const char *nptr); 22、long atol(const char *nptr); 23、char *itoa(int value,char *string,int radix); 24、int random(int num); 24、sprintf(char *buffer,const char *format,);,六、常用函数,例如:将整数123 “000123”char buffer7; int a = 123;sprintf(buffer,”%6.6d”,a); 25、int isalpha(int x); 26、int islower(int x); 27、int isupper(int x); 28、int isdigit(int x); 29、int tolower(int x); 30、int toupper(int x);,