版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1程序设计实践2课程介绍程序设计实践是C语言的延续,开设该门课的原因是在C语言的教学中受课时的限制,对程序设计的深度没有较多的要求。该门课的教学目的是使学生在熟练掌握C语言语法的基础上,培养学生程序设计的能力,编写具有良好风格的程序,并能解决一定难度的问题。掌握VC++编程环境能够使用该环境进行基于控制台输入输出及文件输入输出的C及C++程序的源代码编辑、编译连接、调试和运行巩固和增强程序设计和代码实现能力高精度计算、日期的处理、字符串的处理、链表的概念、实现和应用、枚举和递归的求解方法。3课程内容1.掌握vc++编程环境能够使用该环境进行基于控制台输入输出及文件输入输出的C及C++程序的源代码编辑、编译连接、调试和运行2.巩固和增强程序设计和代码实现能力高精度计算、日期的处理、字符串的处理、链表的概念、实现和应用、枚举和递归的求解方法、动态规划、模拟、数制转换等。4授课方式课上讲授、练习及测验复习、自学和书面作业上机实践和上机作业(40%)期末上交课程设计(60%)5第一章C/C++语言概述程序的基本框架变量C语言数据类型常量运算符和表达式注释分支语句循环语句函数标准输入输出
全局变量和局部变量数组字符串指针结构文件读写
C语言标准库函数命令行参数
C/C++编码规范6程序的基本框架#include源程序文件#include系统头文件全局变量定义voidmain(){……}类型子函数名(形参){……}/*源程序文件*/类型子函数名(形参){……}类型子函数名(形参){……}7变量变量的定义intnumber;int
numberofstudent=80;注:在VC环境中,变量定义和执行语句可交叉!P33例程1.12.1.cpp变量的赋值number=36;局部变量未赋值时,其值是随机的!变量的引用变量名(以字线下划线开头,由字母、数字和下划线构成)变量里存储的数据可能参与表达式的运算,或赋值给其他变量8数据类型int
基本整型,32位long长整型,32位short短整型,16位unsignedint
无符号基本整型unsignedshort无符号长整型unsignedlong无符号短整型char字符型unsignedchar无符号字符型float单精度符点型double双精度符点型类型自动转换(赋值时表达式转换成变量类型)boolean
布尔类型(true和false)9常量基本常量整型常量6501010x41实型常量3.141.8E5字符常量‘A’‘\n’‘\123’‘\x41’‘\\’字符串常量“ABC”“Xyb\nf787\123”符号常量(无参宏)#definePI3.1410运算符和表达式算术运算符加+减-乘*模%除/自增++自减--赋值运算符简单赋值=复合算术赋值(+=-+*=/=%=)复合位运算赋值(&=|=^=<<=>>=)关系运算符大于> 大于等于>= 小于<小于等于<= 等于== 不等于!=逻辑运算符与&&或||非!与&&或||运算符短路现象11运算符和表达式位运算符按位与&
按位或|按位异或^取反~左移<<:高位丢弃,低位补零右移>>:有符号数高位补符号,低位丢弃无符号数高位补零,低位丢弃xyx&yx|yx^y~y00000101011010011111110012运算符和表达式sizeof
运算符 求某变量占用内在的字节数sizeof(变量名)sizeof(类型名)类型强制转换运算符(类型名)应用:将实数f保留两位小数(int)(100*f+0.5)/100.0运算符的优先级P16表1-1结合性:左结合,右结合(单目、三目和赋值运算)13优先级运算符解释运算对象个数结合方式1()[]->.括号(函数等)数组通过指针访问成员访问成员由左向右
2!~++--+-*&(类型)sizeof()逻辑非按位求反增量(加1)减量(减1)正负号正取内容取地址类型转换求内存字节数1(单目运算符)由右向左
3*/%乘除取模2(双目运算符)由左向右
4+-加减2(双目运算符)由左向右
5<<>>按位左移按位右移2(双目运算符)由左向右
6<<=>>=小于小于等于大于大于等于2(双目运算符)由左向右
7==!=等于不等于2(双目运算符)由左向右
8&按位与2(双目运算符)由左向右
9^按位异或2(双目运算符)由左向右
10|按位或2(双目运算符)由左向右
11&&逻辑与2(双目运算符)由左向右
12||逻辑或2(双目运算符)由左向右
13?:条件运算3(三目运算符)由右向左
14=+=-=*=/=%=&=^=|=<<=>>=各种赋值2(双目运算符)由右向左
15,逗号(顺序)由左向右
14注释多行/*……*/单行//……
15if分支语句if语句(单分支、双分支、多分支)if(表达式)语句/语句组if(表达式)语句/语句组1else语句/语句组2if(表达式1)语句/语句组1elseif(表达式2)语句/语句组2elseif(表达式3)语句/语句组3
…………else语句/语句组n16switch语句switch(开关表达式)
{
case常量1:语句/语句组1;
case常量表达式2:语句/语句组2;
…
case常量表达式n:语句/语句组n;
default:语句/语句组n+1;
}break语句的作用switch分支语句17循环语句for语句for(初始条件表达式;循环控制表达式;循环操作表达式)
语句/语句组
for(i=n2=n3=0;i<=100;i++){if(i%2==0)n2++;elseif(i%3==0)n3++;}18循环语句while语句while(表达式)
语句/语句组;inti=4;intsum=0;while(i>0){sum=sum+i*i;i--;}19循环语句dowhile语句do
语句/语句组;while(表达式);inti=4;intsum=0;do{sum=sum+i*i;i--;}while(i>0);20循环语句break语句强行结束循环,转向执行循环语句的下一条语句。continue语句对于for循环,跳过循环体其余语句,转向循环操作表达式的计算;对于while和do-while循环,跳过循环体其余语句,转向循环条件的判定。21实验题(一)求s的值s=1/3+(2/5)+(3/7)+...+(49/99)+(50/101)将一个正整数分解质因数,例如:输入90,打印出90=2*3*3*5在小于500的素数中,输出最大的5个素数的和。将一个素数的各位数字顺序颠倒后仍然是素数叫可逆素数。输出100~500之间全部的可逆素数。编写一个程序,要求输出图案。抓交通肇事犯:一辆卡车违反交通规则,撞人后逃跑,现场有3人目击事件,但都没完全记住车号。甲说:“牌照的前两位数字是相同的”,乙说:“牌照的后两位数字是相同的,但与前两位不同”,丙是位数学家,他说:“四位车号刚好是一个整数的平方”。请根据以上线索求出车号。08888888810188888821012888832101238843210123422函数函数的定义返回值类型函数名([类型参数名1,类型参数名2……){
语句1;
语句2;
……return返回值;//若为void类型,则不用返回语句
}函数的调用调用形式:函数名(实际参数表)调用的应用形式:(1)函数调用语句;(2)出现在表达式中;(3)作为另一个函数调用的实际参数23判断m是否为素数intprime(intm){inti;if(m<=1)return0;for(i=2;i<m;i++) if(m%i==0)return0;return1;}24函数参数传递值传递:形参是变量,实参是表达式地址传递:形参是指针,实参是地址,形参和实参共用存储单元返回值库函数编译器提供的完成某些特定功能的函数头文件后缀名一般为.h,由编译器提供,包含库函数的声明25递归调用:在函数的调用过程中直接或间接地调用自己。
直接递归:函数不断直接调用自己;
间接递归:函数循环间接调用自己。函数的递归调用编写递归函数必须有两个条件:(1)有递归调用的形式,即形式上要能自己调用自己;(2)必须有终止递归调用的条件。利用函数的递归调用解决问题的优点:
(1)递归调用的算法自然、容易理解;
(2)采用递归算法的程序简单;
(3)解决用其他方法无法解决的问题(如汉洛塔问题)。26古代有一个梵塔,塔内有三各底座A、B、C。开始时A座上有64个盘子,牌子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座上去,每一次只允许移动一个盘子,且在移动过程中每个底座上的盘子必须是大的在下,小的在上。ABCHanoi(汉诺)塔问题:27老和尚只需这样做:(1)命令第二个和尚将63个盘子从A移到B座;(2)自己将最底下最大的那一个盘子从A移到C座;(3)再命令第二个和尚将63个盘子从B移到C座;第二个和尚这样做:(1)命令第三个和尚将62个盘子从A移到C座;(2)自己将最底下的最大的那一个盘子从A移到B座;(3)命令第二个和尚将62个盘子从C移到B座;这样以此类推,层层下放,直到第63个和尚找到第64个和尚,第64个和尚的任务是将一个盘子移到另一座上,第63个和尚再完成自己的任务;第62个和尚再完成自己的任务;…;老和尚才能完成自己的任务。3个盘子的步骤为:A->C,A->B,C->B,A->C,B->A,B->C,A->C28#include<stdio.h>voidmove(chargetone,charputone){printf("%c--->%c\n",getone,putone);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two);
move(one,three); hanoi(n-1,two,one,three);}}main(){intm;
printf("Inputthenumberofdisks:");
scanf("%d",&m);
printf("Thestepstomoving%3ddisks:\n",m);
hanoi(m,'A','B','C');}29标准输入输出输出语句printfint
printf(constchar*,...);返回值:成功打印的字符数;返回负值为出错格式控制符:%[-][+][0][#][整数1][.整数2][l或h]格式字符流输出对象cout<<表达式<<endl格式字符格式字符含义d或i以十进制形式输出一个带符号整数o以八进制形式输出一个无符号整数X,x以十六进制输出一个无符号的整数u以十进制输出一个无符号的整数f表示以小数形式输出带符号的实数(包括单、双精度)E,e表示以指数形式输出带符号的实数G,g表示选择%f或%e格式输出实数(选择占宽度较小的一种格式输出)c表示输出一个单字符s表示输出一个字符串注:大写字母表示输出中的字母为大写30标准输入输出输入语句scanf#include<stdio.h>int
scanf(constchar*,...);第一个参数是格式字符串,后面的参数是变量的地址,函数作用是按照第一个参数指定的格式,将数据读入到后面的变量中格式字符串:%[*][输入数据宽度m][长度]类型返回值:>0成功读入的数据项个数;0没有项被赋值;EOF第一个尝试输入的字符是EOF(结束)流输入对象cincin>>变量31全局变量和局部变量局部变量在函数内部定义的变量作用域仅限于函数内或复合语句内全局变量在所有函数之外定义的变量默认初值为032例程1.11.cpp1. intn1=5,n2=10;2. voidFunction1()3. {4. intn3=4;5. n2=3;6. }7. voidFunction2()8. {9. intn4;10. n1=4;11. n3=5;//编译出错12. }13. intmain()14. {15. intn5;16. intn2;17.
if(n1==5){18. intn6;19. n6=8;20. }
21. n1=6;22. n4=1;//编译出错23. n6=9;//编译出错24. n2=7;25. return0;26. }
33存储属性动态存储静态存储存储类型register(寄存器)auto(自动)static(静态)
extern(外部)存储位置寄存器
主内存
生存期动态生存期
永久生存期
作用域局部
局部或全局
全局
变量的存储方式34数组一维数组类型名数组名[元素个数];
intan[100];数组元素的表示:数组名[下标]下标从0开始35数组数组的初始化类型名数组名[常量表达式]={值,值……}
inta[10]={0,1,2,3,4,5,6,7,8,9};数组越界36排序(选择法)#include<stdio.h>voidsort(inta[],intn){inti,j;for(i=0;i<n-1;i++){
intt=i;for(j=i+1;j<n;j++) if(a[j]<a[t])t=j;
if(i!=t){intx=a[i];a[i]=a[t];a[t]=x;} }}37例:设A是含有n(n≥1)个元素的整型数组,编写一个求A中n个整数的平均值的递归算法。floataverage(int
a[],intm){if(m==1)returna[0];elsereturn(a[m-1]+average(a,m-1)*(m-1))/m;}voidenter(inta[],intn){inti;
printf("pleaseinput%dnumbers:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);}voidprint(inta[],intn){inti;
for(i=0;i<n;i++)printf("%4d",a[i]);
printf("\n");}思考题:求n个数中的最大数(递归)38例:给定一个整型数组b[n],b中连续的相等元素构成的子序列称为平台。试设计算法,求出b中最长平台的长度。int
length(intb[],intn){inti,p,q;i=0;p=0;while(i<n){q=1;i++;while(i<n&&b[i-1]==b[i]){q++;i++;}if(q>p)p=q;}returnp;}思考题:找出b[n]中最长平台的首末位置。39编写函数,找出2~1000中所有满足条件的数:各位数字都是素数,且各位数字之和也是素数。编写递归函数,求2+(2+4)+(2+4+6)+...+(2+4+6+...+20)编写函数,从键盘输入年份,判断是否是闰年。用递归算法求两个自然数的最大公约数和最小公倍数。排序算法(子函数形式,n个数)选择排序、冒泡排序、交换排序6.查找算法(子函数形式,n个数中找x)顺序查找、折半查找7.验证歌德巴赫猜想:任何一个大于6的偶数均可表示成两个素数之和,输出全部可能的结果。例如输入24,输出:24=5+19,24=7+17,24=11+13实验题(二)40数组二维数组类型名数组名[行数][列数];
inta[20][30];
数组名[行下标][列下标]
行下标和列下标从0开始二维数组在内存中按行存放41#include<stdio.h>main()
{inti,j,a[3][4];
for(i=0;i<3;i++)/*变量i控制数组的行下标*/
for(j=0;j<4;j++)/*变量j控制数组的列下标*/
scanf("%d",&a[i][j]);
for(i=0;i<3;i++){for(j=0;j<4;j++)
printf("a[%d][%d]=%d\t",i,j,a[i][j]);
printf("\n");/*每行输出结束时换行*/}}例二维数组的输入与输出例:将螺旋方阵存放在n×n的二维数组中并将其输出,5阶的螺旋数组如下:
116151413 217242312 318252211 419202110 56789#include<stdio.h>voidmain(){inta[10][10]={0},i,j,k,n,value=1;
printf("pleaseinputn:");
scanf("%d",&n);
for(k=0;k<(n+1)/2;k++){for(i=k;i<n-k;i++)a[i][k]=value++;
for(j=k+1;j<n-k;j++)a[n-k-1][j]=value++;
for(i=n-k-2;i>=k;i--)a[i][n-k-1]=value++;
for(j=n-k-2;j>k;j--)a[k][j]=value++;}printf("thearray:\n");
for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%4d",a[i][j]);
printf("\n");}}一次运行结果:pleaseinputn:6thearray:120191817162213231301532233362914423343528135242526271267891011例:填数问题,从整数1至10中任取9个不同的数,填入下图的9个格子中,使所有左、右相邻和上、下相邻的两个格子中的数之和是素数。试编写程序,求出所有的解。其中一个解:
#include"stdio.h"inttotal=0;main(){voidfillblank(inta[3][3],intb[],int,int);
inta[3][3],b[10]={1,2,3,4,5,6,7,8,9,10};fillblank(a,b,0,0);
printf("totalwaysis:%d\n",total);}1254387109int
prime(intn)//素数{inti=2;
if(n<2)return0;
while(i<n/2)if(n%i==0)return0;elsei++;
if(i>=n/2)return1;}voidPRINT2(inta[3][3],intn,intm)//输出{inti,j;for(i=0;i<n;i++){for(j=0;j<m;j++)printf("%5d",a[i][j]);
printf("\n");}}voidfillblank(inta[3][3],intb[],int
i,intj){intc[10],k,flag,l,n,ii=i,jj=j;
int
prime(int);
for(k=0;k<10;k++){for(l=0;l<10;l++)c[l]=b[l];flag=0;n=c[k];i=ii;j=jj;if(c[k]){if(i>0&&j>0&&prime(n+a[i-1][j])&&prime(n+a[i][j-1])) flag=1;
if(i>0&&j==0&&prime(n+a[i-1][j]))flag=1;
if(i==0&&j>0&&prime(a[i][j-1]+n))flag=1;
if(i==0&&j==0)flag=1;}if(flag){a[i][j]=c[k];c[k]=0;if(i==2&&j==2) {PRINT2(a,3,3);total++;}else{if(i<2)
if(j<2)j++; else{i++;j=0;} elsej++;
fillblank(a,c,i,j);} }}}一次运行的部分结果:
109432185610983254161098743612totalwaysis:12849字符串字符串常量“CHINA”、”Cprogram!”用字符数组存放字符串charstr[]=“abcd1234\n”指针方式char*str=“abcd1234\n”50例:统计字符串"thisisabegwearestudents"中单词个数。规定单词由小写字母组成,单词之间由空格分隔,字符串开始和结尾没有空格。#include"stdio.h"main(){charstr[80];
inti,num=0,word=0;
gets(str);
for(i=0;str[i]!=‘\0’;i++)if(str[i]=='')word=0;elseif(word==0){word=1;num++;}
printf("NUM=%d",num);}51例:将输入数字字符串(长度在10以内)转化成整数若输入字符串"-1234",则把它转换为整数值-1234。#include<stdio.h>#include<string.h>main(){charstr[10];
inti=0,j,t=1;longk=0;
gets(str);if(str[0]=='-'){t=-1;i=1;}j=strlen(str);for(;i<j;i++)if(str[i]>='0'&&str[i]<='9')k=k*10+str[i]-48; elsebreak;
printf("k=%ld\n",k*t);}52实验题(三)1.打印魔方阵把1到N2个自然数填在N×N方阵中,使每行、每列、主对角线、副对角线上的元素之和都相等1)将1放在第一行正中间位置2)若K已填好,则K+1放在K的右上方(右一上一)。3)若右上方已超出方阵第一行(最后一列),则下一数放在最后一行(第一列)上。4)若K为N的倍数,则K+1放在K的正下方。2.按照蛇形将1,2,3,…,n2填到n*n矩阵中并输出。1341011259121968131820714172124151622232553统计字符串"Thisisabeg。Wearestudents。"中元音字母的个数。输出格式:a:3,e:4,i:5,o:6,u:7编写程序输出下面图形(要求用嵌套的循环语句实现)。设计程序输入一个字符串并判断其是否是“顺序串”(从小到大或从大到小排序,如:AABccd或dccBAA),“是”则打印“Yes”,“否”则打印“No”。S=“S1S2…Sn”,为一个长为N的字符串,存放在一维数组中,编程序将S改造之后输出:①将S的所有第偶数个字符按照其原来的下标从大到小的次序放在S的后半部分;②将S的所有第奇数个字符按照其原来的下标从小到大的次序放在S的前半部分。求串S中出现的第一个最长重复子串及其位置。12132143215432154指针指针的基本概念指针即地址。由于地址唯一确定程序实体的存储位置,就象路标一样,故形象地称为指针指针变量:专门存放变量(或其它程序实体)地址的变量指针的定义类型名*指针变量名;
不论是什么类型的指针变量,其占用的空间都是4个字节指针运算指针的算术运算①指针变量的++和--运算;②指针加、减整数运算;③指向同一数组不同元素的指针相减运算。指针的关系运算指针的关系运算即比较指针(地址)大小的运算。空指针值为NULL
的指针,被称作空指针。空指针指向地址055指针指向指针的指针(多级指针)如果一个指针里存放的是另一个指针的地址,则称这个指针为指向指针的指针intx=65; 普通变量int*p;一级指针int**p; 二级指针引用普通变量x有三种方法:x,*p,**q56指针指针和数组一维数组名:一级指针常量如inta[10];a和&a[0]等价指向数组元素的指针变量int*p=a(或&a[0])数组元素表示方法:a[i],*(a+i),*(p+i),p[i]57指针指针与二维数组二维数组inta[3][4]a[i][j]≡*(a[i]+j)≡*(*(a+i)+j)≡(*(a+i))[j]指向数组元素的一级指针变量
int*p=a[0]a[i][j]≡*(p+4*i+j)指向一维数组的行指针变量(*p)[4]=ap[i][j]≡*(p[i]+j)≡*(*(p+i)+j)≡(*(p+i))[j]==a[i][j]指针数组int*array[3];for(i=0;i<3;i++)p[i]=a[i];则有p[i][j]≡*(p[i]+j)≡*(*(p+i)+j)≡(*(p+i))[j]≡*(p[0]+n*i+j)≡*(*p+n*i+j)==a[i][j]58指针字符串和指针字符串的方式有(1)直接引用常量字符串;
(2)字符数组方式;(3)字符型指针变量方式。void指针void*p;/*主要用于内存复制*/void*memcpy(void*desc,constvoid*src,unsignedintn)59指针函数指针类型名(*指针变量名)(参数类型1……)调用:函数指针名(参数)指针和动态内存分配C动态内存分配:
有:malloc、calloc、realloc
、freeC++动态内存分配:p=new类型名;delete指针;误用无效指针60设计一个简单的四则运算计算器功能:对一个简单表达式,能求其结果。算式中只出现操作数(整型数)、+、-、*、/。注意运算的优先性。分析:定义两个数组optr、opnd,分别用来存放运算符和操作数。每次都根据当前输入的字符,决定下一步该怎么做。为了分析的方便,将’#’放在optr[0]及表达式的后面,用以判断计算的结束。#definepush(p,c)*p=c;p++;#definepop(p,c)p--;c=*p;#include<stdio.h>voidmain(){int
calculate(int,char,int);
intcompare(char,char);charoptr[20],*ptr,ch,theta;
intopnd[40],*pnd,data,data1,data2;
ptr=optr;pnd=opnd;
printf("\npleaseinputacalculationexpression:\n");
ch=getchar();
if(ch!='#')putchar(ch);
push(ptr,'#');
while(ch!='#'||*(ptr-1)!='#'){if(!(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='#')){data=0;
while(ch>='0'&&ch<='9'){data=data*10+ch-'0';
ch=getchar();
if(ch!='#')putchar(ch);}
push(pnd,data);}elseswitch(compare(*(ptr-1),ch)){ case-1:push(ptr,ch);ch=getchar();
if(ch!='#')putchar(ch);break; case1:pop(ptr,theta);pop(pnd,data1); pop(pnd,data2);data=calculate(data2,theta,data1);
push(pnd,data);}}
printf("=%d\n",*(pnd-1));}int
calculate(intdata1,chartheta,intdata2){switch(theta){case'+':returndata1+data2;case'-':returndata1-data2;case'*':returndata1*data2;case'/':returndata1/data2;
default:printf("wrongtheta:%c!\n",theta);exit(-1);}}intcompare(charc1,charc2){if(c1=='#')return-1;if(c1=='+'||c1=='-')if(c2=='*'||c2=='/')return-1;elsereturn1;if(c1=='*'||c1=='/')return1;}一次运行结果:pleaseinputacalculationexpression:4+6*7/4-5#4+6*7/4-5=9数组中计算过程的变化演示:步骤optr
opnd
输入串主要操作
1#4+6*7/4-5#push(opnd,4)2#4+6*7/4-5#push(optr,+)3#+46*7/4-5#push(opnd,6)4#+46*7/4-5#push(optr,*)5#+*467/4-5#push(opnd,7)6#+*467/4-5#cal(6,*,7)7#+442/4-5#push(optr,/)8#+/4424-5#push(opnd,4)9#+/4424-5#cal(42,/,4)10#+410-5#cal(4,+,10)11#14-5#push(optr,-)12#-145#push(opnd,5)13#-145#cal(14,-,5)14#9#over
算符优先关系表
θ2+-*/#
θ1
+>><<>->><<>*>>>>>/>>>>>#<<<<=
思考:有括弧的情况。算符优先关系表
θ2+-*/()#
θ1
+>><<<>>->><<<>>*>>>><>>/>>>><>>(<<<<<=)>>>>>>#<<<<<=66结构结构的概念struct
结构名
{成员类型名成员变量名;
成员类型名成员变量名;
……
……
成员类型名成员变量名;};结构变量的定义67结构访问结构变量的成员结构变量名.成员变量名结构变量的初始化结构数组指向结构变量的指针结构名*指针变量名;指针->成员变量名(*指针).成员变量名动态分配结构变量和结构数组68文件读写打开文件fopenFILE*fopen(constchar*filename,constchar*mode)打开方式:arwb+关闭文件fcloseint
fclose(FILE*stream);格式化读文件fscanf写文件fprintfint
fscanf(FILE*stream,constchar*format[,address,…])int
fprintf(FILE*stream,constchar*format[,argument,…])69文件读写字符读文件fgetc写文件fputcint
fgetc(FILE*stream);int
fputc(intc,FILE*stream);字串读文件fgets写文件fputschar*fgets(char*s,intn,FILE*stream);int
fputs(constchar*s,FILE*stream);70文件读写数据块读文件fread写文件fwriteunsignedfread(void*ptr,unsignedsize,unsignedn,FILE*stream);unsignedfwrite(constvoid*ptr,unsignedsize,unsignedn,FILE*stream);文件以二进制方式打开文件指针定位fseekint
fseek(FILE*stream,longoffset,intwhence);71C语言标准库函数数学函数字符处理函数字符串和内存操作函数字符串转换函数72命令行参数将用户在DOS窗口输入可执行文件名的方式启动程序时,跟在可执行文件名后面的那些字符串,称为“命令行参数”。命令行参数可以有多个,以空格分隔。比如,在命令提示符窗口敲:
copyfile1.txtfile2.txt“copy”,“file1.txt”,“file2.txt”
就是命令行参数
如何在程序中获得命令行参数呢?73命令行参数int
main(int
argc,char*argv[]){ ……}参数argc就代表启动程序时,命令行参数的个数。C/C++语言规定,可执行程序程序本身的文件名,也算一个命令行参数,因此,argc的值至少是1。argv是一个数组,其中的每个元素都是一个char*类型的指针,该指针指向一个字符串,这个字符串里就存放着命令行参数。例如,argv[0]指向的字符串就是第一个命令行参数,即可执行程序的文件名,argv[1]指向第二个命令行参数,argv[2]指向第三个命令行参数……。74#include<stdio.h>int
main(int
argc,char*argv[]){
for(inti=0;i<argc;i++)
printf("%s\n",argv[i]); return0;}将上面的程序编译成sample.exe,然后在控制台窗口samplepara1para2s.txt54输出结果就是:samplepara1para2s.txt5475宏及新类型名的声明宏分为带参宏及无参宏1.无参宏(1)定义#define宏名宏体(2)说明
①宏名一般习惯用大写字母表示,以便与变量相区别。
②使用宏名时,可以减少书写工作量。
③宏只是简单的字符串替换,不作正确性检查。
④末尾不加”;”,否则将视“;”为宏体的一部分。
⑤作用范围从定义的地方开始到文件结束。
⑥用#undef
命令终止宏定义的作用域。
⑦宏定义可嵌套。
⑧程序中用双引号括起来的字符串内字符,即使与宏名相同,也不作替换。
⑨宏与变量有区别,系统不为宏名分配内存空间。2.带参数的宏定义定义#define宏名(参数列表)宏体宏体中包含参数列表中出现的参数。宏调用形式:宏名(实参表)作用:从本行起以下“宏名(实参表)”(字符串中除外)都用替换文本替换,替换文本中的形参换成实参。宏终结命令#undef#undef
宏名77用户定义类型1.定义“替代”类型名
typedef
类型名标识符;注意:“类型名”必须是系统提供的数据类型或用户已定义的数据类型。作用:给已有类型起个别名标识符,例如
typedef
intINTEGER;2.定义“构造”类型名typedef
类型名标识符及“构造”;注意:“类型名”必须是系统提供的数据类型或用户已定义的数据类型。作用:自己定义新“构造”类型名标识符。78举例(1)定义字符型指针类型名CHARPtypedefchar*CHARP;CHARPp,q;即等价于:char*p,*q;(2)定义具有3个元素的整型数组名NUM
typedef
intNUM[3];
NUMa,b,c;就相当于inta[3],b[3],c[3];(3)定义某结构体类型名STUDENT
typedef
struct
{intnum;
charname[10];
charsex;
floatscore[3];
}STUDENT;STUDENTstu1,stu2,*st;793.定义新类型名的一般步骤及说明(1)先按定义变量或数组的方法写出定义;如:chara[10];(2)将定义的名字换成新类型名;如:charNAME[10];(3)在前面加上typedef;如:typedefcharNAME[10];(4)然后可以用新类型名定义变量;如:NAMEc,d;c、d即是有10个元素的字符数组80C/C++编码规范标识符命名注意事项程序的书写格式注释的写法一些好的编程习惯81标识符的命名匈牙利命名法为C程序标识符的命名定义了一种非常标准化的方式,这种命名方式是以两条规则为基础的:a.变量的名字以一个或者多个小写字母前缀开头,前缀能够体现变量数据类型、作用域等信息。b.在标识符内,前缀以后就是一个或者多个第一个字母大写的单词,这些单词清楚地指出了该标识符的作用。82推荐一种C程序标识符命名法1)变量命名加前缀
c char
uc unsignedchars shortn intu unsignedintl long
dw unsignedlongb 取值只为真和假的整型变量如bValid
sz
以’\0’结尾的字符串或字符数组
f 浮点数(float)h HANDLE(句柄)
d double83推荐一种C程序标识符命名法p 指针
psz
指向字符串的指针
pn
整型指针
m_ 类成员变量
g_ 全局变量
a 数组
fp
文件指针FILE*e enum类型
g_ 全局变量参数后面加‘_’,如
intSum(intx_,inty_){ }84推荐一种C程序标识符命名法2)变量名中单词开头字母大写,其他字母小写 但是常用的意义明显的变量,如i,j,k,坐标x,y等不必遵循1),2)3)常量和宏都是大写,单词之间用‘_’分隔
#define MAX_WIDTH5 #define ABS(x) ((x)>=0?(x):-(x))4)函数名字中每个单词的头一个字母大写,其他字母小写。一般采用动词+名词形式
voidPrintMessage();
int
WriteIdToFile(FILE*_fp,int_nId);85推荐一种C程序标识符命名法5)结构定义加大写字母S作为前缀
struct
SPerson{
int
nId;
int
nAge; };6)类定义加大写字母C作为前缀
classCPerson{
int
m_nId; };7)类型定义全部大写
typedef
struct
SPersonPERSON;
typedef
struct
SPerson*PPERSON;//指针加‘P’86标识符命名应注意的一些细节标识符号应能提供足够信息,最好是可以发音的。为全局变量取长的,描述信息多的名字,为局部变量取短名字名字太长时可以适当采用单词的缩写。但要注意,缩写方式要一致。要缩写就全都缩写。 比如单词Number,如果在某个变量里缩写成了:
int
nDoorNum;那么最好包含Number单词的变量都缩写成Num。4)注意使用单词的复数形式。如
int
nTotalStudents,nStudents;容易让人理解成代表学生数目,而nStudent
含义就不十分明显87标识符命名应注意的一些细节5)对于返回值为真或假的函数,加“Is”前缀如:
int
IsCanceled();
int
isalpha();//C语言标准库函数
BOOL IsButtonPushed();6)对于获取某个数值的函数,加“Get”前缀
char*GetFileName();7)对于设置某个数值的函数,加“Set”前缀
voidSetMaxVolume();8)一般变量和结构名用名词,函数名用动词或动宾词组。88程序书写格式注意事项1)正确使用缩进 首先,一定要有缩进,否则代码的层次不明显。 缩进应为4个空格较好。需要缩进时一律按Tab键,或一律按空格键,不要有时用Tab键缩进,有时用空格键缩进。一般开发环境都能设置一个Tab键相当于多少个空格,此时就都用Tab键2)行宽与折行。一行不要太长,不能超过显示区域。以免阅读不便。太长则应折行。折行最好发生在运算符前面,不要发生在运算符后面如
if(Condition1()&&Condition2() &&Condition3()){ }89程序书写格式注意事项3)注意‘{’,‘}’位置不可随意,要统一 如果写了:
if(condition1()){
DoSomething(); }
别处就不要写
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文员个人总结简短500字
- 指定监护人决定书(5篇)
- 科技读书节开幕词(3篇)
- 灭火应急预案大全15篇
- 建筑项目施工合同范本(34篇)
- 北京市海淀区2024−2025学年高二上学期阶段性针对训练(10月) 数学试卷含答案
- 风险整改报告5篇
- DB11T 1500-2017 自然保护区建设和管理规范
- 2023年冷弯型钢资金需求报告
- 2023年建材级纤维素醚资金申请报告
- 等离子喷涂原理与应用
- 化工仪表及自动化ppt完整版(第三版-厉玉鸣)课件
- 人教版小学1-6年级日积月累(全)
- 大型连锁超市商品分类明细表
- 新生儿听力筛查PPT幻灯片课件
- 公对公欠款协议书范文
- 网吧公司章程范本
- 对甲苯磺酸检测标准2
- PVC热稳定剂常见测试方法解析
- DB63∕T 1996-2021 自然保护地 特许经营
- 《热爱生命》汪国真_教案
评论
0/150
提交评论