二级培训C讲义wang9程序.docx
- 文档编号:8628021
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:19.32KB
二级培训C讲义wang9程序.docx
《二级培训C讲义wang9程序.docx》由会员分享,可在线阅读,更多相关《二级培训C讲义wang9程序.docx(14页珍藏版)》请在冰豆网上搜索。
二级培训C讲义wang9程序
二级考试C培训讲义
第A章程序讲解
例10:
计算器模拟
main()
{charoperator='+';
floatnum,answer=0;
while(operator!
='=')
{scanf("%f",&num);
switch(operator)
{case'+':
answer=answer+num;
printf("+%f=%f\n",num,answer);break;
case'-':
answer=answer-num;
printf("-%f=%f\n",num,answer);break;
case'*':
answer=answer*num;
printf("*%f=%f\n",num,answer);break;
case'/':
if(num<0.00001)printf("error!
\n");
else{answer=answer/num;
printf("/%f=%f\n",num,answer);
}
}
operator=getchar();
}
}
6.1.4例
例:
在结构数组中查找。
/*版本一:
根据姓名查学号*/
/*版本二:
根据学号查姓名*/
structstudent
{intid;
charname[8];
};
typedefstructstudentSTUDENT;
main()
{STUDENTstudents[3]={{5,"aaa"},{3,"bbb"},{4,"ccc"}};
intid;
id=SearchByid(s,i);
puts(s1);
}
char*search(chars[][10],inti)
{char*p;
if(i>4||i<0)return(NULL);
p=s+i;
return(p);
}
例3、Hanoi
用道具演示Hanoi塔的搬迁步骤。
voidhanoi();
voidmove();
main()
{hanoi(4,'A','B','C');}/*3个柱子用3个字符表示*/
voidmove(charget,charput)/*表示最基本的移动操作*/
{printf("%c-->%c\n",get,put);}
/*策略*/
voidhanoi(intn,charsource,charhelp,chartarget)
{if(n==1)move(source,target);
else
{hanoi(n-1,source,target,help);
move(source,target);
hanoi(n-1,help,source,target);
}
}
例3、矩阵相乘
分解问题,如何计算c[i][j],
图示乘法规律,引入循环变量k
main()
{inta[2][3]={{1,2,3},{4,5,6}};
intb[3][2]={{1,2},{3,4},{5,6}};
intc[2][2],i,j,k;
for(i=0;i<2,i++)
for(j=0;j<2,j++)
{c[i][j]=0;
for(k=0;j<3,k++)c[i][j]+=a[i][k]*b[k][j];
}
}
gets(字符数组名)返回值:
该数组的地址(一般无用)
与scanf()的操作差别
puts(字符数组名)返回值:
无意义
i=0;
while(s[i]!
='\0')
{putchar(s[i]);i++;}
strcpy(目标,源数组名)返回值:
目标数组的地址
数组之间不可能直接赋值
strcpy(s1,s2)s1[]<=s2[]
i=0;
while(s2[i]!
='\0')
{s1[i]=s2[i];i++;}
s1[i]='\0';
数组空间大小需注意。
假设有chars1[10],s2[20];(相继定义,则空间连续),且s2中字符串长度>10,调用strcpy可能破坏s2[]中数据。
strcat(主数组名,子数组名)返回值:
主数组的地址
如主数组空间不够大,数据的改动涉及到数组之外,破坏是不可估计的。
strcmp(数组1名,数组2名)
返回值:
数组1的元素依次减数组2的元素。
<0数组1小于数组2,
>0数组1大于数组2,
=0数组1等于数组2
strlen(数组名)从数组始地址开始计数,直至遇到'\0'
字符串长度不包括'\0'
其正确性依赖于数据是否规范。
i=0;
while(s[i]!
='\0')i++;
strupr(数组名)转变数组元素为大写字符,返回值:
数组地址
strlwr(数组名)转变数组元素为小写字符,返回值:
数组地址
例2、狼追兔子,兔子躲在环形分布的10洞中的哪几个洞安全?
(强盗杀人质,数学家如何求生)
分析
起始情况step=1;current=0;
循环操作cave[current]=1;step++;current+=step;
终止条件step=1&¤t=0
循环条件!
(step=1&¤t=0)
循环结构用do...while不用while或for
#defineMAXLEN10
main()
{intcave[MAXLEN];
inti,current,step;
for(i=0;i<=MAXLEN-1;i++)cave[i]=0;
step=1;current=0;
do
{cave[current]=1;step++;current+=step;
current%=10;step%=10;
}
while(current!
=0||step!
=1);
for(i=0;i<=MAXLEN-1;i++)
if(cave[i]==0)printf("%d,",i);
}
例3:
求所有满足如下条件的三位数,它除以11的商等于它的各位数字的平方和。
例如550,除以11为50,5x5+5x5+0x0=50,打印所有满足条件的三位数。
#include
main()
{inti,j,n,s;
for(i=110;i<1000;i=i+11)
{n=i;j=n/11;s=0;
whileAAAA
{BBBB
n=n/10;
}
if(j==s)printf("%5d",i);
}
}
AAAA:
(n>0)
BBBB:
s=s+(n%10)*(n%10);
例18、一元二次方程求解(用项目文件)
/**********AA.prj**********/
a1.c
a2.c
/**********A1.c**********/
#include"stdio.h"
#include"math.h"
externvoidsub1(floata,floatb,floatc);
externvoidsub2(floata,floatb,floatc);
externvoidsub3(floata,floatb,floatc);
main()
{floata,b,c,x;
scanf("%f,%f,%f",&a,&b,&c);
x=b*b-4*a*c;
if(x>0)sub1(a,b,c);
if(x==0)sub2(a,b,c);
if(x<0)sub3(a,b,c);
}
/**********A2.c**********/
#include"stdio.h"
#include"math.h"
voidsub1(floata,floatb,floatc)
{printf("x1=%f\n",(-b+sqrt(b*b-4*a*c))/(2*a));
printf("x2=%f\n",(-b-sqrt(b*b-4*a*c))/(2*a));
}
voidsub2(floata,floatb,floatc)
{printf("x1=x2=%f\n",-b/(2*a));}
voidsub3(floata,floatb,floatc)
{printf("x1=%f+%fi\n",-b/(2*a),sqrt(-b*b+4*a*c)/(2*a));
printf("x2=%f-%fi\n",-b/(2*a),sqrt(-b*b+4*a*c)/(2*a));
}
利用静态变量组织函数
main()
{.......
if(x>0){x1=sub1(a,b,c);x2=sub1(a,b,c);printf("%f,%f\n",x1,x2);}
....
}
floatsub1(floata,floatb,floatc)
{staticinti=1;
if(i==1){i++;return((-b+sqrt(b*b-4*a*c))/(2*a));}
elsereturn((-b-sqrt(b*b-4*a*c))/(2*a));
}
例17、矩阵倒置
voidrotate();
main()
{inta[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
inti,j;
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
printf("%2d",a[i][j]);
printf("\n");
}
rotate(a);
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
printf("%2d",a[i][j]);
printf("\n");
}
}
voidrotate(inta[][4])
{inti,j,temp;
for(i=0;i<4;i++)
for(j=i+1;j<4;j++)
{temp=a[i][j];a[i][j]=a[j][i];a[j][i]=temp;}
}
例15、求数组的鞍点
#defineROW3
#defineCOL4
main()
{inti,j,k,max,max_j,min,min_i;
inta[ROW][COL]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
for(i=0;i {/*求第i行的最大值max,及其列下标max_j*/ max_j=0;max=a[i][max_j]; for(j=1;j if(a[i][j]>max){max=a[i][j];max_j=j;} /*求第max_j列的最小值min,及其行下标min_i*/ min_i=0;min=a[min_i][max_j]; for(k=0;k if(a[k][max_j] if(min_i==i)printf("%d,%d: %d\n",i,max_j,max); elseprintf("%d: NOPOINT\n",i); } } 结果: 0,3: 4 1: NOPOINT 2: NOPOINT 例14、在有序的字符串中插入一个字符 #include"stdio.h" #include"string.h" main() {charstr[80],c;/*将c插入在第一个比它大的str[i]位置中原str[i]及其后元素后移*/ intlen,i,j; gets(str);len=strlen(str); c=getchar(); for(i=0;str[i]<=c&&str[i]! ='\0';i++);/*找第一个比c大的str[i],若c最大,则i为len*/ for(j=len;j>i;j--)str[j]=str[j-1];/*str[i]...str[len-1]=>str[i+1]...str[len]若i为len,循环不执行*/ str[i]=c; str[len+1]='\0'; puts(str); } 例13、P97,例6.8题目稍作改动 将一个字符串中所有单词的首字符改为大写: "iamwq"-->"IAmWq" #include"stdio.h" #include"ctype.h" #defineYES1 #defineNO0 main() {inti,inword; charstring[80],c; inword=NO; gets(string); for(i=0;(c=string[i])! ='\0';i++) if(c==''||c=='\t')inword=NO; else if(inword==NO) {if(islower(string[i]))string[i]-=32; inword=YES; } puts(string); } 例12、折半查找 查字典引出变量low、high、mid x[mid]与待查数t的比较=0,>0,<0 #include"string.h" #defineMAX10 #defineTRUE1 #defineFALSE0 main() {charx[MAX][20]={"00","111","2","33","44","55","66","777","88","99"}; chartemp[20]="44"; intlow=0,high=MAX-1,mid; intfound=FALSE; while((low<=high)&&(! found)) {mid=(low+high)/2; if(strcmp(temp,x[mid])<0)high=mid-1; if(strcmp(temp,x[mid])==0)found=TRUE; if(strcmp(temp,x[mid])>0)low=mid+1; } if(found)printf("%d\n",mid); elseprintf("NOFOUND\n"); } 例11: 找出关键字在文件中出现的次数 #include"stdio.h" #defineMAX30 #defineNKEYS3 structkey {char*keyword; intcount; }keylist[NKEYS]={{"do",0},{"while",0},{"for",0}}; FILE*fp; main() {inti; charword[MAX]; fp=fopen("1.1","r"); while((getword(word))! =EOF) {if((i=find(word,keylist,NKEYS))>=0) keylist[i].count++; } fclose(fp); for(i=0;i if(keylist[i].count>0) printf("%s: %d\n",keylist[i].keyword,keylist[i].count); } intgetword(char*word) {char*p; if(feof(fp))return(EOF); p=word; while(((*p=fgetc(fp))==''||*p=='\n')&&! feof(fp)); if(feof(fp))return(EOF); while((*++p=fgetc(fp))! =''&&*p! ='\n'&&! feof(fp)); *p='\0'; return (1); } intfind(char*word,structkey*keylist,intn) {inti; for(i=0;i if(strcmp(word,keylist->keyword)==0)return(i); return(-1); } 例9: 用递归实现打印正负整数 #include"stdio.h" main(){printd(-12345);} printd(intn) {inti; if(n<0){putchar('-');n=-n;} if((i=n/10)! =0)printd(i); putchar(n%10+'0'); } 例8: 用递归实现字符串的倒置、顺置 #include"string.h" voidreverse(chars[]); inti; chars2[10]=""; main() {chars1[]="abcdef"; i=0; reverse(s1); puts(s2); } voidreverse(chars[]) {if(strlen(s)==1)s2[i++]=s[0]; else{reverse(s+1);s2[i++]=s[0];} } 例7: 一维数组的应用。 找出一个字符串中的字母对的出现次数 #include"stdio.h" main() {intcon[27][27],i,j,ch; charstr[]="helloworld"; printf("wqwq\n"); for(i='a';i<='z';i++) for(j='a';j<='z';j++) con[i-'a'][j-'a']=0; i=0; while((ch=str[i])! ='\0') {if(ch>='a'&&ch<='z'&&str[i+1]>='a'&&str[i+1]<='z') con[ch-'a'][str[i+1]-'a']++; i++; } for(i='a';i<='z';i++) for(j='a';j<='z';j++) if(con[i-'a'][j-'a']! =0) printf("%c%c: %d\n",i,j,con[i-'a'][j-'a']); } 例5: 读程序,写结果 #include"stdio.h" charinput[]="SSSWILTECH1\1\1\11WALLMP1"; main() {inti,c; for(i=2;(c=input[i])! ='\0';i++) { switch(c) {case'1': break; case1: {while((c=input[++i])=='\1'&&c! ='\0'); putchar('S'); } case'E': case'L': continue; default: putchar(c);continue; } putchar(''); } putchar('\n'); } 结果: SWITCHSWAMP 例3、递归 voidprt(intx); main() {prt(5);} voidprt(intx) {inti; if(x>0) {for(i=0;i printf("\n");for(i=0;i prt(x-1);printf("\n"); }} } ****** ****** ****** ****** ******
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二级 培训 讲义 wang9 程序