C语言程序设计_吉林大学_ch10
吉大2020-2022学期《C语言程序设计》在线作业二(3)答案
吉大2020-2022学期《C语言程序设计》在线作业二提醒:本科目含有多少随机试卷,请核实本套试卷是否是您需要的材料!!!一、单选题(共10题,40分)1、一个C语言程序是由A一个主程序和若干子程序组成B函数组成C若干过程组成D若干子程序组成提示:复习课程相关知识802,并完成上述题目[正确参考选择]:B2、C语言中,能识别处理的文件为A文本文件和数据块文件B文本文件和二进制文件C流文件和文本文件D数据文件和二进制文件提示:复习课程相关知识802,并完成上述题目[正确参考选择]:B3、下列程序的输出结果是int b=2; int func(int *a){ b += *a; return (b);} main(){ int a=2, res=2; res += func(&a); printf("%d \n",res); }A4B6C8D10提示:复习课程相关知识802,并完成上述题目[正确参考选择]:B4、函数 rewind 的作用是A使文件位置指针重新返回文件的开始位置B将文件位置指针指向文件中所要求的特定位置C使文件位置指针指向文件的末尾D使文件位置指针自动移至下一个字符位置提示:复习课程相关知识802,并完成上述题目[正确参考选择]:A5、若x,i,j和k都是int型变量,则计算表达式x=(i=4,j=16,k=32)后,x的值为A4B16C32D52提示:复习课程相关知识802,并完成上述题目[正确参考选择]:C——————————6、以下叙述中不正确的是A在不同的函数中可以使用相同的名字的变量B函数中的形式参数是局部变量C在一个函数内定义的变量只在本函数范围内有效D在一个函数内的复合语句中定义的变量在本函数范围内有效提示:复习课程相关知识802,并完成上述题目[正确参考选择]:D7、下面程序的输出结果是main(){ int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a; printf("%d\n",*(p+2));}A3B4C1D2提示:复习课程相关知识802,并完成上述题目[正确参考选择]:A8、下面程序的运行结果是#include main(){ int y=10; do{y;}while (y); printf("%d\n",y); }A1B1C8D0提示:复习课程相关知识802,并完成上述题目[正确参考选择]:D9、在16位IBMPC机上使用C语言,若有如下定义struct data { int i; char ch; double f; } b; 则结构变量b占用内存的字节数是A1B2C7D11提示:复习课程相关知识802,并完成上述题目[正确参考选择]:D10、阅读以下程序及对程序功能的描述,其中正确的描述是#include main(){ FILE *in,*out; char ch,infile[10],outfile[10]; printf("Enter the infile name:\n"); scanf("%s",infile); printf("Enter the outfile name:\n"); scanf("%s",outfile); if((in=fopen(infile,"r"))==NULA程序完成将磁盘文件的信息在屏幕上显示的功能B程序完成将两个磁盘文件合二为一的功能C程序完成将一个磁盘文件复制到另一个磁盘文件中D程序完成将两个磁盘文件合并并在屏幕上输出提示:复习课程相关知识802,并完成上述题目[正确参考选择]:C二、多选题(共5题,20分)1、在C语言中,正确的int类型的常数是:______。
最新吉大16秋《C语言程序设计》在线作业一 满分标准答案
《C语言程序设计》在线作业一满分标准答案《C语言程序设计》在线作业一1:下列关于指针定义的描述中错误的是()。
A:指针是一种变量,用于存放变量的地址。
B:指针变量的类型与它所指向的变量类型一致。
C:指针变量的命名规则与标识符相同。
D:定义指针时,标识符前的‚*‛号表示指针所指向的内容。
正确答案:D2:合法的字符型常数是()。
A:A'B:"A"C:65D:A正确答案:A3:设x,y,z,k都是int型变量,则执行表达式x=(y=4,z=16,k=32)后,x的值为()。
A:4B:16C:32D:52正确答案:C4:正确的用户标识符是()。
A:voidB:c5_b8C:forD:3a正确答案:B5:c语言中int型数-8在内存中的存储形式为()。
A:1111111111111000B:1000000000001000C:0000000000001000D:1111111111110111正确答案:A6:设int a [9],*p=a;则不能表示a [1]地址的表达式为()。
A:p+1B:a+1C:a++D:++p正确答案:C7:设整型变量n的值为2,执行语句‚n+=n-=n*n;‛后,n的值是()。
A:0B:4C:-4D:2正确答案:C8:对于struct ex{int x;float y;char z;}example;则下面的叙述中不正确的是()。
A:struct是结构体类型的关键字B:example是结构体类型名C:x,y,z都是结构体成员名D:struct ex是结构体类型正确答案:B9:设int x=3,y=4,z=5;则值为0的表达式是()。
A:x>y++B:x<=++yC:x!=y+z>y-zD:y%z>=y-z正确答案:A10:一个C语言程序是由()构成。
A:语句B:行号C:数据D:函数正确答案:D11:定义结构体的关键字是()。
吉林大学《C语言程序设计基础》课程第三章数据类型运算符与表达式(“变量”相关文档)共40张
3.4.3 浮点型常量的类型 任意一个浮点型常量都可以赋给一个float型、double型或long double型变量。
float a;
a=111111.111; 由于float型变量只能接收7位有效数字,因此最后两位小数不起作 用。如果a改为double型,则能全部接收上述9位数字。
3.5 字符型数据
如果a改为double型,则能全部接收上述9位数字。
应写成: int a=3,b=3,c=3; 浮点型数据在内存中的存放形式
一个浮点型数据一般在内存中占4个字节(32位)。
如4整a.型%变ibn量ta和ab,可=以3进;行可求余以运算写: 成两步:
int a; 当a,b都为整型数据时才能正常运行。
-2147483648~2147483647 在将一个整型常量赋值给各种类型的整型变量时如何做到类型匹配?请注意以下几点:
printf(“CHINA”);输出时从字符串首地址开始,到结束符停
止输出。
1 字符常量 C的字符常量是用单引号括起来的一个字符。
3.6 变量赋初值
1. C语言允许在定义变量的同时使变量初始化。 (4)将变量e转换成double型,d/e结果为double型。
复合的赋值运算符
如: int a=3; 在赋值符“=”之前加上其他运算符,可以构成复合的运算符。
a=3; (1)一个整数,如果其值在-32768到+32767范围内,认为它是int型,它可以赋值给int型和long int型变量。
5 转义字符的使用
main()
{print(" ab c\t de\rf\tg\n");
printf("h\ti\b\bj k");
吉林大学C语言试题及答案
吉林大学C语言试题及答案吉林大学农学部2008-2009学年第一学期《C 语言程序设计》考试试卷(A 卷)(考试时间:120分钟,本卷共4页,共印820份一、选择题(本题共有15道小题,每道小题2分,满分30分)1.C 语言中,int 类型数据占2个字节,则long 类型数据占()A 、1个字节B 、2 个字节C 、3个字节D 、4个字节2.以下说法中正确的是()A 、C 语言程序总是从第一个定义的函数开始执行B 、在C 语言程序中,要调用的函数必须在main( )函数中定义 C 、C 语言程序总是从main( )函数开始执行D 、C 语言程序中的main( )函数必须放在程序的开始部分3.下面的程序会()main( ){ int x=3,y=0,z=0;if(x=y+z) printf(“****”); else printf(“####”);}A 、有语法错误不能通过编译 B 、输出****C 、可以通过编译,但不能通过连接,因而不能运行 D 、输出####4.以下程序的输出结果是() void func (int *a,int b []){ b [0]=*a+6; }main (){int a,b [5]; a=0; b [0]=3;func (&a,b ); printf ("%d \n",b [0]); } A )6 B )7 C )8D )95.以下程序的输出结果是()main( ){ int x=10,y=10,i; for(i=0;x>8;y=++i)printf(“%d %d ”,x--,y); }A 、 10 1 9 2B 、 9 8 7 6C 、10 9 9 0D 、10 10 9 16.有如下程序main( ){static int a[3][3]={{1,2},{3,4},{5,6}},i,j,s=0; for(i=1;i<3;i++)for(j=0;j<=i;j++) s+=a[i][j]; printf(“%d”,s); }该程序的输出结果是()A 、18B 、19C 、20D 、217.执行下列程序时输入123<空格>456<空格>789<回车>,输出结果是( )。
吉林大学C语言程序设计试题(含答案)
吉林大学2004C语言程序设计试题(含答案)注意:1.答案一律书写在答题纸上。
2.题签随答题纸交回。
3.对每道题都要写出其中重要变量的功能。
4.书写要保持整齐,否则会影响分数。
***************************************************1.(30分)我们称用1和0组成的串为“零幺串”,称只用1组成的串为“幺串”,称只用0组成的串为“零串”。
试写一个函数(过程),使得它对任给零幺串S,将返回一个值N1和值N0,其中N1表示S中最长幺串的长度,N0表示S中最长零串的长度。
例如,假设S是下面表示的零幺串,则在N1中返回4,在N0中返回3S=00010111001110001111[参考答案]/*===========================================================================*/ /*程序名称:2004_1.c *//*程序目的:计算一个“零幺串”当中最长的零/幺串*//*Writen by Apechn ,Soft Lab of JLU *//*===========================================================================*/ #include#define MAX 100void main(void){char s[MAX]; /* 用来保存用户输入的"零/幺串" */int i = 0; /* 计数器*/int n0 = 0; /* 保存最长"零串"数0的个数*/int n1 = 0; /* 保存最长"幺串"中1的个数*/int temp0 = 0,temp1 = 0;printf("请输入一个仅由0/1组成的字符串:\n");scanf("%s",s); /* 由用户输入"零幺串" */while (s){if (s == '0')temp0++;if (temp0 > n0) /* n0取已经扫描过的"零串"中0个数最多者*/{n0 = temp0;temp1 = 0; /* 处理"零串"时将"幺串"计数的临时变量置零*/}if (s == '1')temp1++;if (temp1 > n1) /* n1取已经扫描过的"零串"中1个数最多者*/{n1 = temp1;temp0 = 0; /* 处理"幺串"时将"零串"计数的临时变量置零*/}i++;}printf("最长的\"零串\"中零的个数即n0 = %d .\n",n0); /* 输出结果*/printf("最长的\"幺串\"中幺的个数即n1 = %d .\n",n1);}2.(30分)多项式用链表示,例如“4X5+2X2+5X+6”被表示成下面形式:试写一个函数,使得它对任给的两个多项式链表,形成多项式相加的链表,并返回指向该链表的指针值。
项目2 C语言程序设计项目教程(吉林大学)-数据描述与基本操作
3E(缺少阶码)
4.e4.1(不是整数阶码)
Page 8
任务二:常量和变量
3.字符常量 字符常量有两种,一种是普通字符常量,一种是转义字符。
(1)普通字符常量 普通字符常量是指用一对单引号(‘’)括起来的一个字符,如‘a’、‘A’、‘I’、
‘y’。普通字符常量中的单引号只起定界作用并不表示字符本身。需要特别注意的是单 引号中的字符不能是单引号()、(“)、和反斜杠(\),因为这些字符已经被赋予特殊的 含义,关于单引号、双引号和反斜杠的特有表示法将在转义字符中介绍。
Page 10
任务二:常量和变量
转义字符 \a \n \t \v \b \r \f \\ \‘ \” \? \0
\ddd
\xhh
表2-1 C语言中常用的转义字符
意义 响铃(BEL,Turbo C 2.0不支持) 换行,将当前光标移到下一行行首 横向跳格,光标跳到下一个制表位
竖向跳格 退格,光标移到前一列 回车,光标移到本行的行首 换页,将光标移到下一页的页首
二、变量 (一)变量的概念
所谓变量,就是在程序执行过程中其值可以改变的量。 语言中的变量在使用之前必须先声明。声明变量时要确定变量的名字和数据类 型。C 语言规定:每个变量都须有对应的数据类型和一个合法的名字(变量名)。一 个变量对应一个存储单元,量名是这个存储单元的符号标识,该单元中存放的值 就是该变量的值,变量的值。在程序运行中可随时被改变,而该存储单元的大小 则由变量的类型决定。 (二)变量的类型 1.整型变量 整型变量是用于存放整数值的变量,例如:人数、编号等,均应声明为整型变量。 整型变量一旦声明,计算机将为其在内存中分配相应大小的存储空间,以便存储 变量的值。
基本数据类型的特点是其值不可以再分解为其他类型。在C语言中,基本 数据类型主要有整型、实型、字符型三种。
C语言程序设计吉林大学
2019/4/26
4
C语言与其他高级语言的对比:
C语言:系统软件和应用软件 BASIC:初学者入门 FORTRAN或PL/I:科学计算 COBOL:商业和管理等数据处理领域 PASCAL:教学,第一个结构化语言
2019/4/26
5
1.1 C语言概述 1.2 C语言的基本符号 1.3 数据的输入和输出
2019/4/26
退出
6
1.1 C语言概述
1.1.1 C语言发展简介 1.1.2 C语言特点 1.1.3 Visual C++基本使用 1.1.4 C语言程序的结构
2019/4/26
返回
7
1.1.1 C语言发展简介
ALGOL语言:1960,面向问题高级语言,不宜写系统程序。
CPL语言:1963,英剑桥,能够作较低层次的操作,但规模较大, 难实现。
退出VC
2019/4/26
返回
10
1.1.4 C语言程序的结构
1[例.函1数.1型]求语言两,个函数数是的C和程。序的基本单位。
2#.i函nc数lu由d说e 明<s部td分io和.h函>数体两部分组成
i{nz函itn=说函数atx明数d+z的d;部 体y组(;分 :in成:{t:变x例函,量i:数n定ti类ny义t型)a;dd函(in数t 名x,i(n参t y数) 或类型int
参数名,……) add(x,y) int
x,y;
return(z);执行语句;
}
}
3v.o主id函m数aminai(n)():程序中有且只有一个main()函数,可在任意位
{ i置nt定a义,b,,s是um程;序运行的开始和结束。
4.a每=个3;语b句=后4;有“;”,函数说明部分除外。
C语言程序设计课后习题答案------吉林大学版--------武爱平
第一章1.选择题(1)B(2)C(3)C(4)D(5)B(6)D(7)D(8)C2.填空题(1)函数一个主函数函数(2)/**/(3)连接3.程序设计题(1)#include<stdio.h>main(){printf(" *\n");printf("* S *\n");printf(" *\n");}(2)#include<stdio.h>main(){printf("******************\n");printf("Your are welcome!\n");printf("------------------\n");}第二章1.选择题(1)D(2)D(3)B(4)C(5)B(6)C(7)C(8)C(9)D(10)C(11)A(12)B(13)A(14)C(15)A(16)B(17)A(18)B(19)C(20)A(21)C(22)C 2.填空题(1)①9②-2③62④44.8(2)①10.5②73.1③7④7.2(3)"%6x""%o""%3c""%10.3f""%8s"(4)int a,b,c;&a,&b,&ctemp=a;c=temp;(5)49613113.程序设计题(1)#include<stdio.h>main(){double a,b,c,d;double aver=0.0;printf("\nPlease input four double number:");scanf("%lf%lf%lf%lf",&a,&b,&c,&d);aver=(a+b+c+d)/4;printf("\nThe average of the four double number is %lf",aver);}(2)#include<stdio.h>#define PI 3.14159main(){double r;double area=0,len=0;printf("\nPlease input r:");scanf("%lf",&r);area=PI*r*r;len=2*PI*r;printf("\n area=%lf,length=%lf",area,len);}(3)#include<stdio.h>main(){float i,s;printf("\nPlease input data:");scanf("%f%f",&i,&s);s=s*(1+i);printf("\nI have %.2f yuan after one year.",s);}第三章1、选择题(1)C(2)C(3)A(4)C(5)D(6)A(7)C(8)A(9)B(10)D 2、填空题(1)&m,&nm=n;n=temp;m,n(2)①5 5 4②5 5 4③3 3 4(3)9i+1"%d",iprintf("\n");(4)73-543932013、程序设计题(1)#include<stdio.h>#include<math.h>main(){double a,b,c,d,det,a_2,real,imag,x1,x2;printf("Please enter a,b,c:");scanf("%lf%lf%lf",&a,&b,&c);if(a==0&&b==0)printf("No root!\n");else if(a==0)printf("Line equation root is %.2lf\n",-c/b);else{d=b*b-4*a*c;det=sqrt(fabs(d));a_2=2*a;if(d<0){real=-b/a_2;imag=det/a_2;printf("The two root are:\n%.2lf+%.2lfi\n",real,imag);printf("and\n%.2lf-%.2lfi\n",real,imag);}else if(d==0)printf("Single real root is %.2lf:\n",-b/a_2);else{x1=-b/(a_2)+det/a_2;x2=-b/(a_2)+det/a_2;printf("The two real roots are :\n%.2lf\nand\n %.2lf\n",x1,x2);}}}(2)#include<stdio.h>main(){int i,j;for(i=1;i<=9;i++){for(j=1;j<=9;j++)printf("%d*%d=%2d ",i,j,i*j);printf("\n");}}(3)#include<stdio.h>main(){float sum,product;int i,n,j;printf("\nEnter n\(4<=n<=20):");scanf("%d",&n);while(n>20||n<4){printf("\nEnter n again:");scanf("%d",&n);}sum=0;product=1;for(i=1;i<=n;i++){product=1;for(j=1;j<=i;j++)product=product*j;sum=sum+product;}printf("1!+2!+...+%d!=%.0f\n",n,sum);}第四章1、选择题(1)C(2)D(3)B(4)D(5)C(6)B(7)B(8)C(9)A(10)C(11)C(12)B2、填空题(1)①int men[10] ;②float step[4]={1.9,-2.33,0,20.6};③_int grid[4][10] ;(2)①int m[10]={9,4,7,49,32,-5};②0 9③scanf("%d",m[1]);④m[0] =39;⑤m[0] =a[3]+a[5];(3)①3 ②5 ③8 ④8 ⑤9 ⑥12 ⑦9(4)①int a[10]={9,4,12,8,2,10,7,5,1,3}; ②0 9 ③8 8 (5)103、程序填空题(1)array[20]20&array[i ]20max=array[i];min=array[i];sum+array[i];sum/20(2)-5.77000021(3)ABCDEFGHIJKLEFGHIJKLABFDEFGHIJKLABFDEFGHI4、程序设计题(1)#define SIZE 100#include<stdio.h>void main(){int a[SIZE+1],i,j;for(i=2;i<=100;i++)a[i]=i;for(i=2;i<=100;i++)for(j=i+1;j<=100;j++)if(a[i]!=0&&a[j]%a[i]==0)a[j]=0;printf("\n");j=0;for(i=2;i<=100;i++){if(a[i]!=0){printf("%-4d",a[i]);j++;}if(j==10){j=0;printf("\n");}}}(2)#define S 14#include"stdio.h"void main(){int a[S][S],i,j,n;printf("please enter n:");scanf("%d",&n);for(i=1;i<=n;i++){a[i][i]=1;a[i][1]=1;}for(i=3;i<=n;i++)for(j=2;j<i;j++)a[i][j]=a[i-1][j-1]+a[i-1][j];for(i=1;i<=n;i++){for(j=1;j<=n-i;j++)printf(" ");for(j=1;j<=i;j++)printf(" %3d",a[i][j]);printf("\n");}}(3)#define SIZE 80#include<stdio.h>void main(){char str1[SIZE+SIZE],str2[SIZE];int i,j;puts("Please enter 2 string:");scanf("%s",str1);scanf("%s",str2);i=0;while(str1[i]!='\0')i++;j=0;while(str2[j]!='\0'){str1[i]=str2[j];i++;j++;}str1[i]='\0';printf("%s\n",str1);}(4)#define SIZE 80#include<stdio.h>#include<string.h>void main(){char string[SIZE];int len,i,j,flag;long number;puts("Please enter a digital string:");scanf("%s",string);len=strlen(string);if(string[0]=='-'){flag=-1;i=1;}else{flag=1;i=0;}number=string[i]-'0';for(i++;i<len;i++)number=number*10+(string[i]-'0');number=flag*number;printf("%d\n",number);}(5)#define SIZE 40#include<stdio.h>void main(){int m,n,i,j;float price[SIZE],sum;printf("\nPlease input M and N:");scanf("%d%d",&m,&n);m=m-n;printf("Please input %d price :",n);for(i=0;i<n;i++){scanf("%f",&price[i]);sum=sum+price[i];}printf("Aver are %10.2f.",sum/n); while(m>0){for(i=0;i<n-1;i++)price[i]=price[i+1];printf("\nPlease input one price:");scanf("%f",&price[n-1]);m--;sum=0;for(i=0;i<n;i++){sum=sum+price[i];printf("Aber are %10.2f",sum/n);}}第五章1.选择题(1)C(2)D(3)C(4)B(5)A(6)A(7)A(8)B(9)A(10)B(11)A(12)A2.填空题(1)整型(2)值传递地址传递(3)全局变量局部变量(4)自动变量静态变量寄存器变量外部变量(5)自动变量(6)15300(7)8121(8)x=3,y=4,n=7(9)5 63.程序设计题(1)#include<stdio.h>int gcd_recursion(int a,int b);void main(){int i,j;puts("\nPlease enter 2 integer");scanf("%d,%d",&i,&j);if(i<0||j<0){puts("\nData Error!Please enter 2 integer");scanf("%d, %d",&i,&j);}elseprintf("gcd(%d,%d)=%d",i,j,gcd_recursion(i,j)); }int gcd_recursion(int a,int b){ int c,d;if(a<b){c=a;a=b;b=c;if(a%b==0)return b;elsed=gcd_recursion(b,a%b);}else if(a%b==0)return b;elsed=gcd_recursion(b,a%b);return d;}(2)#include<stdio.h>int delete_char(char c,char str[]);void main(){char str[10],c,i;puts("\nPlease enter a string:");gets(str);puts("Please enter a char you want to delete:");c=getchar();puts("Before deleted:");puts(str);puts("After deleted:");i=delete_char(c,str);puts(str);printf("There are %d characters deleted.",i); }int delete_char(char c,char str[]){ int i,j,total,k,sum;i=0;total=0;while(str[i]!='\0'){k=i;sum=0;while(str[k]==c){ k++;sum++;}total=total+sum;if(str[i]==c){ for(j=i;str[j+sum]!='\0';j++)str[j]=str[j+sum];str[j]='\0';}i++;}return total;}(3)#include<stdio.h>int max(int a,int b);void main(){int i,j,k;puts("\nPlease enter 3 integer:");scanf("%d,%d,%d",&i,&j,&k);printf("max is %d.",max(max(i,j),k));}int max(int a,int b){ if(a>b)return a;elsereturn b;}(4)#include<stdio.h>void int_string(long a,char str[]);void reverse(char c[],int size);void insert_space(char c[],int size);void main(){long i;char str1[10];puts("\nPlease enter 1 long interger:");scanf("%d",&i);int_string(i,str1);printf("digital string is %s",str1);}void int_string(long a,char str[]){int i=0;while(a!=0)str[i]=a%10+'0';a=a/10;i++;}str[i]='\0';insert_space(str,i);}void insert_space(char c[],int size){int i;c[2*size-1]='\0';for(i=2*(size-1);i>=2;i-=2){c[i]=c[i/2];c[i-1]=' ';}}(5)#include<stdio.h>long facto(long x);main()int a;long factorial;printf("\nPlease enter a integer:");scanf("%d",&a);factorial=facto(a);printf("\nThe %d's jieceng is :%ld\n",a,factorial);}long facto(long x){if(x==1)return 1;elsereturn(x*facto(x-1));}(6)#include<stdio.h>float average(float math,float chinese,float english);main(){float score[3];float aver;printf("Please enter your score:math,chinese,english\n");scanf("%f,%f,%f",&score[0],&score[1],&score[2]);aver=average(score[0],score[1],score[2]);printf("Your average is %.2f\n",aver);}float average(float math,float chinese,float english){return(math+chinese+english)/3;}(7)#include<stdio.h>float max=0,min=0;float average(float arr[],int n){int i;float aver,sum=arr[0];max=min=arr[0];for(i=1;i<n;i++){if(arr[i]>max)max=arr[i];else if (arr[i<min])min=arr[i];sum=sum+arr[i];}aver=sum/n;return(aver);}main(){float score[10], aver;int i;printf("Please enter ten score:");for(i=0;i<10;i++)scanf("%f",&score[i]);aver=average(score,10);printf("max=%.2f\nmin=%.2f\naverage=%.2f\n",max,min,aver);}(8)#include<stdio.h>int fib(int n){if((n==1||n==2))return 1;elsereturn(fib(n-1)+fib(n-2));}void main(){int i;printf("\n");for(i=1;i<20;i++){printf("%-12d",fib(i));if(i%5==0)printf("\n");}}第六章1、选择题(1)A(2)C(3)A(4)B(5)B(6)D(7)D(8)B(9)D(10)B 2、填空题(1)a=10,b=20a=20,b=10(2)**pp=603、程序设计题(1)#include<stdio.h>char *month_name(int n);void main(){int n;printf("\nPlease enter 1 integer:");scanf("%d",&n);printf("%d month :%s\n",n,month_name(n));}char *month_name(int n){static char*name[]={"illegal month","Jan","Feb","Mar","Apr","May","Jun","July","Aug","Sept","Oct","Nov","Dec"};return ((n<1||n>12)?name[0]:name[n]);}(2)#include<stdio.h>#define N 10sort(int data[]){int i,j,min_a,temp;for(i=0;i<N;i++){min_a=i;for(j=i+1;j<N;j++)if(*(data+j)<*(data+min_a))min_a=j;if(min_a!=i){temp=*(data+min_a);*(data+min_a)=*(data+i);*(data+i)=temp;}}}main(){int i,j,data[N],temp;int min_a;printf("\nPlease input %d int:\n",N);for(i=0;i<N;i++)scanf("%d",&data[i]);sort(data);printf("After sorted:\n");for(i=0;i<N;i++)printf(" %d",data[i]);}(3)#include <stdlib.h>void reverse(char *c);void main(){char str[80];puts("Please enter 1 string\n");gets(str);reverse(str) ;puts("After reversed\n");puts(str);}void reverse(char *c){char *p,*q,temp;int size=0;for(p=c;*p!='\0';p++)size++;size=size/2;for(q=c,p--;q<c+size;q++,p--) {temp=*q;*q=*p;*p=temp;}}(4)#include<stdio.h>#include<string.h>void sort(char *keyword[],int size);void print(char *keyword[],int size)void main(){char *keyword[]={"if","else","case","switch","do","whlie","for","break","continue"};sort(keyword,9);print(keyword,9);}void sort(char *keyword[],int size){int i,j,min_location;char *temp;for(i=0;i<size-1;i++){min_location=i;for(j=i+1;j<size;j++)if(strcmp(keyword[min_location],keyword[j])>0)min_location=j;if(min_location!=i){temp=keyword[i];keyword[i]=keyword[min_location];keyword[min_location]=temp;}}}void print(char *keyword[],int size){int i;for(i=0;i<size;i++)printf("\n%s",*(keyword+i));}(5)#include<stdio.h>void fun_char(char str1[],char str2[],char str3[]); void main(){char str1[80],str2[80],str3[80],c,i;printf("\nPlease enter 2 string:");scanf("%s%s",str1,str2);fun_char(str1,str2,str3);printf("Third string is %s.",str3);}void fun_char(char *str1,char *str2,char *str3) {int i,j,k,flag;i=0,k=0;while(*(str1+i)!='\0'){j=0;flag=1;while(*(str2+j)!='\0'&&flag==1){if(*(str2+j)==*(str1+i)) flag=0;j++;}if(flag){*(str3+k)=*(str1+i); k++;}i++;}*(str3+k)='\0';}(6)#include<stdio.h>int count_word(char *str);void main(){char str1[80],c,res;puts("\nPlease enter a string:");gets(str1);printf("There are %d words in this sentence",count_word(str1)); }int count_word(char *str){int count ,flag;char *p;count=0;flag=0;p=str;while(*p!='\0'){if(*p==' ')flag=0;else if(flag==0){flag=1;count++;}p++;}return count;}(7)#include<stdio.h>#include<string.h>char *encrypt(char *string);char *decrypt(char *string);main(){char item[80];char *point;char *pEncrypted;char *pDecrype;printf("Please enter the string need to encrypt:\n");gets(item);point=item;pEncrypted=encrypt(point);printf("\nThe string after encrypted is:\n%s\n",pEncrypted);pDecrype=decrypt(pEncrypted);printf("\nThe string after decrypted is:\n%s\n",pDecrype);free(pEncrypted);free(pDecrype);}char *encrypt(char *string){char *q,*t;q=(char *)malloc(sizeof(char)*80);if(!q){printf("No place to malloc!");return 0;}t=q;while(*string!='\0'){*q=*string-2;string++;q++;}*q='\0';return t;}char *decrypt(char *string){char *q,*t;q=(char *)malloc(sizeof(char)*80);if(!q){printf("No place to malloc!");return 0;}t=q;while(*string!='\0'){*q=*string+2;string++;q++;}*q='\0';return t;}第七章1、选择题(1)D(2)D(3)D(4)C(5)D(6)C(7)C(8)B(9)C(10)C(11)B(12)C(13)B(14)A(15)A(16)C 2、程序分析题(1)Ling ning:19 Langping:21Zhu jian hua:20(2)2,65,A(3)1,2(4)3.11000050(5)audition time is 08:30:00 (6)99Xiaowang90873、程序设计题(1)#include<stdio.h>struct date{int day;int month;int year;}main(){int i,flag,dayth,day71;struct date d1;int month_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31};day71=1;for(i=1;i<7;i++)day71=day71+month_day[i];puts("\nPlease enter year/month/day:");scanf("%d/%d/%d",&d1.year,&d1.month,&d1.day);dayth=d1.day;for(i=1;i<d1.month;i++)dayth=dayth+month_day[i];printf("%d days\n",day71-dayth);}(2)#include<stdio.h>main(){enum color{red,yellow,blue,white,black};enum color i,j,k,pri;int n,loop;n=0;for(i=red;i<=black;i++)for(j=red;j<=black;j++)if(i!=j){for(k=red;k<=black;k++)if((k!=i)&&(k!=j)){n=n+1;printf("%-4d",n);for(loop=1;loop<=3;loop++){switch(loop){case 1:pri=i;break;case 2:pri=j;break;case 3:pri=k;break;default: break;}switch(pri){case red:printf("%-10s","red");break;case yellow:printf("%-10s","yellow");break;case blue:printf("%-10s","blue");break;case white:printf("%-10s","white");break;case black:printf("%-10s","black");break;default: break;}}printf("\n");}}printf("\ntotal:%5d\n",n);}(3)#include<stdio.h>#define SIZE 5main(){struct staff{char name[20];int salary;int age;}attend[SIZE];struct staff *ap;putchar('\n');for(ap=attend;ap<attend+SIZE;ap++){printf("Please enter name salary and age:\n");scanf("%s%d%d",ap->name,&(ap->salary),&(ap->age)); }for(ap=attend;ap<attend+SIZE;ap++){ap->age++;ap->salary*=(1+0.3);}for(ap=attend;ap<attend+SIZE;ap++)printf("\n%-10s %6d %3d",(ap->name),(ap->salary),(ap->age));}第八章1、选择题(1)A(2)D(3)B(4)A(5)D(6)B(7)B(8)C(9)B(10)B(11)C 2、填空题(1)#include(2)#define(3)3 5 5(4)a=4,b=13a=13,b=4(5)10(6)16(7)1000 10(8)10(9)the max value is 2(10)23、程序设计题(1)#define LETTER 1main(){ int i;char c;char str[80];printf("Please enter a string:");scanf("%s",str);i=0;while((c=str[i])!='\0'){i++;#ifdef LETTERif(c>='a'&&c<='z')c=c-32;#elseif(c>='A'&&c<='Z')c=c+32;#endifprintf("%c",c);printf("%d",(int)c);}}(2)#include<stdio.h>#include "d:188011.c"#include "d:188012.c"#include "d:188013.c"int fmax(int x,int y,int z);int fmin(int x,int y,int z);int faver(int x,int y,int z);main(){int a,b,c;int max=0;int min=0;int average=0;printf("Please enter three number:");scanf("%d,%d,%d",&a,&b,&c);max=fmax(a,b,c);min=fmin(a,b,c);average=faver(a,b,c);printf("The max of the three number is: %d.\n",max);printf("The min of the three number is: %d.\n",min);printf("The average of the three number is %d.\n",average);。
吉林大学C语言第一章 C语言程序设计基础
1978,Kernighan和Ritchie,《The C Programming
Language》,标准C语言 1983,美国国家标准化协会(ANSI),ANSI C
1990,国际标准化组织(ISO)通过
非面向对象语言
• Fortran (50年代中期) • Algol (60年代)
面向对象语言
用户根据需要对 C 程序中用到的变量、符号常 量、自己的函数或文件指针进行命名,形成用户标识 符。规则: ①由英文字母、数字、下划线组成,且第一个 字符不能是数字; ②英文字母区别大小写;
③通常识别前8个字符;
④取名遵循“简洁明了”和“见名知意”。
保留字/关键字
编译系统固有的,用做语句名、类型名的标识
14
6. C语言本身没有输入输入语句,输入输出用库函数scanf()、
printf()、getchar()、putchar()实现。
7. 可在任意位置加注释/* …… */,可多行,不可嵌套。 8. 变量名、函数名必须是合法的标识符,标识符就是一个名字,C 语言规定标识符只能由字母、数字和下划线三种字符构成,并且第 一个字符 必须是字母或下划线。C语言不允许同时定义两个完全相 同的标识符。 9. C语言是大小写敏感的。grade和Grade不相同。
格式输入函数scanf()
2016/4/17
21
1.3.1 字符输出函数putchar()
准备:程序开头要预编译命令:
#include<stdio.h>
或 调用形式: #include “stdio.h” putchar(ch); 功能:把一个字符输出到标准输出设备(显示器)上。 ch是一个整型变量、字符型变量、整型常量或字符型常 量。
吉林大学2020年秋季《C语言程序设计》在线作业一附满分答案
吉林大学2020年秋季《C语言程序设计》在线作业一附满分答案试卷总分:100 得分:100一、单选题 (共 10 道试题,共 40 分)1.有如下程序:long fib(int n){ if (n>2)return(fib(n-1)+fib(n-2)); else return(2); } main(){ printf("%d \n",fib(3));} 该程序的输出结果是A.2B.4C.6D.8答案:B2.以下程序有语法错误,有关错误原因的正确说法是main(){ int G=5,k; void prt_char (); ... k=prt_char(G); ... } A.语句 void prt_char();有错,它是函数调用语句,不能用void说明B.变量名不能使用大写字母C.函数说明和函数调用语句之间有矛盾更多加微boge30619,有惊喜!!!D.函数名不能使用下划线答案:C3.下面程序的运行结果是#include main(){ int y=10; do{y--;}while(--y); printf ("%d\n",y--); }A.1B.1C.8D.0答案:D4.下列程序的输出结果是int b=2; int func(int *a){ b += *a; return(b);} main (){ int a=2, res=2; res += func(&a); printf("%d\n",res); }A.4B.6C.8D.10答案:B5.执行以下程序后,a,b的值分别为main(){ int a,b,k=4,m=6,*p1=&k,*p2=&m; a=p1==&m; b=(*p1)/(*p2)+7; printf("a=%d\n",a); printf("b=%d\n",b); }A.-1,5B.1,6C.0,7D.4,10答案:C6.请选出以下语句的输出结果printf("%d\n",strlen("\t\"\065\xff\n"));A.5B.14C.8D.输出项不合法,无正常输出答案:A7.函数 rewind 的作用是A.使文件位置指针重新返回文件的开始位置B.将文件位置指针指向文件中所要求的特定位置C.使文件位置指针指向文件的末尾D.使文件位置指针自动移至下一个字符位置答案:A8.以下程序的输出结果是#include "stdio.h"void reverse(int a[],int n){int i,t;for(i=0;i<n/2;i++){t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;}}main(){int b[10]={1,2,3,4,5,6,7,8,9,10};int i,s=0;reverse(b,8);for(i=6;i<10;i++) s+=b[i];printf("%d\n",s);}A.22B.10C.34D.30答案:A9.若已定义: int a[]={0,1,2,3,4,5,6,7,8,9}, *p=a,i; 其中 0≤i≤9, 则对a数组元素不正确的引用是A.a[p-a]B.*(&a[i])C.p[i]D.a[10]答案:D10.若有以下程序#include int a[]={2,4,6,8}; main(){ int i; int *p=a; for(i=0;i<4;i++)a[i]=*p; printf ("%d\n",a[2]); } 上面程序输出结果是A.6B.8C.4D.2答案:D二、多选题 (共 5 道试题,共 20 分)11.内存中供用户使用的存储空间可分为:______。
C语言实验大纲-吉林大学
《C语言程序设计》实验教学大纲实验中文名称:C语言程序设计实验英文名称: C language programming课程类别:专业基础课课程编号: 041205面向对象:2010级计算机科学与技术、软件工程、网络工程专业开课系(室):计算机科学与技术系总学时:30是否为独立设课:是()否(√)一、课程任务和目的通过C程序设计实验,培养学生对学习程序设计的兴趣,使学生全面了解 C 语言的特点,不仅要熟练掌握C语言的基础知识、基本算法,更重要的是让学生掌握程序设计的思想和方法,培养学生程序开发和设计的能力。
二、与其它课程的联系先修课程:无后续课程:数据结构,C++,JAVA程序设计、C#、编译原理等三、主要实验仪器计算机四、教材及实验指导书《C程序设计(第三版)》主编:谭浩强,出版社:清华大学出版社,出版或修订时间 2005年7月。
五、实验方式与基本要求课前准备与预习:上机实验前,学生必须事先根据题目的内容编好程序。
课内要求:在实验时输入程序、调试程序,直至运行结果正确为止。
在实验中,教师可根据学生编程操作能力、观察和分析及运用知识能力、程序编制正确性以及学生的课堂纪律、实验态度、保持实验室卫生等方面的表现进行综合考核。
课后要求:学生实验后应按时完成实验报告。
实验报告应包括以下内容:实验题目、实验目的、程序清单、运行结果、实验小结。
六、实验成绩评定考查:平时考核加期末机试。
实验成绩占总成绩的10%。
平时考核:占实验成绩的60%,由以下两部分组成。
实验预习和实验结果、实验报告。
期末机试:占实验成绩的40%。
七、实验项目设置与内容大纲制定:陈守孔审核:余江李向华(大纲制定与审核不能为同一人)附录:上机参考题目本大纲共安排30学时(每周2学时)的实验。
安排14次实验和一次上机考试。
在每次实验中都安排了一些上机题,其中带*的题目为选作题目。
在完成这些题目后,可以做课本上的例题验证及习题。
实验一 C程序的运行环境和运行一个C程序的方法一、实验目的1.了解VC++6.0编译系统的基本操作方法,学会独立使用该系统。
吉林大学历年C语言程序设计试题及答案
吉林大学历年C语言程序设计试题及答案(4)98年试题答案(辅导班讲义)二。
(1)解题思想:用p,q,k分别纪录A,B,C,三个数组正在访问的位置。
如果,A[P] <=B[q],那么将A[P]赋给c[k].否则,将B[q]赋给C[k].如果A先访问完,把B的剩余部分复制到C中。
同样,如果B先访问完,把A的剩余部分复制到C中。
设计函数如下:Void fun (int a[],int b[],int c[]){ int i,p=0,q=0,k=0;while((p <=m-1)&&(q <=n-1)){ if(a[p] <=b[q]) {c[k]=a[p]; p++;}else { c[k]=b[q]; q++;}k++; }if(p==m) {for(i=q;i <=n-1;i++) { c[k]=b; k++;}}if(q==n) {for(i=p;i <=n-1;i++) { c[k]=a; k++;}}}(2)解题思想:从数组的第一个元素a[0]开始访问,用一个变量p来纪录当前平台的整数值,用length纪录最长平台的长度,用counter动态纪录每一个平台的长度。
如果某一个平台访问完以后counter >length则修改l ength.设计函数如下:int fun(int a[],int n){ int length=1,counter=1;int p=a[0];for(int k=1;k<n;K++) {if(a[k]==p) counter++;else {p=a[k];if(length <counter) length=counter;counter=1; }}if(length <counter) length=counter;return length;}(3)解题思想:从数组的第一个元素a[0]开始访问,每访问到一个零,则从后面找到一个非零元素与其交换。
吉林大学c语言编程实验:学生成绩管理系统
学生成绩管理系统一. 系统功能结构图二. 数据结构的设计及用法说明数据结构设计:本程序利用c 语言结构体及链表等数据结构完成对学生成绩的动态管理。
将一个学生当作一个结点,这个结点的类型为结构体,结构体中的域表示学生的属性,每个结点除了存放属性外,还存放结点之间的关系,即存放指向后继结点的指针。
所以定义表结点结构如下: #define N 4typedef struct s1{char no[11];char name[15];char sex[7];char age[3];int score[N];float sum;float average;int order;struct s1 *next;}STUDENT;三. 程序流程图 ( 见附录 II )四. 模块功能Main ()主函数主函数是程序的入口,采用模块化设计。
首先声明必要的变量,然后进行链表的初始化,完成程序入口。
init()初始化单链表需要一个头指针指向表的第一个结点,对单链表的访问使从头指针开始的,初始化单链表为空。
空用NULL 表示,该值在头文件stdio.h 中定义为常数0. _menu 主菜单程序引用putch()输出图形符号的ASCII 码值来实现边框。
利用window 函数制作显示窗口,该窗口比边框略小一些,正好包含于边框之中。
通过key()实现对光标键的捕捉,光条的移动通过ups ()和dns ()实现。
同时检测ENTER 键,若捕捉到此键,则执行相应的函数模块。
create ()创建单链表 主程序初始化 菜单界面输入 退出分类 插入 计算 读取 保存 查找 显示 删除进入主菜单中的“Enter list”选项,进入创建链表函数,即输入学生信息,按照提示信息输入学号,姓名,性别,课程成绩,每输入一个数按一下回车,当输入学号字符为@时结束输入,返回主函数,单链表创建完毕,输入界面如图:数据完整性的验证由两个函数create()和inputs()完成。
最新吉大16秋《C语言程序设计》在线作业二满分标准答案
《C语言程序设计》在线作业二满分标准答案《C语言程序设计》在线作业二1:C语言的基本数据类型是_______.A:int float double logicalB:int double float charC:int date float charD:int double float string正确答案:B2:能正确表示a和b同时为负的表达式是_______。
A:a*b>0B:a+b<0C:a<0||b<0D:a<0&&b<0正确答案:D3:设int类型的数据长度为2字节,则该类型数据的取值范围是________。
A:0至65536B:0至65535C:-32767至32768D:-32768至32767正确答案:D4:字符串的结束标志是______.A:n'B:'0'C:'"D:''正确答案:B5:对于C程序的函数,下列叙述中正确的是 ___ 。
A:函数的定义不能嵌套,但函数调用可以嵌套B:函数的定义可以嵌套,但函数调用不能嵌套C:函数的定义和调用均可以嵌套D:函数的定义和调用均不能嵌套正确答案:A6:下列二维数组初始化中,错误的是________.A:int a [ ] [3]={{3,4},{5,6,7}};B:int a [ ] [3]={2,3,4,5,6,7};C:int a [3] [3]={0};D:int a [3] []={{1,2,3},{2,3},{3,4,5}};正确答案:D7:结构化程序的三种基本结构是 _________。
A:顺序结构,分支结构,循环结构B:递归结构,循环结构,转移结构C:嵌套结构,循环结构,顺序结构D:递归结构,分支结构,顺序结构正确答案:A8:对于程序片段rninti,a [5];for(i=0;i<5;i++)scanf(“%d”,&a );rn若要使数组元素的值分别为1,2,3,4,5,正确的输入是 _________。
吉林大学软件学院实验--课程设计--时间--要求--内容
实验、课程设计题目要求:吉林大学课程中心/school/jlu QQ群:2015级吉大程序设计484830961实验题目:1. 练习题目:平时课后、实验课上进行。
2. OJ实验题目:实验课上完成,课后登陆中国大学MOOC平台上的吉林大学课程中心的SPOC课程,网上提交答案。
3. 非OJ实验题目:实验课上完成。
4. 最后一次实验课,提交实验报告。
实验报告模板参见群文件。
5. 作业:SPOC上的单元测验、单元作业及考试,平时成绩(包括实验),以SPOC课程的得分为准。
课程设计:1. 头两次为配合课程进度,需要单独完成具体实验题目,而且还要小组完成课程设计题目;2. 后两次小组完成课程设计题目;最后一次课程设计,提交课程设计报告,检查代码。
课程设计报告参见群文件。
3. 设计题目:编写并调试学生成绩管理程序4. 课程设计成绩:完成V3.0版小组最高是A;完成V2.0版小组最高是B;完成V1.0版小组最高是C。
小组内每人,根据答辩情况,得到相应分数,个人分数不能高于小组分数上限。
5. 设计要求:学生按学号顺序分组,3人一组,每人完成一部分,具体分工组内讨论决定。
6. 成绩评定:优秀约占15%,良好约占40%,中等约占30%,及格约占15%。
没完成设计任务的学生不及格。
7. 考核内容:出勤情况、课程设计报告完成情况、设计方法讲解情况、代码完成情况(质量、工作量、时间)8. 考核方法:最后一周,提交课程设计报告后,方可申请答辩。
答辩过程中,学生演示并讲解自己完成的部分,老师检查程序并向学生提问9. 考察点:功能完成情况、代码规范程度、程序结构、用户界面、分工合作第一次实验题目具体内容• (OJ 实验)Hello World • (OJ 实验)鸡兔同笼1.8 (非OJ 实验)上机运行图1.11的程序。
1.3 (练习)设计算法,当输入数字0、1、… 、9时,显示相应英文数字。
例如当输入1时输出one ,当输入5时输出five ,等等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例10-3 n 次勒让德多项式 101 p n (x ) = x ((2n - 1) xp ( x) − (n − 1) p ( x)) / n n −1 n−2 当 n=0 当 n =1 当 n >1
计算它的递归函数是: 计算它的递归函数是 float p ( int n , float x ) { if ( n==0 ) return 1 ; else if (n==1) return x ; else return ( (2*n-1)*x*p(n-1,x) - (n1)*p(n-2,x) )/n ; }
解:不妨设三根钻石针顺次编号为 a 、b 、c ;开始所有 64 片金 针上; 针上; 片全部在 a 针上;现在要把它们移动到 b 针上;移动过程中 c 针 可以利用。 可以利用。如图所示
64片 片
... ... a
64片 片
... ... b
63片 片
ห้องสมุดไป่ตู้
... ... c
63片 片
1. 试想,若能够把a 针上的64片金片全部移动到 针上,必须能够 试想,若能够把 针上的 片金片全部移动到b针上, 片金片全部移动到 针上 怎样进行移动? 怎样进行移动? 先把a针顶部的 片金片移到c针上 针顶部的63片金片移到 针上。 先把 针顶部的 片金片移到 针上。 开始就遇到把a针最上边的金片先移到 针上,还是先移到c针上 针最上边的金片先移到b针上 开始就遇到把 针最上边的金片先移到 针上,还是先移到 针上? 2. 现在,可以很容易的把 针上的一片金片移到 b 针上。 针上? 现在,可以很容易的把a针上的一片金片移到 针上。 没有任何根据作出决定,按一般方法是不好解决这个问题的。 没有任何根据作出决定,按一般方法是不好解决这个问题的针上的 。 3. 最后,再按照把 针上的 片金片移到 针上的算法,把c针上的 最后,再按照把a针上的 片金片移到c针上的算法 针上的63片金片移到 针上的算法, 下边换一个角度来考虑该问题: 下边换一个角度来考虑该问题从而,完成了题目要求的工作。 63片金片全部移到 针上。从而,完成了题目要求的工作。 片金片全部移到b针上 片金片全部移到 针上。 : 重新观察上述过程: 重新观察上述过程:
64片 片
... ...
64片 片
... ...
63片 片
... ...
63片 片
a b c 按这个想法, 片金片的问题可以被分解成: 按这个想法,移动 64 片金片的问题可以被分解成: 1.把a针上 片金片,从a针移到 针上,移动过程中 针可用; 针上63片金片 针移到c针上 针可用; 把 针上 片金片, 针移到 针上,移动过程中b针可用 2.把a针上一片金片移到 针上; 针上一片金片移到b针上 把 针上一片金片移到 针上; 3.把c针上 片金片,从c针移到 针上,移动过程中 针可用。 针上63片金片 针移到b针上 针可用。 把 针上 片金片, 针移到 针上,移动过程中a针可用 到此,问题虽然没有解决,但是已经向解的方向前进了一步, 到此,问题虽然没有解决,但是已经向解的方向前进了一步,移动 设若有一函数 64 片金片的问题变成移动 63 片金片的问题了。这一步虽然很小 片金片的问题了。这一步虽然很小, move( n , x , y , z ) 能够完成: 片金片, 甚至是微不足道的,但是却是十分重要的。 针上, 能够完成:“把 x 针上的 n 片金片,移动到 甚至是微不足道的,但是却是十分重要的。 y 针上,移动过程中 可以利用 z 针。”, 的调用: 则上述原始问题可以描述成对 move 的调用: move( 64 , a , b , c ) move( 63 , a , c , b ) move( 63 , c , b , a )
int factorial ( int n ) { if ( n==0 ) return 1; else return n*factorial(n-1); } void main(){ printf(“%d\n”,f(5) ); }
f(5) f(4) f(3) f(2) f(1) f(0)
return 5*f(4) return 4*f(3) return 3*f(2) return 2*f(1) return 1*f(0)return 1 f=120 f=24 f=6 f=2 f=1 f=1
这里讲的只是一般规律和程序设计思想。实际使 这里讲的只是一般规律和程序设计思想。 用时,设计递归函数要复杂得多。 用时,设计递归函数要复杂得多。编写递归程序 要注意: 要注意: – 递归程序漂亮、好看、好读、风格优美,但执 递归程序漂亮、好看、好读、风格优美, 行效率低。 行效率低。 – 计算n! 的函数即可以写成循环形式,也可以 计算n 的函数即可以写成循环形式, 写成递归形式。 写成递归形式。但是有些循环程序写成递归很 困难。反之,有些递归程序写成循环也很困难, 困难。反之,有些递归程序写成循环也很困难, 甚至是不可能的。 甚至是不可能的。 – 终结条件。程序一定要能终止,不能无限递归 终结条件。程序一定要能终止, 下去。 下去。 – 使用全局量要特别小心。用不好,单元发生冲 使用全局量要特别小心。用不好, 将导致程序出错。 突,将导致程序出错。
例10-4
汉诺( 汉诺( Hanoi )塔游戏
该问题又称世界末日问题。相传, 该问题又称世界末日问题。相传,古印度布拉玛婆罗门神庙 的憎侣们, 塔的游戏。 的憎侣们,当时作一种被称为 Hanoi塔的游戏。该游戏是: 塔的游戏 该游戏是: 在一个平板上,有三根钻石针; 在一个平板上,有三根钻石针;在其中一根针上有成塔型落 当然这只是传说, 当然这只是传说,按照规则把 64 要求把这 片金片全部移到另一 放的大小不等的64片金片 片金片全部从一根针移到另一根 片金片; 放的大小不等的 片金片;要求把这64片金片全部移到另一 针上, 针上,总的移动次数是 264-1次: 若一秒移动一次,不发生错误, 次 请编程序,打印金片的移动顺序。 请编程序,打印金片的移动顺序。 根钻石针上。移动规则是: 根钻石针上。移动规则是 ,若一秒移动一次,不发生错误, 日夜不停的移动, 亿年。而太阳系的寿命仅有100─150 日夜不停的移动,约需 5849 亿年。而太阳系的寿命仅有 – 每次只允许移动一片金片; 每次只允许移动一片金片; 亿年而已。 亿年而已。 – 移动过程中的任何时刻,都不允许有较大的金片放在较小 移动过程中的任何时刻, 的金片的上面; 的金片的上面; – 移动过程中,三根钻石针都可以利用,但是金片不许放在 移动过程中,三根钻石针都可以利用, 除钻石针以外的任何地方。 除钻石针以外的任何地方。 不论白天黑夜都有一个憎侣在移动。据说当 片金片全部从 不论白天黑夜都有一个憎侣在移动。据说当64片金片全部从 一根钻石针移到另一根钻石针上那天,就是世界的末日。 一根钻石针移到另一根钻石针上那天,就是世界的末日。到 那时他们的虔诚信徒可以升天,而其他人则要下地狱。 那时他们的虔诚信徒可以升天,而其他人则要下地狱。
递归程序设计
次幂, 例10-2 X 的 n 次幂,可以定义为
1 x = n −1 x * x
n
当 n=0 当 n>0
float power ( float x, int n ) { if ( n==0 ) return 1 ; else return x * power(x,n-1) ; }
的例子。该问题是: 再看 n! 的例子。该问题是:当n>0 时,若能计算出 w=(n-1)! r=n!=n*w 则 因此,得如下抽象算法: 因此,得如下抽象算法: void fact ( int n , int *r ) { 1. 计算:w=(n-1)! 计算: int w ; 2. r=n*w if ( n==0 ) 的特征属性与整个算法完全相同,只是参数不同, 由于子算法 1 的特征属性与整个算法完全相同,只是参数不同, *r = 1 ; w 代替了 r ,n-1 代替了 n 。这时若将整个算法表示为 f( n,r ) 则 else { 子算法 1 就是 factorial(n-1,&w); f( n-1,w ) *r = n*w 即是对f的递归调用 的递归调用。 即是对 的递归调用。 } 再考虑n=0时,这时 的函数fact 。 再考虑 时 这时r=0!=1 ,从而得到计算 n! 的函数 } 若把该函数的参数r用函数值表示,就是前边的函数 若把该函数的参数 用函数值表示,就是前边的函数factorial 。 用函数值表示
问题: 本身,行吗? 问题:在函数 factorial 内又调用函数 factorial 本身,行吗? 回答: 回答:行! 1. 首先按作用域规则,在函数 factorial 内又调用函数 factorial 首先按作用域规则, 本身是合法的;其次 C 系统保证上述调用过程执行的正确性, 本身是合法的; 系统保证上述调用过程执行的正确性, 这就是递归。 这就是递归。 2. 从静态行文看,在定义一个函数时,若在定义它的内部,又出 从静态行文看,在定义一个函数时,若在定义它的内部, 现对它本身的调用,则称该函数是递归的,或递归定义的。 现对它本身的调用,则称该函数是递归的,或递归定义的。 3. 从动态执行角度看,当调用一个函数时,在进入相应函数,还 从动态执行角度看,当调用一个函数时,在进入相应函数, 没退出(返回)之前,又再一次的调用它本身, 没退出(返回)之前,又再一次的调用它本身,而再一次进入 相应函数,则称之为递归,或称之为对相应函数的递归调用。 相应函数,则称之为递归,或称之为对相应函数的递归调用。 4. 称递归定义的函数为递归函数。 称递归定义的函数为递归函数。 就是递归函数。 上述函数 factorial 就是递归函数。若计算 5! ,使用函数调用 factorial(5) ,观察其计算过程 观察其计算过程:
}
现在换一个角度考虑问题,n 现在换一个角度考虑问题,n! 不仅是 ,n 1*2*3* ... *n 还可以定义成 1 n! = n*(n-1)! 当 n>0 当 n=0