归,后者称为间接递归,本节讨论简单递归。 2.一个问题要采用递归方法来解决时,必须符合以下三个条件:
1)可以把要解决的问题转化为一个新的问题,而这个新问题的解法仍与原来的解法相同。 2)可以应用这个转化过程使问题得到解决 3)必定要用一个明确的结束递归的条件。 一习题: 有以下程序
main(int argc,char *argv[])
{int n=0,i;
for(i=1;i }编译连接后生成可执行文件tt.exe,若运行时输入以下命令行 tt 12 345 678 程序运行后的输出结果是 A) 12 B) 12345 C)12345678 D) 136 二:上机部分 1.求n! 2.用递归算法根据以下求平方根的迭代公式,求某数a的平方根。x1=1/2(x0+a/x0) 3.请写递归函数,把输入的一个整数转化成二进制数输出。 4.用递归算法,求1+2+3+4+....+n; 5.用递归算法,求下面公式: 1 当n=0时 f(n) 1 当n=1时 f(n-1)+f(n-2) 当n>1时 struct link {char ch; struct link *p; }a; p是一个可以指向struct link类型变量的指针;因此,a.p=&a是合法的表达式 2.建立静态链表 struct node {int data; struct node *next; }; typedef struct node NODETYPE; main() {NODETYPE a,b,c,*h,*p; a.data=10; b.data=20;c.data=30; h=&a; a.next=&b; b.next=&c; c.next='\\0'; p=h; while(p) {printf(\ p=p->next; } printf(\} 二:动态链表: 1.创建 2.查找 3.插入 4.删除 分析: 结构体: struct node {int data; struct node *next; }; typedef struct node SLIST; A)建立带有头结点的单向链表 第十四章结构体 知识体系: 一:静态链表: 1.结构体中含有可以指向本结构体的指针成员。 当一个结构体中有一个或多个成员是指针,他们的基类型就是本结构体类型时,通常把这种结构体称为可以“引用自身的结构体” 例如: 第 33 页 共 38 页 编写函数creat_slist1,建立如图所示的带有头结点的单向链表。结点数据域中数值从键盘输入,以-1作为结束标志,链表的头结点的地址由函数值返回。 SLIST *creat_slist1(); { int c; SLIST *h,*s,*r; h=(SLIST *)malloc(sizeof(SLIST )); r=h; scanf(\ while(c!=-1) {s=(SLIST *)malloc(sizeof(SLIST)); s->data=c; r->next=s; r=s; scanf(\ } r->next='0'; } main() { SLIST *h; ...... h=creat_slist1(); ....} B)顺序访问链表中各个结点的数据域 编写函数printf_slist,顺序输出单向链表各项结点数据中的内容。 SLIST printf_slist(SLIST *head) {SLIST *p; p=head->next; if(p=='\\0') printf(\else { printf(\ do {printf(\ p=p->next; }while(p!='\\0'); printf(\ } } main() { SLIST *h; ...... h=creat_slist1(); printf_slist(h); ....} C)在单向链表中插入结点 编写函数insert_snode,它的功能是:在值为x的结点前,插入值为y的结点,若值为x的结点不存在,则插在表尾。 void inser_slist(SLIST *head ,int x,int y) {SLIST *s,*p,*q; s=(SLIST *)malloc(sizeof()); s->data=y; q=head; p=head->next; while(p!='\\0'&&p->data!=x) {q=p; p=p->next; } s->next=p; q->next=s; } main() { SLIST *h; int x,y; scanf(\ h=creat_slist1(); printf_slist(h); insert_slist(h,x,y); printf_slist(h); } D)删除单向链表中的结点。 编写函数delete_snode,删除值为x的结点。 void delete_snode(SLIST *head ,int x) { SLIST *p,*q; q=head; p=head->next; while(p!='\\0'&&p->data!=x) 第 34 页 共 38 页 {q=p;p=p->next;} if(p->data==x) q->next=p->next; } main() { SLIST *h; int x,y; int m; scanf(\ scanf(\ h=creat_slist1(); printf_slist(h); insert_slist(h,x,y); printf_slist(h); delete_snode( *h ,m); printf_slist(h); } 习题部分: 有以下程序段 typedef struct node { int data; struct node *next; } *NODE; NODE p; 以下叙述正确的是 A)p是指向struct node结构变量的指针的指针 B)NODE p;语句出错 C)p是指向struct node结构变量的指针 运算符 ~ << >> & ^ | 含义 按位求反 左移 右移 按位与 按位异或 按位或 优先级 1 2 2 3 4 5 功能 各位上数字取反 向左移动,右边补0(相当于*2) 向右移动,(相当于/2) 和0被屏蔽,和1保持不变 相同为0不同为1 有1出1,全0才出0 有以下程序 #include typedef struct{ char name[9];char sex; float score[2]; } STU; STU f(STU a) { STU b={\ int i; strcpy(a.name,b.name); a. sex=b.sex; for(i=0;i<2;i++) a.score[i]=b.score[i]; return a;} main() {STU c={\d=f(c); printf(\re[1]); }程序的运行结果是 A)Qian,f,95,92 B)Qian,m,85,90 C)Zhao,m,85,90 D)Zhao,f,95,92 第十五章位运算 知识体系: 1.有如下程序段:int a=14,b=15,x; char c=?A?; x=(a&&b)&&(c A ture B false C 0 D 1 2.有以下程序: main() {unsigned char a,b,c; a=0x3; b=a|0x8; c=a<<1; printf(“%d%d\\n”,b,c); }结果是_______ A-11 12 B-6 , -13 C 12 24 D11 22 3.main() {int x=3,y=2,z=1; printf(“%d\\n”,x/y&~z); 第 35 页 共 38 页 D)p是struct node结构变量 }结果是_______ A 3 B 2 C 1 D 0 4. 若有以下语句:则c的二进制数______ char a=3,b=6,c; c=a^b>>2; A00000010 B11111101 C00000011 D11111100 7. 二进制数a是00101101,若想通过异或运算 (a^b)使a的高4位取反,低4位不变,则 二进制数b应是____ A00000010 B11111101 C00000011 D11110000 5. 有以下程序 main() {unsigned char a=2,b=4,c=5,d; d=a|b; d&=c; printf(“%d\\n”,d); } 程序运行后的输出结果是(B) A)3 B)4 C)5 D)6 6. 有以下程序 #include { int a=1,b=2,c=3,x; x=(a^b)&c; printf(\程序的运行结果是 A)0 B)1 C)2 D)3 main( ) {char x=040; Printf(“%d\\n”,x=x<<1); } A 64 B 0 C 63 D32 第十六章文件 知识体系: 一:C 语言文件概念: 1.在程序中,当调用输入函数从外部文件中输入数据赋给程序中的变量时,这种操作称为“输入”或“读”。当调用输出函数把程序中变量的值输出到外部文件时,这种操作称为“输出”或“写” 2.数据的存储形式分为文本文件和二进制文件。 二:文件指针 定义文件指针类型指针变量的一般形式为: FILE *fp1,*fp2; 三:打开文件 1.调用C语言提供的库函数fopen“打开”文件 fopen(文件名,文件使用方式); 函数返回一个指向FILE类型的指针。例如: FILE*fp; fp=fopen(\ 2.fopen函数调用中要求两个字符串作为参数。第一个字符串中包含了进行读、写操作的文件名,用来指定所要打开的文件;第二个字符串中指定了文件的使用方式,用户可以通过这个参数来指定对文件的使用意图。 3.调用之后,指针fp就指向了文件file_a,无论是哪种方式,当打开文件时出现了错误,fopen函数返回NULL. if((fp=fopen(\ {printf(\ exit(0); } 4.最常用的文件使用方式及其含义如下: 1)“r”为读而打开文件,当指定这种方式时,对打开的文件只能进行“读”操作。若指定的文件不存在,则会出错;另外一些情况,如企图去 7. 以下程序的功能是进行位运算 main() { unsigned char a,b; a =7^3;b=~4&3; printf(“%d%d\\n”,a,b); }程序运行后的输出结果是 A 4 3 B 7 3 C 7 0 D 4 0 8. 已知int a=1,b=3则a^b的值为 A 3 B 1 C 2 D 4 9.下面程序结果:________ main( ) {printf(“%d\\n”,12<<2); } A 0 B 47 C 48 D 24 10下面程序结果:________ 第 36 页 共 38 页