谭浩强 c程序设计第六章
c语言程序设计第6章(谭浩强)PPT版本
/*ch5_1.c*/ #include <stdio.h> main() { int i,sum=0; 循环初值 i=1; loop: if(i<=100) { sum+=i; 循环变量增值 i++; goto loop; } printf("%d",sum); }
循环条件 sum=0+1 sum==1+2=3 sum=3+3=6 sum=6+4 …… sum=4950+100=5050 循环终值
例:#include<stdio.h> main( ) { int i=0; for(;i<10;i++) putchar(‘a’+i); }
例:#include<stdio.h> 例:#include<stdio.h> 运行结果:abcdefghij main( main( ) ) { {intint i=0; i=0; for(;i<10;) for(;i<10;putchar(‘a’+i),i++) ; putchar(‘a’+(i++)); } }
while 假(0) expr 真(非0) …… break; …… 真(非0)
do
…… break; …... while expr
假(0)
for expr1 switch 假(0) expr2 真(非0) …… break; …... const 1 语句组1 break; expr case const 2 语句组2 break; …... const n 语句组n break; default 语句组 break;
清华大学谭浩强教授的C++教程第6章
行开头的int是指 第2行开头的 是指: 所定义的指针变量是指向整 行开头的 是指: 型数据的指针变量.也就是说,指针变量pointer_1 型数据的指针变量.也就是说,指针变量 只能用来指向整型数据(例如 和pointer_2只能用来指向整型数据 例如 和j),而 只能用来指向整型数据 例如i和 , 不能指向浮点型变量a和 .这个int就是指针变量 不能指向浮点型变量 和b.这个 就是指针变量 的基类型. 的基类型.指针变量的基类型用来指定该指针变量 可以指向的变量的类型. 可以指向的变量的类型. 定义指针变量的一般形式为
图6.6 (2) *&a的含义是什么?先进行 的运算,得a的 的含义是什么? 的运算, 的含义是什么 先进行&a的运算 的 地址,再进行*运算 运算, 所指向的变量, 地址,再进行 运算,即&a所指向的变量,*&a和 所指向的变量 和 *pointer_1的作用是一样的(假设已执行了 的作用是一样的( 的作用是一样的 ),它们等价于变量 "pointer_1=&a;"),它们等价于变量 .即*&a ),它们等价于变量a. 等价, 与a等价,见图 . 等价 见图6.7.
图6.7 输入a和 两个整数 按先大后小的顺序输出a 两个整数, 例6.2 输入 和b两个整数,按先大后小的顺序输出 和b(用指针变量处理 . 用指针变量处理). 用指针变量处理 解此题的思路是: 设两个指针变量p1和 , 解此题的思路是: 设两个指针变量 和p2,使它 们分别指向a和 . 指向a和 中的大者 中的大者, 指 们分别指向 和b.使p1指向 和b中的大者,p2指 指向 向小者,顺序输出*p1,*p2就实现了按先大后小的 向小者,顺序输出 就实现了按先大后小的 顺序输出a和 .按此思路编写程序如下: 顺序输出 和b.按此思路编写程序如下:
谭浩强C程序设计课件第六章2009
特点:先执行循环体,后判断表达式 说明: 至少执行一次循环体 do~while可转化成while结构
循环体 While循环 假(0) expr 真(非0) 循环体
例 用do~while循环求
#include <stdio.h> main() { int i,sum=0; i=1; do { sum+=i; i++; }while(i<=100); printf("%d",sum); }
6.6循环的嵌套
三种循环和分支语句可互相嵌套,层数不限 外层循环可包含两个以上内循环,但不能相互交叉 嵌套循环的执行流程
(3) for( ; ;) (1) while() (2) do { …… { …… { …… do while() while() { …… { …… { …… }while(); } } …… …... …... while() } }while( ); { …… } 嵌套循环的跳转 …... 禁止: } 外循环 (4) if () (6) for( ; ;) { …… { …… do if 内循环 { () …… while() }while( ); (5) ……. ()~ while else { …… ~ } …... 内循环 swtich () else ~ } ~ ……. }
运行结果: 1*1=1 2*2=4 3*3=9 4*4=16 5*5=25 6*6=36 7*7=49 8*8=64 9*9=81 10*10=100
6.4 do~while语句
一般形式: do 循环体语句; while(表达式); 执行流程:
do
循环体 真(非0) while expr 假(0)
#include<stdio.h> main() { char c; for(;(c=getchar())!='\n';) printf("%c ",c); } #include <stdio.h> main() { int i,c; for(i=0;(c=getchar())!='\n';i+=3) printf("%c ",i+c); }
修——C语言程序设计(第三版)第六章-谭浩强
Computer↙ (输入) 其作用是每读入一个字符后立即输出该字符,直到输入 Computer (输出) 一个“换行”为止。请注意,从终端键盘向计算机输入 时,是在按Enter键以后才将一批数据一起送到内存缓 冲区中去的。不是从终端键盘敲入一个字符马上输出一 个字符,而是按Enter键后数据送入内存缓冲区,然 后每次从缓冲区读一个字符,在输出该字符。
循环的嵌套
(4) while( ) (5) for(;;) {… {… do{…} while( ) while( ) { } {…} … } } (6) do {…
for(;;){ } … } while( )
流程的转移控制
• 转移语句用于改变程序的流向。 • C语言提供了4种转移语句: goto语句,break语句,cotinue语句,return语 句
注意: 当for语句中的各表达式省略时,分号间隔符不能少; 在循环体中应实现循环变量的增减和循环条件的判断, 否则成为死循环。
用for 语句实现循环 说明:
(6) 表达式1和表达式3可以是一个简单的表达式,也可 以是逗号表达式。
在逗号表达式内按自左向右顺序求解,整个逗号表 达式的值为其中最右边的表达式的值。
例1:输入3个整数,从小到大排列输出
(way2) #include<stdio.h> void main() {int a, b, c, max, min; scanf(“%d%d%d”, &a, &b, &c); if (a>b) {max=a; min=b;} else {max=b; min =a;} if (max<c) max=c; else if (min<c) min=c; printf (“%d, %d, %d \n”, min, a+b+c-max-min, max); }
第六章课件 C程序设计(第三版) 谭浩强 著
第六章 循环控制
第6章 循环控制
概述 goto语句以及用goto语句构成循环 while语句 do-while语句 for语句 循环的嵌套 几种循环的比较 break语句和continue语句 程序举例
C语言程序设计
第六章 循环控制
§6.1 概述
程序中凡涉及求阶乘、累加、排序等问题都要 用循环解决,因为程序中的某一程序段要重复执行 若干次。 C语言实现循环的语句: 不提倡 goto 和if组合 while语句 do while语句 for语句 重点
< >
do-while 循环,循环体至少执行一次; while和do-while可以解决同一问题,两者可以互换。 while后的表达式一开始就为假时,两种循环结果不同。
C语言程序设计
第六章 循环控制
§6.5 for语句
for 语句是 C 语言中最为灵活,使用最广泛的 循环语句,可完全替代while,do-while语句。 一般形式
<
>
/*省略表达式1、3*/ /*省略表达式 1*/ 3*/ main( ) main( ) { int i,sum=0; { int i=1i,sum=0; ; for(i=1;i<=100;) i=1; for(;i<=100;) for(;i<=100;i++) {sum=sum+i sum=sum+i i++;} printf("%d",sum); }
循环终值
循环条件 循环体
C语言程序设计
第六章 循环控制
关于while循环语句:
while循环先判断表达式,后执行循环体。循环体有可 能一次也不执行。 循环体若包含一个以上语句,应该用{}括起来。 循环体应包含有使循环趋向结束的语句; 下列情况,退出while循环 条件表达式不成立(为零) 循环体内遇 break , goto 无限循环 while(1) 循环体 ;
C语言程序设计_课件_第六章(适于清华谭浩强版)
int data[5]={1,2,3,4,5};
注意
(1) 允许初始化一部分元素,而不是全部。 int data[5]={1,2}; (2) 初始化数组时,允许省略数组的长度。 int data[]={1,2,3,4,5}; 与int data[5]={1,2,3,4,5};是完全等价的。 (3) 初始化数组时,不能对整个数组初始化。 例如,int data[5]=1;
程序段一: #Байду номын сангаасefine Size 5 main() { int a[Size],b[Size+10]; /*正确 … } 程序段二: main() { int n=5; int data[n]; /*错误 …… }
*/
*/
6.2.2 一维数组的引用 引用数组单元的一般形式为: 数组名[下标] 数组下标可以是整型变量或整型表达式, 但不能是浮点型的变量或浮点型表达式;并且 下标不能大于[数组长度-1],因为超过部分没 有被定义过,是不能正确使用的。 图。 例如:data[4]、data[i+j]、data[i++]都是 合法的引用方式。
地址二维数组在概念上是二维的,可以说 是数组的数组,二维数组的下标在行和列两个方 向变化。但是,计算机的内存是连续编址的,也 就是说存储器单元是按一维线性排列的。那么, 如何按照地址的顺序存放二维数组呢?一般有两 种方式来存储二维数组,第一种称为按行排列, 方法是先存储完第一行中的每个元素,再存放下 一行的每个元素;第二种称为按列排列,方法是 先存储完第一列中的每个元素,再存放下一列的 每个元素。C语言的编译系统采用按行排列。
每个数组在使用之前都需要定义。 定义数组的语法是: 数据类型说明符 数组名[数组长度];
C语言程序设计第四版第六章答案_谭浩强
C语言程序设计第四版第六章答案_谭浩强1、用筛选法求100之内的素数。
解:#include#includeint main(){int i,j,n,a[101];for (i=1;i<=100;i++)a[i]=i;a[1]=0;for (i=2;i<sqrt(100);i++)< bdsfid="73" p=""></sqrt(100);i++)<>for (j=i+1;j<=100;j++){if(a[i]!=0 && a[j]!=0)if (a[j]%a[i]==0)a[j]=0;}printf("\");for (i=2,n=0;i<=100;i++){ if(a[i]!=0){printf("%5d",a[i]);n++;}if(n==10){printf("\");n=0;}}printf("\");return 0;}2、用选择法对10整数排序。
解:#includeint main(){int i,j,min,temp,a[11];printf("enter data:\");for (i=1;i<=10;i++){printf("a[%d]=",i);scanf("%d",&a[i]);}printf("\");printf("The orginal numbers:\");for (i=1;i<=10;i++)printf("%5d",a[i]);printf("\");for (i=1;i<=9;i++){min=i;for (j=i+1;j<=10;j++)if (a[min]>a[j]) min=j;temp=a[i];a[i]=a[min];a[min]=temp;}printf("\The sorted numbers:\");for (i=1;i<=10;i++)printf("%5d",a[i]);printf("\");return 0;}3、求一个3×3的整型矩阵对角线元素之和。
《C语言程序设计》教案(清华谭浩强)
《C语言程序设计》教案(清华谭浩强)第一章:C语言概述1.1 课程介绍介绍C语言的历史和发展解释C语言的特点和应用范围强调学习C语言的重要性和目的1.2 C语言的基本概念解释编程语言和编译器的概念介绍C语言的基本数据类型和变量讲解C语言的语法结构和程序结构1.3 C语言的编译过程解释编译器的角色和功能介绍编译过程中的预处理、编译、汇编和步骤强调编译过程中产生的文件和它们的作用第二章:基本数据类型和运算符2.1 基本数据类型介绍整型、浮点型、字符型和布尔型的概念和用法解释不同数据类型的存储方式和大小强调数据类型的选择和使用场景2.2 变量和常量解释变量的概念和作用介绍变量的声明和初始化方法讲解常量的概念和用法2.3 运算符介绍算术运算符、关系运算符和逻辑运算符的概念和用法解释赋值运算符和条件运算符的作用强调不同运算符的优先级和使用规则第三章:控制语句3.1 条件语句介绍if语句的语法和用法讲解switch语句的概念和用法强调条件语句的选择和嵌套使用3.2 循环语句介绍for循环、while循环和do-while循环的概念和用法解释循环控制语句如break和continue的作用强调循环条件的设置和循环次数的控制3.3 跳转语句介绍goto语句的概念和用法讲解label标签的作用和跳转规则强调跳转语句的使用场景和可能导致的问题第四章:函数和指针4.1 函数的基本概念介绍函数的定义和声明讲解函数的参数传递和返回值强调函数的命名规则和命名规范4.2 指针的概念和用法解释指针的概念和作用介绍指针的声明和初始化方法讲解指针的赋值和指针运算4.3 指针和数组介绍数组的概念和用法解释指针和数组的关系强调指针在数组操作中的应用第五章:结构体和文件操作5.1 结构体的概念和用法介绍结构体的定义和声明讲解结构体的成员访问和内存布局强调结构体在数据组织中的应用5.2 文件操作的基本概念解释文件的概念和文件操作的重要性介绍文件打开、读写、关闭等操作的方法强调文件操作中的错误处理和文件指针的管理第六章:动态内存分配6.1 动态内存分配的概念介绍动态内存分配的原因和必要性解释malloc、calloc和realloc函数的作用和用法强调动态内存分配的注意事项和错误处理6.2 链表的概念和用法介绍链表的定义和结构讲解链表的创建、插入、删除和遍历操作强调链表的优势和应用场景6.3 动态内存分配的应用实例通过实例演示动态内存分配在实际编程中的应用讲解内存泄漏和内存溢出的概念强调编写高效和安全的程序的重要性第七章:字符串处理7.1 字符串的基本概念介绍字符串的定义和表示方法解释字符串的长度和字符串的结束标志强调字符串与数组的区别和联系7.2 字符串的常用函数介绍字符串的输入输出函数如printf和scanf 讲解字符串的拷贝、连接、比较等操作函数强调字符串处理函数的使用和注意事项7.3 字符串处理的应用实例通过实例演示字符串处理在实际编程中的应用讲解字符串排序、查找和替换等操作强调字符串处理在文本分析和数据处理中的应用第八章:标准库函数8.1 标准输入输出库函数介绍标准输入输出库stdio.h中的常用函数讲解文件读写、数据转换等函数的用法和功能强调标准库函数的使用场景和注意事项8.2 字符串处理库函数介绍字符串处理库string.h中的常用函数讲解字符串比较、查找和替换等函数的用法和功能强调字符串处理库函数的使用和与其他库函数的配合8.3 数学计算库函数介绍数学计算库math.h中的常用函数讲解数学运算、三角函数和指数函数等函数的用法和功能强调数学计算库函数在数学计算和科学计算中的应用第九章:并发编程和同步机制9.1 并发编程的基本概念介绍并发编程的定义和目的解释进程和线程的概念和关系强调并发编程的优势和挑战9.2 并发编程的同步机制介绍互斥锁、条件变量和信号量等同步机制的原理和用法讲解同步机制在多线程编程中的应用和注意事项强调同步机制在避免竞态条件和数据一致性中的重要性9.3 并发编程的应用实例通过实例演示并发编程在实际应用中的优势和挑战讲解多线程的创建、同步和通信等操作强调并发编程在多任务处理和性能优化中的应用第十章:C语言编程实践10.1 编程实践的重要性强调编程实践在学习和掌握C语言中的重要性解释编程实践对于提高编程能力和解决问题的作用强调编程实践中的代码质量和编程规范10.2 编程实践的项目和案例介绍常见的编程实践项目和案例讲解实际编程中的问题解决方法和技巧强调编程实践中的调试和测试的重要性10.3 编程实践的资源和工具介绍编程实践中的常用工具和环境讲解集成开发环境(IDE)的使用和代码管理强调编程实践中的团队合作和代码分享的重要性重点和难点解析重点环节1:C语言的基本概念和特点需要重点关注C语言的历史和发展,以及其特点和应用范围。
c程序设计第二版谭浩强课后答案
c程序设计第二版谭浩强课后答案C程序设计第二版是谭浩强教授编写的一本广泛使用的计算机程序设计教材,它以C语言为基础,深入浅出地介绍了程序设计的基本概念、语法规则和编程技巧。
这本书的课后习题对于加深理解C语言的知识点非常有帮助。
以下是部分课后习题的答案,供参考:第一章程序设计和C语言概述1. 问题一:简述程序设计的基本步骤。
- 答案:程序设计的基本步骤包括需求分析、设计、编码、测试和维护。
2. 问题二:C语言的主要特点是什么?- 答案:C语言的主要特点包括简洁高效、结构化、可移植性、丰富的运算符、灵活的数据类型和内存管理能力。
第二章 C语言程序的结构1. 问题一:C语言程序的基本结构是什么?- 答案:C语言程序的基本结构包括预处理指令、函数定义和主函数。
2. 问题二:什么是函数?C语言中函数的定义规则是什么?- 答案:函数是一段具有特定功能的代码块,可以被重复调用。
C 语言中函数的定义规则包括返回类型、函数名和参数列表。
第三章数据类型、运算符和表达式1. 问题一:C语言中的基本数据类型有哪些?- 答案:C语言中的基本数据类型包括整型(int)、字符型(char)、浮点型(float和double)。
2. 问题二:算术运算符有哪些?它们的优先级是怎样的?- 答案:算术运算符包括加(+)、减(-)、乘(*)、除(/)和模(%)。
它们的优先级从高到低依次是乘除、模、加减。
第四章控制语句1. 问题一:C语言中的条件语句有哪些?- 答案:C语言中的条件语句包括if语句、if...else语句和switch语句。
2. 问题二:循环语句有哪些?它们的基本结构是什么?- 答案:C语言中的循环语句包括while循环、do...while循环和for循环。
它们的基本结构是初始化、条件判断和迭代。
第五章数组1. 问题一:什么是数组?数组的声明方式有哪些?- 答案:数组是相同数据类型元素的集合。
数组的声明方式包括在函数内部声明和全局声明。
c程序设计第四版(谭浩强)第六章答案
# include<stdio.h># include<math.h># include<string.h>/*int main() //筛选法求100以内的素数{intp,m=0,i,j;for(i=2;i<100;i++){p=(int)sqrt(i);for(j=2;j<=p;j++)if(i%j==0)break;if(j==p+1){printf("%-3d",i);m+=1;}if(m%10==0)printf("\n");}putchar('\n');}void sort(int a[],int n) //选择法排序{inti,j,k;for(i=1;i<n;i++)for(j=i;j<n;j++)if(a[i-1]>a[j]){k=a[i-1];a[i-1]=a[j];a[j]=k;}}int main(){int a[10],i;printf("10 munber:");for(i=0;i<10;i++)scanf("%d",&a[i]);sort(a,10);printf("sort:");for(i=0;i<10;i++)printf("%-2d",a[i]);putchar('\n');}int main(){int a[3][3],i,j,s=0; //求对角线元素之和printf("输入矩阵:\n");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);for(i=0;i<3;i++)s+=a[i][i];printf("对角线元素之和为:%d\n",s);}int main(){int a[]={1,2,3,4,6,7,8,9}; //向已排好序的数组插入新数ints,b,i,j;s=sizeof(a)/4;printf("enter number:");scanf("%d",&b);for(i=0;i<s;i++)if(b>a[i]&&i!=s-1)continue;else if(i==s-1)a[s]=b;else{for(j=s;j>i;j--)a[j]=a[j-1];a[i]=b;break;}printf("new sort:");for(i=0;i<=s;i++)printf("%-2d",a[i]);printf("\n");}int main(){int a[9]={1,2,3,4,5,6,7,8,9},i,n,t,l; //逆序输出l=sizeof(a)/4;n=l/2;for(i=0;i<=n;i++){t=a[i];a[i]=a[l-i-1];a[l-i-1]=t;}for(i=0;i<l;i++)printf("%d ",a[i]);putchar('\n');}int main(){int a[10][10],i,j; //杨辉三角for(i=0;i<10;i++)for(j=0;j<10;j++)if(j==0||i==j)a[i][j]=1;else if(i>j)a[i][j]=a[i-1][j-1]+a[i-1][j];for(i=0;i<10;i++)for(j=0;j<10;j++){if(i>=j)printf("%-4d",a[i][j]);if(j==9)putchar('\n');}putchar('\n');}int a[25][25]={0}; //魔方阵void array(int n){staticint b[2];inti,j,k;for(k=1;k<=n*n;k++){if(k==1){a[0][n/2]=k;b[0]=0;b[1]=n/2;}else{if(b[0]==0&&b[1]<n-1){a[n-1][(b[1]+1)]=k;b[0]=n-1;b[1]=b[1]+1;}else if(b[0]>0&&b[1]==n-1){a[b[0]-1][0]=k;b[0]=b[0]-1;b[1]=0;}else if(b[0]==0&&b[1]==n-1){a[1][n-1]=k;b[0]=1;b[1]=n-1;}else if(a[b[0]-1][b[1]+1]!=0){a[b[0]+1][b[1]]=k;b[0]=b[0]+1;}else{a[(b[0]-1)][(b[1]+1)]=k;b[0]=b[0]-1;b[1]=b[1]+1;}}}for(i=0;i<n;i++)for(j=0;j<n;j++){printf("%-5d",a[i][j]);if(j==n-1)putchar('\n');}}int main(){int n;printf("输入小于25的奇数:");scanf("%d",&n);array(n);}int main()int a[3][3],i,j,k,l,max; //寻找鞍点printf("输入矩阵:\n");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);for(i=0;i<3;i++){max=a[i][0];l=0;for(j=1;j<3;j++){k=0;if(max<a[i][j]){max=a[i][j];l=j;}if(j==2){for(;k<3;k++)if(max<=a[k][l])continue;elsebreak;}if(k==3)printf("鞍点为:%d\n",max);}}}void star(){printf("* * * * *\n"); //打印图案}int main(){inti,j;for(i=0;i<5;i++){for(j=0;j<2*i;j++)printf(" ");star();}#define N 15voidnum(int a[],int n){int min=0,max=N-1,mid=N/2; //折半查找法while(min<=max){mid=(max+min)/2;if(n>a[mid]){min=mid+1;}else if(n<a[mid]){max=mid-1;}else{printf("第%d个数\n",mid+1);break;} }if(min>max)printf("无此数!\n");}int main(){int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},n,i;for(i=0;i<N;i++)printf("%-3d",a[i]);printf("\nenter number:");scanf("%d",&n);num(a,n);}int main(){char a[3][80],u=0,l=0,n=0,b=0,o=0,i,j;for(i=0;i<3;i++)for(j=0;j<80;j++)scanf("%c",&a[i][j]);for(i=0;i<3;i++)for(j=0;j<80;j++){if(a[i][j]>='A'&&a[i][j]<='Z')u+=1;else if(a[i][j]>='a'&&a[i][j]<='z')l+=1;else if(a[i][j]>='0'&&a[i][j]<='9')n+=1;else if(a[i][j]==' ')b+=1;elseo+=1;}printf("\n大写字母个数:%d\n小写字母个数:%d\n数字个数:%d\n空格个数:%d\n 其他字符个数:%d\n",u,l,n,b,o);}# define N 20int main(){char a[N]="512/R olevblf",b[N];inti=0,j=0;printf("密码:");while(a[i]){printf("%c",a[i]);i++;}printf("\n原文:");while(a[j]){if(a[j]>='a'&&a[j]<='z')b[j]='a'+'z'-a[j];else if(a[j]>='A'&&a[j]<='Z')b[j]='A'+'Z'-a[j];elseb[j]=a[j];j++;}b[j]='\0';printf("%s\n",b);}#define N 20void str_cat(char a[],char b[]) //字符串连接{int s1=strlen(a),i=0;while(b[i]){a[s1+i]=b[i];i++;}a[s1+i]='\0';}int main(){char a[N]="I ",b[N]="love you!";str_cat(a,b);printf("%s\n",a);}#define N 20void str_cpy(char a[],char b[]) //字符串复制{inti=0;while(a[i]=b[i])i++;}int main(){char s1[N],s2[]="I love you!";str_cpy(s1,s2);printf("s2=%s\ns1=%s\n",s2,s1);}*/#define N 20intstr_cmp(char a[],char b[]) //字符串比较{inti=0,n;n=strlen(b);while(a[i]==b[i]){i++;if(i==n)break;}printf("%d",a[i]-b[i]);}int main(){char s1[N],s2[N];gets(s1);gets(s2);str_cmp(s1,s2);putchar('\n');}。
C语言程序设计-第三版-谭浩强主编第6—8章课后习题答案
C语言程序设计-第三版-谭浩强主编第6—8章课后习题答案第六章循环语句6.1输入两个正数,求最大公约数和最小公倍数.#includevoidmain(){inta,b,num1,num2,temp;printf(\请输入两个正整数:\\n\canf(\if(num1temp=num1;num1=num2;num2=temp;}a=num1,b=num2;while(b!=0){temp=a%b;a=b;b=temp;}printf(\它们的最大公约数为:%d\\n\printf(\它们的最小公倍数为:%d\\n\}编译已通过6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数.解:#includevoidmain(){charc;intletter=0,pace=0,degit=0,other=0;printf(\请输入一行字符:\\n\while((c=getchar())!='\\n'){if(c>='a'&&c<='z'||c>'A'&&c<='Z')letter++;eleif(c=='')pace++;eleif(c>='0'&&c<='9')digit++;eleother++;}printf(\其中:字母数=%d空格数=%d数字数=%d其它字符数=%d\\n\digit,other);}6.3求(n)=a+aa+aaa++aaa之值,其中a是一个数字,n表示a的位数。
解:voidmain(){inta,n,count=1,n=0,tn=0;printf(\请输入a和n的值:\\n\canf(\printf(\while(count<=n){tn=tn+a;n=n+tn;a=a某10;++count;}printf(\\\n\}6.4求(即1+2!+3!+4!++20!)voidmain(){floatn,=0,t=1;for(n=1;n<=20;n++){t=t某n;=+t;}printf(\\\n\}阶乘利用递归,再求和:#includeuingnamepacetd;longFunc(intn){ if(1==n)returnn;if(n>1)returnn某Func(n-1);}main(){long=0;inti=1;while(i<=6){=+Func(i);i++;}cout<6.5求voidmain(){intk,N1=100,N2=50,N3=10;float1=0.0,2=0.0,3=0.0;for(k=1;k<=N1;k++)/某计算1到100的和某/{1=1+k;}for(k=1;k<=N2;k++)/某计算1到50各数平方和某/{2=2+k某k;}for(k=1;k<=N3;k++)/某计算1到10各数倒数之和某/{3=3+1.0/k;}printf(\总和=%8.2f\\n\}已通过intmain(){intk=1,i=11,j=51;float=0.0;while(k<=10){=+k+k某k+1.0/k;while(k==10&&i<=50){=+i+i某i;while(i=50&&j<=100){ =+j;j++;}i++;}k++;}}6.6所谓“水仙开数”是指一个3位数,其个位数字立方和等于该数本身。
c程序设计(第2版)谭浩强
c程序设计(第2版)谭浩强C程序设计(第2版)是谭浩强教授编写的一本C语言程序设计教材,它以通俗易懂的语言和丰富的实例,为初学者提供了一个学习C语言的良好平台。
本书适合作为高等院校计算机专业或相关专业的教材,同时也适合自学者使用。
第一章:C语言概述本章主要介绍了C语言的发展历程、特点和应用领域。
C语言以其高效性、灵活性和强大的功能,在操作系统、嵌入式系统、高性能计算等领域有着广泛的应用。
谭浩强教授通过对比C语言与其他编程语言的特点,帮助读者建立对C语言的基本认识。
第二章:C语言程序的构成在本章中,作者详细解释了C语言程序的基本结构,包括预处理指令、函数、变量声明和语句等。
通过实例演示了如何编写一个简单的C程序,并介绍了编译和链接的过程。
第三章:数据类型、运算符和表达式本章深入探讨了C语言中的数据类型,包括整型、浮点型、字符型等,以及它们在内存中的存储方式。
同时,介绍了C语言中的运算符,如算术运算符、关系运算符、逻辑运算符等,以及它们的优先级和结合性。
第四章:控制语句控制语句是程序设计中的重要组成部分,本章讲解了C语言中的三种基本控制结构:顺序结构、选择结构和循环结构。
通过大量的实例代码,帮助读者理解如何使用if、switch、for、while和do-while等语句来控制程序流程。
第五章:数组数组是C语言中一种重要的数据结构,用于存储具有相同类型的多个数据项。
本章详细介绍了一维数组和二维数组的定义、初始化和使用,以及数组在程序设计中的应用。
第六章:指针指针是C语言中的核心概念之一,它允许程序员直接操作内存地址。
本章讲解了指针的基本概念、指针的声明、指针与数组的关系,以及指针在函数中的应用。
第七章:函数函数是C语言中实现模块化编程的基本单位。
本章详细介绍了函数的定义、声明、调用以及参数传递机制。
同时,探讨了递归函数和指针函数等高级主题。
第八章:预处理指令预处理指令是C语言提供的一组特殊指令,用于在编译之前对源代码进行预处理。
c语言程序设计第五版课后答案谭浩强第六章习题答案
c语⾔程序设计第五版课后答案谭浩强第六章习题答案第六章:利⽤数组处理批量数据1. ⽤筛选法求100之内的素数【答案解析】素数:约数为1和该数本⾝的数字称为素数,即质数筛选法:⼜称为筛法。
先把N个⾃然数按次序排列起来。
1不是质数,也不是合数,要划去。
第⼆个数2是质数留下来,⽽把2后⾯所有能被2整除的数都划去。
2后⾯第⼀个没划去的数是3,把3留下,再把3后⾯所有能被3整除的数都划去。
3后⾯第⼀个没划去的数是5,把5留下,再把5后⾯所有能被5整除的数都划去。
这样⼀直做下去,就会把不超过N 的全部合数都筛掉,留下的就是不超过N的全部质数。
因为希腊⼈是把数写在涂腊的板上,每要划去⼀个数,就在上⾯记以⼩点,寻求质数的⼯作完毕后,这许多⼩点就像⼀个筛⼦,所以就把埃拉托斯特尼的⽅法叫做“埃拉托斯特尼筛”,简称“筛法”。
(另⼀种解释是当时的数写在纸草上,每要划去⼀个数,就把这个数挖去,寻求质数的⼯作完毕后,这许多⼩洞就像⼀个筛⼦。
)【代码实现】//⽤筛选法求100以内的素数#include<stdio.h>int main(){int i, j, k = 0;// 将数组汇总每个元素设置为:1~100int a[100];for (i = 0; i < 100; i++)a[i] = i+1;// 因为1不是素数,把a[0]⽤0标记// 最后⼀个位置数字是100,100不是素数,因此循环可以少循环⼀次a[0] = 0;for (i = 0; i < 99; i++){// ⽤a[i]位置的数字去模i位置之后的所有数据// 如果能够整除则⼀定不是素数,该位置数据⽤0填充for (j = i + 1; j < 100; j++){if (a[i] != 0 && a[j] != 0){//把不是素数的都赋值为0if (a[j] % a[i] == 0)a[j] = 0;}}}printf(" 筛选法求出100以内的素数为:\n");for (i = 0; i < 100; i++){//数组中不为0的数即为素数if (a[i] != 0)printf("%3d", a[i]);}printf("\n");return 0;}【运⾏结果】2. ⽤选择法对10个整数排序【答案解析】选择排序原理:总共两个循环,外循环控制选择的趟数,内循环控制具体选择的⽅式。
《C++面向对象程序设计》 谭浩强 第六章
C++
先声明基类point类,并调试之; 再声明派生类circle类,调试之; 最后声明cylinder类,调试之。
6- 5
① 先声明基类point
#include <iostream.h> class point //声明类point {public: point (float x=0, float y=0 ); //有默认值的构造函数 void setPoint (float, float); //设置点坐标 float getX ( ) const { return x; } // 读x 值 float getY ( ) const { return y; } // 读y 值 friend ostream & operator << ( ostream &, const point &); protected: float x,y; }; // 下面定义 point类的成员函数 point :: point (float a, float b) // point的构造函数 { x = a; y = b; } void point :: setPoint (float a, float b) { x =a; y = b; } ostream &operator << (ostream &output, const point &p) { // 重载运算符<< output<<“[x=“<<p.x<<“, y=“<<p.y<<“]”<<endl; return output; }
6Hale Waihona Puke 7③ 最后声明cylinder类
c++程序设计谭浩强第6章
第六章指针6.1 指针的基本概念(P164)一、地址1.内存单元的地址内存单元的基本单位是字节,为了方便对内存的访问,每一个内存单元都有一个编号,这个编号就称为内存单元的地址。
2.内存单元的内容内存单元中存放的数据即是内存单元的内容。
例:int i=9,j=6,k=5;说明:每当在程序中定义了变量,C编译系统就会根据变量的不同类型,在内存中为其分配相应字节数目的存储空间。
把变量在内存中所占存储单元的首地址,称为该变量的地址(Address)。
把变量在内存中所占存储单元中存放的数据,称为该变量的内容。
而在计算机内存中,对变量值的存取实质上是通过地址进行的。
134例6.1观察地址#include <iostream>using namespace std;int main(){ int x=55;cout<<"x="<<x<<endl;cout<<"x addres is :="<<&x<<endl;return 0;}3.“直接访问”与“间接访问”●按变量名存取变量值的方式称为“直接访问”。
●按变量地址的存放单元存取变量值的方式称为“间接访问”。
例如:(1) (直接访问)(2) (间接访问)二、指针与指针变量1.指针一个变量的地址称为该变量的“指针“。
说明:由于通过地址可以找到所需的变量单元,也即是说,地址“指向“该变量单元,因此,在C++中,将地址形象化地称为”指针“。
135136如:2000是变量i 的指针。
2.指针变量一种用来存放另一个变量地址值的特殊变量,....................其值是内存单元的地址。
........... 如:i_pointer所谓变量的指针就是变量的地址,而指针变量是用来存放变量的地址。
i_pointer i2000在指针变量与他所指向的变量之间存在着一种联系。
C++面向对象程序的设计第六章课后习题答案(第2版—谭浩强)
第六章课后习题答案〔第二版谭浩强〕1://xt6-1/cpp#include <iostream> //如用VC++应改为∶#include <iosttram.h>using namespace std; //如用VC++应取消此行#include "cylinder.h"#include "point.cpp"#include "circle.cpp"#include "cylinder.cpp"int main(){Cylinder cy1(3.5,6.4,5.2,10);cout<<"\noriginal cylinder:\nx="<<cy1.getX()<<", y="<<cy1.getY()<<", r=" <<cy1.getRadius()<<", h="<<cy1.getHeight()<<"\narea="<<cy1.area()<<", volume="<<cy1.volume()<<endl;cy1.setHeight(15);cy1.setRadius(7.5);cy1.setPoint(5,5);cout<<"\nnew cylinder:\n"<<cy1;Point &pRef=cy1;cout<<"\npRef as a point:"<<pRef;Circle &cRef=cy1;cout<<"\ncRef as a Circle:"<<cRef;return 0;}3:解法一#include <iostream>using namespace std;class Point{public:Point(float a,float b):x(a),y(b){}~Point(){cout<<"executing Point destructor"<<endl;} private:float x;float y;};class Circle:public Point{public:Circle(float a,float b,float r):Point(a,b),radius(r){} ~Circle(){cout<<"executing Circle destructor"<<endl;} private:float radius;};int main(){Point *p=new Circle(2.5,1.8,4.5);delete p;return 0;}3:解法二#include <iostream>using namespace std;class Point{public:Point(float a,float b):x(a),y(b){}~Point(){cout<<"executing Point destructor"<<endl;} private:float x;float y;};class Circle:public Point{public:Circle(int a,int b,int r):Point(a,b),radius(r){}~Circle(){cout<<"executing Circle destructor"<<endl;} private:float radius;};int main(){Point *p=new Circle(2.5,1.8,4.5);Circle *pt=new Circle(2.5,1.8,4.5);delete pt;return 0;}3:解法三#include <iostream>using namespace std;class Point{public:Point(float a,float b):x(a),y(b){}virtual ~Point(){cout<<"executing Point destructor"<<endl;} private:float x;float y;};class Circle:public Point{public:Circle(float a,float b,float r):Point(a,b),radius(r){}virtual ~Circle(){cout<<"executing Circle destructor"<<endl;} private:float radius;};void main(){Point *p=new Circle(2.5,1.8,4.5);delete p;}4:#include <iostream>using namespace std;//定义抽象基类Shapeclass Shape{public:virtual double area() const =0; //纯虚函数};//定义Circle类class Circle:public Shape{public:Circle(double r):radius(r){} //结构函数 virtual double area() const {return 3.14159*radius*radius;}; //定义虚函数 protected:double radius; //半径};//定义Rectangle类class Rectangle:public Shape{public:Rectangle(double w,double h):width(w),height(h){} //结构函数 virtual double area() const {return width*height;} //定义虚函数protected:double width,height; //宽与高};class Triangle:public Shape{public:Triangle(double w,double h):width(w),height(h){} //结构函数virtual double area() const {return 0.5*width*height;} //定义虚函数 protected:double width,height; //宽与高};//输出面积的函数void printArea(const Shape &s){cout<<s.area()<<endl;} //输出s的面积int main(){Circle circle(12.6); //建立Circle 类对象circlecout<<"area of circle =";printArea(circle); //输出circle 的面积Rectangle rectangle(4.5,8.4); //建立Rectangle类对象rectanglecout<<"area of rectangle =";printArea(rectangle); //输出rectangle的面积Triangle triangle(4.5,8.4); //建立Triangle类对象cout<<"area of triangle =";printArea(triangle); //输出triangle的面积return 0;}5:#include <iostream>using namespace std;//定义抽象基类Shapeclass Shape{public:virtual double area() const =0; //纯虚函数};//定义Circle(圆形)类class Circle:public Shape{public:Circle(double r):radius(r){} //结构函数virtual double area() const {return 3.14159*radius*radius;}; //定义虚函数protected:double radius; //半径};//定义Square(正方形)类class Square:public Shape{public:Square(double s):side(s){} //结构函数virtual double area() const {return side*side;} //定义虚函数 protected:double side;};//定义Rectangle(矩形)类class Rectangle:public Shape{public:Rectangle(double w,double h):width(w),height(h){} //结构函数virtual double area() const {return width*height;} //定义虚函数 protected:double width,height; //宽与高};//定义Trapezoid(梯形)类class Trapezoid:public Shape{public:Trapezoid(double t,double b,double h):top(t),bottom(t),height(h){} //结构函数virtual double area() const {return 0.5*(top+bottom)*height;} //定义虚函数protected:double top,bottom,height; //上底、下底与高//定义Triangle(三角形)类class Triangle:public Shape{public:Triangle(double w,double h):width(w),height(h){} //结构函数virtual double area()const {return 0.5*width*height;} //定义虚函数protected:double width,height; //宽与高};int main(){Circle circle(12.6); //建立Circle 类对象circleSquare square(3.5); //建立Square 类对象squareRectangle rectangle(4.5,8.4); //建立Rectangle类对象rectangleTrapezoid trapezoid(2.0,4.5,3.2); //建立Trapezoid类对象trapezoidTriangle triangle(4.5,8.4); //建立Triangle类对象Shape *pt[5]={&circle,&square,&rectangle,&trapezoid,&triangle};//定义基类指针数组pt,使它每一个元素指向一个派生类对象double areas=0.0; //areas为总面for(int i=0;i<5;i++){areas=areas+pt[i]->area();}cout<<"totol of all areas="<<areas<<endl; //输出总面积 return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言第六章习题答案第一题,筛选法选素数哈哈#include<stdio.h>void main(){int m=100,i,j,flag=1,x=1;int a[100]={0};for(i=0;i<m;i++){a[i]=i+1;}for(i=2;i<=m;i++){flag=1;for(j=i;j<m;j++){if(a[j]==0){continue;}if(a[j]%i==0){a[j]=0;}else if(a[j]%i!=0&&flag==1){flag=0;}}}for (i=1;i<m;i++){if (a[i]!=0){printf("%d ",a[i]);}}}第二题用选择法对10个整数排序#include<stdio.h>void main(){int a[10];int i,j,max,m;for(i=0;i<10;i++){scanf("%d",&a[i]);}for(i=0;i<10;i++){for(j=i+1;j<=10;j++){if(a[j]<a[i]){max=a[i];a[i]=a[j];a[j]=max;}}}for(i=0;i<10;i++){printf("%d ", a[i]);}}第三题求3*3的整型二位数组,很easy,我用的是傻瓜算法。
#include<stdio.h>void main(){int a[3][3]={1,3,44,55,56,77,100,143,789};int m,n;m=a[0][0]+a[1][1]+a[2][2];n=a[0][2]+a[1][1]+a[2][0];printf("左高右低的对角线的和为%d\n",m);printf("左高右低的对角线的和为%d\t",n);}第四题拍好序的数组原以为会很快解决的问题,拖了好长的时间。
数组的组标的问题搞了半天,,不应该,以后尽量少犯。
#include<stdio.h>void main(){int a[10]={1,22,33,44,555,664,666,888,999,10000}; int b[11]={0};int i,x,m;for(i=0;i<=9;i++){b[i]=a[i];}scanf("%d",&x);if(x<=a[0]);{m=0;}if(x>=a[9]){m=10;}for(i=1;i<10;i++){if (x<=a[i]&&x>=a[i-1]){m=i;}}if (m<10){for(i=m;i<=9;i++){b[11+m-i-1]=b[11+m-i-2];}b[m]=x;}else{b[10]=x;}for(i=0;i<11;i++){printf("%d\n",b[i]);}}第五题重新排序#include<stdio.h>void main(){int a[10]={1,22,33,44,555,664,666,888,999,10000};int b[10]={0};int i ;for(i=0;i<10;i++){b[9-i]=a[i];}for(i=0;i<10;i++){printf("%d\n",b[i]);}}相较第四题,第五题简单了很多。
第六题调试程序越来越熟练了。
#include<stdio.h>void main(){int a[10]={1};int b[10]={1};int i,j,m;for(i=0;i<10;i++){for(j=0;j<=i;j++){if (i>=1&&j>=1){a[j]=b[j]+b[j-1];}printf("%d ",a[j]);}printf("\n");for(m=0;m<10;m++){b[m]=a[m];}第七题魔方阵,感觉很好玩的样子。
但是很难的样子感觉要定义,变化的矩阵啊。
肿么办?第八题就容易了不就是两个比较大小吗?怎么从数学上证明,一个矩阵鞍点只有一个呢??#include<stdio.h>void main(){int i,j,min,max,x,y,m,flag=1;int a[3][3]={1,2,3,4,5,1,6,7,8};max=a[0][0];for(i=0;i<=2;i++){for(j=0;j<=2;j++){if (max<=a[i][j]){max=a[i][j];x=i;y=j;}min=a[x][y];for(m=0;m<=2;m++){if (min>=a[m][y]){min=a[m][y];}}if(max==min){flag=0;printf("鞍点是第%d行第%d列,值为:%d\n",x,y,a[x][y]);}}if (flag){printf("该矩阵没有鞍点");}}第九题搞了半天终于搞完了。
#include<stdio.h>void main(){int a[15]={0,2,3,4,56,77,88,99,345,456,567,678,1234,2345,3456};int midlle,max=a[14],min=a[0],n=14,m,x,max_r=14,min_r=0;n=n/2;scanf("%d",&x);while(max!=min){if(a[n]==x){printf("这个数字在第%d位\n",n+1);break;}else if(min==x){printf("这个数字在第%d位\n",min_r+1);break;}else if(x==max){printf("这个数字在第%d位\n",max_r+1);break;}else if(x<a[n]&&x>min){max_r=n-1;max=a[max_r];n=(max_r+min_r)/2;}else if(x>a[n]&&x<max){min_r=n+1;min=a[min_r];n=(max_r+min_r)/2;}else{printf("查无次数!!!\n");break;}}}第十题不按照原题来做了,用一个简单的例子将原题中的。
#include<stdio.h>main(){char text[49]={"I,who can't forget you will leave here in 3 days"};int i,flag,Scharacter=0,Bcharacter=0,number=0,letter=0,space=0,others=0;for(i=0;i<=48;i++){if(text[i]>=48&&text[i]<=57){number+=1;}else if(text[i]>=97&&text[i]<=122){Scharacter+=1;}else if(text[i]>=65&&text[i]<=90){Bcharacter+=1;}else if(text[i]==32){space+=1;}else{others+=1;}}printf("大写字母的个数为:%d\n",Bcharacter); printf("小写字母的个数为:%d\n",Scharacter); printf("数字的个数为:%d\n",number);printf("空格的个数为:%d\n",space);printf("其它字符的个数为:%d\n",others);}第十一题这题真简单。
#include<stdio.h>void main(){char m='*';int i,j,n;for(i=1;i<=5;i++){for(j=2;j<=i;j++){printf(" ");}for(n=1;n<=5;n++){printf("%c ",m);}printf("\n");}}第十二题密码翻译;#include<stdio.h>main(){char c[10]="axcBDCVFM";char b[10]={" "};int i;for(i=0;i<9;i++){if(c[i]>=65&&c[i]<=90){b[i]=155-c[i];}if(c[i]>=97&&c[i]<=122 ){b[i]=219-c[i];}}printf("密码是:");for(i=0;i<9;i++){printf("%c",c[i]);}printf("\n");printf("原码是:");for(i=0;i<9;i++){printf("%c",b[i]);}printf("\n");}第13题看到打出来的字有点心酸啊,希望她能过的很好!!!!#include<stdio.h>main(){char c[10]="I love ";char b[10]="fluency!!";char a[20]=" ";int i;for(i=0;i<=6;i++){a[i]=c[i];}for(i=7;i<=16;i++){a[i]=b[i-7];}for(i=0;i<=19;i++){printf("%c",a[i]);}printf("\n");}第14题是比较简单的。