c/c++零基础坐牢第八天
Posted R-f-12
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c/c++零基础坐牢第八天相关的知识,希望对你有一定的参考价值。
c/c++从入门到入土(8)
开始时间2023-04-24 08:30:32
结束时间2023-04-25 01:35:58
前言:在大型项目中,我们需要将复杂的问题简单化,将简单的问题流程化。那么这时我们就需要运用到一个强大的工具——函数。此函数非彼函数,但有函数相同的模块化思想,就像工厂的机床一样处理零部件以及组装零部件。让我们迈开编程大门的第一步,发车啦!
作业七 函数
【C0182】C语言规定,简单变量做实参时,它和对应形参之间的数据传递方式是_______。
A.由用户指定传递方式
B.由实参传递给形参,再由形参传回给实参
C.地址传递
D.单向值传递
答案:D
体会:函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
【C0185】以下函数原型声明语句正确的是________。 A.void( int x ) ; B.void f( int x ) C.void f( int x ) ; D.void f( x ) ;
答案:B
体会:函数定义的基本格式为返回值类型 函数名(类型 形式参数,类型 形式参数2,...)声明语句序列 可执行语句序列,在Windows风格下,函数名采用动词或动词加名词的动宾词组形式,变量名采用名词或者形容词加名词形式,函数体必须用一对花括号包围,这里的花括号是函数体的界定符。在函数体内部定义的变量只能在函数体内访问,成为内部变量。函数头部参数表里的函数成为形式参数,也是内部变量,即只能在函数体内访问。形参表是函数的入口。如果说函数名相当于说明运算的规则的话,那么形参表里的形参就相当于运算的操作数,而函数的返回值就是运算的结果。若函数没有返回值,则需用void定义返回值的类型。若函数不需要入口参数,则需用void代替形参表中的内容,表示该函数不需要任何外部数据。
【C0183】关于函数调用的形式,以下错误的描述是________。
A.可以出现在一个表达式中
B.可以出现在执行语句中
C.可以作为一个函数的实参
D.可以作为一个函数的形参
答案:D
体会:函数必须被主函数直接或间接调用才能发挥作用,主调函数在调用被调函数时,必须给被调函数传递一个实际参数,简称实参,主调函数把实参的值复制给形参的过程称为参数传递。注意!函数的返回值只能有一个,函数的返回值可以是除函数之外的任何类型,函数中的return语句可以有多个,但不表示函数可以有多个返回值。
【C0186】若用一维数组名作为函数调用的实参,传递给形参的是________。
A.数组第一个元素的值
B.数组元素的个数
C.数组中全部元素的值
D.数组首元素的地址
答案:D
【C0179】以下说法不正确的是_______。
A.形参可以是常量、变量或表达式
B.形参应与其对应的实参类型一致
C.实参可以是常量、变量或表达式
D.形参可以为任意类型
答案:A
【C0178】C语言允许函数值类型缺省定义,此时该函数值隐含的类型是_______。 A.float B.int C.void D.char
答案:B
体会:C语言允许函数值类型缺省定义,此时该函数值隐含的类型是基本整型。
【C0189】凡在函数中未指定存储类型的局部变量,其隐含的存储类型为________。
A.自动( auto )
B.外部( extern )
C.静态( static )
D.寄存器(register)
答案:A
体会:c语言中提供的储存类型有自动变量、静态变量、外部变量、寄存器变量。1)自动变量 标准定义式为auto 类型名 变量名,由于自动变量极其常用,所以c语言把它设计成缺省的存储类型,即auto可以省略不写。反之如果没有指定变量的存储类型,那么变量的存储类型就缺省为auto。自动变量在定义时不会自动初始化,自动变量在退出函数后,其分配的内存立即被释放。
2)静态变量 标准定义式为static 类型名 变量名;一个自动变量在退出定义它的函数后,因系统给他分配的内存已经被释放,下次再进入该函数时,系统会给他重新分配内存,因此它的值是不会被保留的。如果希望系统为其保留这个值,除非系统分配给它的内存在退出函数调用时不释放。这时就要引入静态变量。注意!静态变量是与程序共存亡的,而自动变量是与程序块共存亡的。在函数内定义的静态变量,称为静态局部变量,静态局部变量只能在定义它的函数内部访问,而在所有函数外定义的静态变量,称为静态全局变量,静态全局变量可以在定义它的文件内的任何地方被访问。
3)外部变量 标准定义式为extern 类型名 变量名;如果在所有函数之外定义的变量没有指定其存储类别,那么它就是一个外部变量。外部变量是全局变量,它的作用域是从它的定义点到本文件的末尾。但是如果要在定义点之前或者在其他文件中使用它,那么就要用到外部变量。和静态变量一样,外部变量也是在静态存储区内分配内存的,其生存期是整个程序运行期。没有显式初始化的外部变量由编译程序自动初始化为0.
4)寄存器变量 标准定义式为register 类型名 变量名;寄存器是CPU内部的一种容量有限但速度极快的存储器。由于CPU进行访问内存的操作是很耗时的,使得有时对内存的访问无法与指令的执行保持同步。因此,将需要频繁访问的数据存放在CPU内部的寄存器里,即将使用频率较高的变量声明为register,可以避免CPU对存储器的频繁访问,使程序更小、执行速度更快。
【C0188】以下不正确的说法是________。
A.形式参数是局部变量
B.在函数内的复合语句中定义的变量在本函数范围内有效
C.在不同函数中可以使用相同名字的变量
D.在函数内定义的变量只在本函数范围内有效
答案:B
体会:程序中被花括号括起来的区域。叫做语句块。函数体是语句块,分支语句和循环体也是语句块。变量的作用域规则是:每个变量仅在定义它的语句块(包含下级语句块)内有效,并且拥有自己的存储空间。
【C0181】以下关于形参和实参的说明中,错误的是_______。
A.形参变量只有在被调用时才分配内存单元
B.实参对形参的数据传送是双向的,可以把实参的值传给形参,也可以把形参的值反向传给实参
C.实参在进行函数调用时,它们都必须有确定的值,以便把这些值传给形参
D.实参和形参占用不同的内存单元,即使同名也相互不影响
答案:B
体会:函数体必须用一对花括号包围,这里的花括号是函数体的定界符。在函数体内部定义的变量只能在函数体内访问,称为内部变量。函数头部参数表里的变量,称为形式参数,也是内部变量,即只能在函数体内访问。形参表是函数的入口。如果说函数名相当于说明运算的规则的话,那么形参表里的形参就相当于运算的操作数,而函数的返回值就是运算的结果。
【C0177】如果一个函数没有返回值,那么该函数的类型是_______。 A.char B.float C.int D.void
答案:D
体会:若函数没有返回值,则需用void定义返回值的类型。若函数不需要入口参数,则需用void代替形参表中的内容,表示该函数不需要任何外部数据。
【C0187】以下关于函数的递归调用说法中,错误的是________。
A.在递归调用中每一次调用该函数时,所使用的实参都相同
B.递归调用时,调用函数又是被调用函数,即递归函数将反复地调用其自身
C.递归调用分为直接递归调用和间接调用两种
D.为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段
答案:A
体会:如果一个对象部分地由它自己组成或按它自己定义,则我们称它是递归的。递归是一种可根据其自身来定义或求解问题的编程技术,它是透过将问题逐步分解为与原始问题类似的更小规模的子问题来解决问题的,即将一个复杂问题逐步简化并最终转化为一个最简单的问题,最简单问题的解决,就意味着整个问题的解决。
一个递归函数必须包含以下两个部分1)由其自身定义的与原始问题类似的更小规模的子问题,它使递归过程持续进行,称为一般情况;2)递归调用的最简形式,它是一个能够用来结束递归调用过程的条件,通常称为基线情况。
递归将复杂的情形逐次归结为较简单的情形来计算,一直到归并为最简单的情形为止。从这个意义上来说递归是一种比迭代更强的循环结构,二者一很多相似之处。迭代显式地使用重复结构;而递归使用选择结构,通过重复函数调用实现重复结构。迭代和递归都涉及终止测试,迭代在循环条件为假时终止循环;递归则在遇到基线条件是终止递归。迭代不断修改一循环控制变量,直到循环条件为假时为止;递归则不断产生最初问题的简化副本,直到简化为递归基线情况。如果循环条件测试永远为真,则迭代变成无限循环;如果递归永远无法回推到基线情况,则变成无穷递归。
【C0176】以下正确的函数形式是_______。 A. double fun( int x , int y ) z = x + y ; return z ; B.
fun( x , y ) int x , y ; double z ; z = x + y ; return z ; C. double fun( int x , int y ) double z ; z = x + y ; return z ; D. fun( int x , y ) int z ; return z ;
答案:C
【C0175】以下正确的说法是_______。
A.系统根本不允许用户重新定义标准库函数。
B.用户若需调用标准库函数,调用前不必使用预编译命令将该函数所在文件包括到用户源文件中,由系统自动去调用。
C.用户可以重新定义标准库函数,若如此,该函数将失去原有含义。
D.用户若需调用标准库函数,调用前必须重新定义。
答案:C
体会:如果库函数不能满足程序设计者的编程需要,那么就需要自行编写函数来完成自己所需的功能,这类函数称为自定义函数。开发团队内部可采取“拿来拿去主义”,既可以使用别人编写的函数也可以把自己编写的函数拿来给别人共享。
【C0180】一个函数形参的作用域是_______。
A.整个程序
B.main函数
C.从定义处到文件尾
D.形参所在函数体
答案:D
【C0184】C语言规定,函数返回值的类型是由________。
A.调用该函数时系统临时决定
B.在定义该函数所指定的函数类型所决定
C.return语句中的表达式类型所决定
D.调用该函数时的主调函数类型所决定
答案:B
【C0200】下面程序的功能:有一个一维数组score,内放10个学生成绩,统计不及格的学生人数。请完善程序。 #include <stdio.h> int main( ) int fun( float array[10] ) ; float score[10] ; int i , count = 0 ; printf( "input 10 scores:\\n" ) ; for( i = 0 ; i < 10 ; i++ ) scanf( "%f" , &score[i] ); count=fun(score); printf( "%d\\n" , count ) ; return 0 ; int fun( float array[10] ) int i , count = 0 ; for( i = 0 ; i < 10 ; i++ ) if( array[i] <60 ) count++; return count ;
【C0199】下面程序的功能是:fun函数实现
的计算,main函数中调用fun函数,计算
的值。请完善程序。 #include<stdio.h> int main( ) double fun( double x , int y ) ; int y = 3 ; double x = 4 , z ; z=fun(x,y); printf( "z=%f\\n" , z ) ; return 0 ; double fun( double x , int y ) int i ; double z = 1 ; for( i = 1 ; i <= y ; i++ ) z*=x; return z ;
【C0190】下面程序的运行结果是max is 2。 #include<stdio.h> int main( ) int max( int x , int y ) ; int a = 1 , b = 2 , c ; c = max( a , b ) ; printf( "max is %d\\n" , c ) ; return 0 ; int max( int x , int y ) int z ; z = ( x > y ) ? x : y ; return z ;
【C0197】下面程序的运行结果是 0 1 2 0 1 2。 #include<stdio.h> int a[3] ; int main( ) void f1( ) ; void f2( ) ; void print( ) ; f1( ) ; print( ) ; f2( ) ; print( ) ; return 0 ; void f1( ) int i ; for ( i = 0 ; i < 3 ; i++ ) a[i] = i ; void f2( ) int i ,a[3] ; for ( i = 0 ; i < 3 ; i++ ) a[i] = i ; void print( ) int i ; for ( i = 0 ; i < 3 ; i++ ) printf( "%3d" , a[i] ) ;
【C0198】下面程序的功能是:area函数计算圆的面积,main函数中调用area函数,计算给定半径的圆的面积,输出时显示两位小数。请完善程序。 #include<stdio.h> #define PI 3.14 int main( ) float area(float r); float x = 2.4 , y ; y = area( x ) ; printf( "%6.2f\\n" , y ) ; return 0 ; float area ( float r ) float s ; s= PI * r * r ; return s;
【C0195】下面程序的运行结果是 7 8 9。 #include<stdio.h> int main( ) int f( int a ) ; int a = 2 , i ; for( i = 0 ; i < 3 ; i++ ) printf( "%4d" , f( a ) ) ; return 0 ; int f( int a ) int b = 0 ; static int c = 3 ; b++ ; c++ ; return ( a + b + c ) ;
【C0193】下面程序的运行结果是a=11,b=12,c=2。 #include<stdio.h> int main( ) int f1( int x , int y ) ; int a = 11 , b = 12 ,c ; c = f1( a , b ) ; printf( "a=%d,b=%d,c=%d\\n" , a , b ,c ) ; return 0 ; int f1( int x , int y ) int f2( int , int ) ; int c ; x = x * 2 ; y = y * 2 ; c = f2( x , y ) ; return c*2 ; int f2( int a , int b ) int c ; c = ( a + b ) % 3 ; return c ;
【C0196】下面程序的运行结果是8 17。 #include<stdio.h> int main( ) int func( int a , int b ) ; int k = 4 , m = 1 , p ; p = func( k , m ) ; printf( "%d\\t" , p ); p = func( k , m ) ; printf( "%d\\n" , p ); return 0 ; int func( int a , int b ) static int m = 0 , i = 2 ; i += m + 1 ; m = i + a + b ; return m;
【C0191】下面程序的运行结果是a=1,b=2。 #include<stdio.h> int main( ) void f( int x , int y ) ; int a = 1 , b = 2 ; f( a , b ) ; printf( "a=%d,b=%d\\n" , a , b ) ; return 0 ; void f( int x , int y ) x = 100 ; y = 200 ;
【C0192】下面程序的运行结果是1 1 1 。 #include<stdio.h> int main( ) void increment( ) ; increment( ) ; increment( ) ; increment( ) ; return 0 ; void increment( ) int x = 0 ; x += 1 ; printf( "%d\\t" , x ) ;
【C0194】下面程序的运行结果是6。 #include<stdio.h> int main( ) int fun( int n ) ; printf( "%d\\n" , fun( 3 ) ) ; return 0 ; int fun( int n ) if( n ) return fun( n - 1 ) + n ; else return 0 ;
编程题!!
第一题 奇偶判断函数
编写一个判断奇偶情况的函数void f(int),在main( )中主函数输入1个整数,调用f()输出该整数是奇数还是偶数。 裁判测试程序样例: #include<stdio.h> int main( ) void f(int n) ; int n ; scanf( "%d", &n ) ; if( n <= 0) printf( "Wrong number!\\n" ) ; else f( n ) ; return 0 ; /* 请在这里填写答案 */ 输入样例1: 4 输出样例1: 4 is a even number. 输入样例2: 41 输出样例2: 41 is a odd number. 输入样例3: -4 输出样例3: Wrong number! 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
void f(int n) if(n%2==0) printf("%d is a even number.\\n",n); else printf("%d is a odd number.\\n",n); return;
----------分割线----------
第二题 素数判断函数
编写一个判断素数的函数void f(int),在main( )输入1个整数,调用f()输出该整数是否为素数的信息。 裁判测试程序样例: #include<stdio.h> #include<math.h> int main( ) void f( int m ) ; int m ; scanf( "%d", &m ) ; f( m ) ; return 0 ; /* 请在这里填写答案 */ 输入样例1: 4 输出样例1: 4 is not a Prime Number. 输入样例2: 41 输出样例2: 41 is a Prime Number. 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
void f(int n) if(n%2==0) printf("%d is a even number.\\n",n); else printf("%d is a odd number.\\n",n); return;
----------分割线----------
第三题 最大公约数和最小公倍数
编写两个函数int gys(int , int)和int gbs(int , int),分别计算给定的2个整数的最大公约数和最小公倍数,在main( )中输入2个整数,调用gys()和gbs()计算它们的最大公约数和最小公倍数。 裁判测试程序样例: #include<stdio.h> /* 请在这里填写答案 */ int main( ) int m, n, t ; scanf( "%d%d", &m, &n ) ; if( m < n ) t = m ; m = n ; n = t ; t = gys( m, n ) ; printf( "gys=%d\\n", t ) ; t = gbs( m, n ) ; printf( "gbs=%d\\n", t ) ; return 0 ; 输入样例: 24 36 输出样例: gys=12 gbs=72 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
void f(int m) int i,flag=0; for(i=2;i<m;i++) if(m%i==0) flag=1; if(flag==1) printf("%d is not a Prime Number.\\n",m); else if(flag==0) printf("%d is a Prime Number.\\n",m); return;
----------分割线----------
第四题 字符串比较
编写函数int strcom(char str1[],char str2[]),用于比较给定的2个字符串str1和str2的大小,比较的规则按照对应位置上的字符的ASCII的大小进行比较。如果两个字符串相等则返回0,若str1<str2则返回-1,若str1>str2则返回1。在main( )中输入2个字符串,调用strcom()比较它们的大小并输出相应信息。 裁判测试程序样例: #include<stdio.h> /* 请在这里填写答案 */ int main( ) char str1[80],str2[80]; int result; gets(str1); gets(str2); result=strcom(str1,str2); if(result==1) printf( "\\"%s\\" > \\"%s\\"\\n", str1,str2) ; else if(result==-1) printf( "\\"%s\\" < \\"%s\\"\\n", str1,str2) ; else printf( "\\"%s\\" = \\"%s\\"\\n", str1,str2) ; return 0 ; 输入样例1: 13579 13579 输出样例1: "13579" = "13579" 输入样例2: 12345789 12346789 输出样例2: "12345789" < "12346789" 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
int gys(int m,int n) int r,t; while(r=m%n) m=n; n=r; t=n; return t; int gbs(int m,int n) int a,r,b,t; a=m*n; while(r=m%n) m=n; n=r; b=n; t=a/b; return t;
总结:复杂问题简单化,简单问题流程化。模块分解基本原则:高聚合、低耦合,保证每一个模块的相对独立性。学到函数这一板块更需勤加练习熟能生巧,一个大型项目一定是由无数个小函数组成的,而每一个函数则对应一种功能。若说人的神经系统是一个大型函数群的集合体也不为过。随着代码量的增加,你也会有自己编码的习惯,这种风格会成为你迈向大师的第一步!
每日一mo:不要惹一个脾气好的男孩,你也不知道他是否在情绪临界点上......(今天为了验证一些猜想右手被树枝划伤了,幸好我猜错了)
java基础第八天
/*
1. 5辆汽车过山洞,依次经过山洞。每辆车通过山洞花费10秒,使用多线程实现。
class Shan {
}
class Car extends Thread {
Shan shan;
String name;
public Car(String name, Shan shan) {
this.name = name;
this.shan = shan;
}
public void run() {
synchronized (shan) {
System.out.println("wo is " + name);
try {
Thread.sleep(2000);
}catch (Exception e){
}
}
}
}
class Demo {
public static void main(String[] arg) {
Shan shan = new Shan();
Car c1 = new Car("1",shan);
Car c2 = new Car("2",shan);
Car c3 = new Car("3",shan);
Car c4 = new Car("4",shan);
Car c5 = new Car("5",shan);
Car c11 = new Car("11",shan);
Car c12 = new Car("12",shan);
Car c13 = new Car("13",shan);
Car c14 = new Car("14",shan);
Car c15 = new Car("15",shan);
c1.start();
c2.start();
c3.start();
c4.start();
c5.start();
c11.start();
c12.start();
c13.start();
c14.start();
c15.start();
}
}
*/
/*
2. 用多线程模拟蜜蜂和熊的关系。
蜜蜂是生产者,熊是消费者。蜜蜂生产蜂蜜是累加的过程,熊吃蜂蜜是批量(满100吃掉)的过程。
生产者和消费者之间使用通知方式告知对方。注意不能出现死锁的现象。
class Fengmi {
int nu;
}
class Beam extends Thread{
Fengmi fm;
public Beam (Fengmi fm) {
this.fm = fm;
}
public void run() {
synchronized(fm) {
while(true) {
System.out.println(++fm.nu);
if (fm.nu == 100) {
fm.nu=100;
try {
fm.notify();
fm.wait();
} catch (Exception e) {
}
}
}
}
}
}
class Bear extends Thread{
Fengmi fm;
public Bear (Fengmi fm){
this.fm = fm;
}
public void run() {
while(true) {
synchronized(fm) {
if (fm.nu == 100) {
fm.nu = 0;
System.out.println("bear 都吃了");
try {
fm.notify();
System.out.println("等待中");
fm.wait();
} catch (Exception e) {
}
}
}
}
}
}
class Demo {
public static void main(String[] arg) {
Fengmi fm = new Fengmi();
Beam beam = new Beam(fm);
Bear bear = new Bear(fm);
beam.start();
bear.start();
}
}
*/
以上是关于c/c++零基础坐牢第八天的主要内容,如果未能解决你的问题,请参考以下文章