C语言总结_函数知识附加了C语言练习题

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

一、函数定义

 //定义一个函数
 int func(int a,int b)
 {
     
 }
 ​
 <函数的返回值类型> <函数名称>(函数的形参列表,....)
 {
     函数代码主体部分;
 }
复制代码

<函数的返回值类型>: 返回值类型可以是C语言支持任何类型。基本数据类型、指针、结构体、枚举… 如果函数执行完毕,不需要返回值,可以将函数返回值类型声明为空类型。Void 函数名称 :不能与库函数名称冲突,命名规则与变量命名规则一样。 函数的形参列表 :函数在执行行传入的参数,类型与返回值类型定义方法一样。 如果有多个形参,可以使用逗号隔开 函数的返回值: 如果函数执行完毕之后需要向调用处返回数据,可以使用return,该语句只能返回一个值。

 #include <stdio.h>
 int func(int,int);  //声明func函数
 //int func(int a,int b);//声明func函数
 ​
 int main(void)
 {
     int a;
     a=func(12.34,56.78); //形参传入之后,会转为整型
     printf("a=%d\n",a);
     return 0;
 }
 ​
 //定义一个函数
 int func(int a,int b)
 {
     int c;
     c=a+b;
     return c; //给调用者返回结果
 }
复制代码

二、函数练习作业

(1)编写一个判断某一年是否是闰年的函数。(条件: 能整除4且不能整除100 或者能整除400 )

 #include <stdio.h>
 int func_year(int year); //声明函数
 int main(void)
 {
     int year; //c89标准
     int err=0;
     printf("输入一个年份:");
     scanf("%d",&year);
     err=func_year(year);//调用函数
     if(err==1) 
     {
         printf("闰年!\n");
     }
     else if(err==0)
     {
         printf("平年!\n");
     }
     else
     {
         printf("输入的年份错误!\n");
     }
     return 0;
 }
复制代码

(2)该函数由主函数调用,判断平年和闰年。

 /*
 函数功能: 判断平年和闰年
 返回值  : 0表示平年,1表示闰年,负数表示错误
 */
 int func_year(int year)
 {
     if(year<1900)return -1; //加一个限制条件
     if((year%4==0&&year%100!=0)||year%400==0)
     {
         return 1;
     }
     return 0;
 }
复制代码

(3)输入一个华氏温度,输出摄氏温度,计算公式为(华氏度-32)×5÷9 要求结果保留两位小数。

 #include <stdio.h>
 float func_temp(float temp); //声明函数
 int main(void)
 {
     float temp;
     printf("输入一个温度值:");
     scanf("%f",&temp);
     printf("temp=%.2f\n",func_temp(temp));
     return 0;
 }
 ​
 /*
 函数功能: 计算温度
 返回值  : 摄氏度
 */
 float func_temp(float temp)
 {
     //(华氏度-32)×5÷9
     return (temp-32)*5/9.0;
 }
复制代码

(4)封装函数,打印以下图案: 回文三角形,形参可以决定行数。

      1
      121
     12321
    1234321
复制代码

(5)计算百分比与数据自动转换

 #include <stdio.h>
 int main(void)
 {
     float data;
     data=(10/60.0)*100;  //运算时,需要一个数据是浮点数,运算中才可以使用浮点方式存储
     printf("data=%.0f%%\n",data);
     return 0;
 }
复制代码

(6)函数返回值例子: 限定范围

 #include <stdio.h>
 int func(int a);
 int main(void)
 {
     printf("%d\n",func(200));
     return 0;
 }
 ​
 int func(int a)
 {
     return (a==100);  //限定范围值为0和1
 }
复制代码

(6)生成随机数密码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

char pwdcont[] = "0123456789";

char* GeneratePassword(int pwd_size)
{
	int i;
	int random;
	char *Password = (char *)malloc(pwd_size + 1);

	//获取时间种子
	srand((unsigned)time(NULL));

	for (i = 0; i < pwd_size; i++)
	{
		random = rand() % (strlen(pwdcont));
		*(Password + i) = pwdcont[random];
	}

	*(Password + i) = '\0';
	return Password;
}

int main()
{
	int random;
	char *Password;
	srand((unsigned)time(NULL));

	for (int i = 0; i < 10; i++)
	{
		Sleep(100);
		random = rand() % 6;//密码的长度范围 (6-63) 
		while (random < 6)random++;
		printf("random = %d\n", random);
		Password = GeneratePassword(random);
		printf("Password = %s\n", Password);
	}
	free(Password);
	return 0;
}
复制代码

三、 变量的作用域

3.1 全局变量和局部变量

     const int c;  //定义只读变量
     static int b; //定义静态变量
复制代码

说明: 变量定义作用域分为全局变量和局部变量。 1.局部变量和全局变量名称可以相同。 2.如果局部变量名称与全局变量名称相同,有限使用局部变量。

 #include <stdio.h>
 void func(int);
 int data=123; //全局变量(公用变量)
 ​
 int main(void)
 {
     int data=456; //局部变量
     printf("data1=%d\n",data);
     func(666);
     return 0;
 }
 ​
 void func(int data)
 {
     printf("data2=%d\n",data);
 }
复制代码

3.2 只读变量

 #include <stdio.h>
 void func(int);
 const int data=888; //只读变量
 int main(void)
 {
     //data=666; 错误的
     printf("%d\n",data);
     return 0;
 }
 ​
 void func(int data)
 {
     printf("data2=%d\n",data);
 }
复制代码

3.3 静态变量

 静态变量测试
 #include <stdio.h>
 int func(void);
 int main(void)
 {
     int i,data;
     for(i=0;i<5;i++)
     {
         data=func();
     }
     printf("data=%d\n",data);
     return 0;
 }
 ​
 int func(void)
 {
     //int data=0; //局部变量,生命周期随着函数调用结束而终止。
     static int data=0; //静态变量,生命周期与main函数一样。 
       //static int data=0 只有第一次执行有效
     data++; //data=data+1  ,1
     return data;
 }
复制代码

3.4 静态全局变量

 #include <stdio.h>
 ​
 //int data;  全局变量,可以在其他.c文件引用
 static int data=0; //静态全局变量-----局部变量
 //静态全局变量: 表示该data变量不能被其他文件所引用。
 //防止全局变量,重命名。
 ​
 int main(void)
 {
     return 0;
 }
复制代码

3.5 静态函数

 #include <stdio.h>
 static int func(void);  
 ​
 int main(void)
 {
     func();
     return 0;
 }
 ​
 //定义静态函数,表示该函数只能在本文件使用。
 static int func(void)
 {
     printf("123\n");
 }
复制代码

3.6 变量的初始化值

 #include <stdio.h>
 static int data1;  
 int data2;
 ​
 int main(void)
 {
     int data3; //局部变量
     static int data4;
     printf("data1=%d\n",data1); //0
     printf("data2=%d\n",data2); //0
     printf("data3=%d\n",data3); //未知值
     printf("data4=%d\n",data4); //0
     
     int cnt;
     //cnt++;
     /*
     for(i=0;i<5;i++)
     {
         if(xxxx)data3|=0x1;
         data3<<=1;
     }*/
     return 0;
 }
复制代码

4. 列出C语言练习题

1.【判断】C 语言程序中,当调用函数时,实参和虚参可以共用存储单元。

对

错

2.【单选】以下关于delete运算符的描述中,错误的是____。

A.对一个指针可以使用多次delete运算符

B.delete必须用于new返回的指针

C.使用delete删除对象时要调用析构函数

D. new和 delete必须匹配使用,否则会出现内存泄露的问题

3.【单选】下列语句能正确表达C为大写字母的表达式是____。

A. c>=’A’ && c<=’Z’

B. c>=’A’ or c<=’Z’

C. c>=’A’ || c<=’Z’

D. c>=’A’ and c<=’Z’

4.【单选】对代码char* p=new char[100],描述正确的是____。

A. p在栈上,new出来的在堆上

B. p在堆上,new出来的在栈上

C. p和new出来的内存都在堆上

D. p和new出来的内存都在栈上

5.【单选】下列不可用作 C 语言标识符的字符序列是____。

A.ab

B.a_1

C.$abc

D.BOOK

6.【单选】下列哪个不是C的关键字____。

A. const

B. continue

C. defaul

D. size

7.【单选】下列选项中,不属于指针常量的是____。

A.函数的名字

B.数组的名字

C.空指针

D.宏函数的名字

8.【单选】下列代码运行结果为____。

int a = 23;

printf("%d\n", a&a);

A. 0

B. 23

C. 46

D.运行错误

9.【判断】一个双目运算符作为类的成员函数重载时,重载函数的参数表中有一个参数。

对

错

10.【判断】函数返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。

对

错

11.【单选】char *a, *b;分别指向两个字符串,以下表达式可判断字符串a、b相等的是____。

A. s1=s2

B. strcmp(s1,s2)==0

C. strcpy(s1,s2)==0

D. strlen(s1,s2)

12.【判断】通过 return 语句,函数可以返回一个或多个的返回值。

对

错

13.【多选】C语言中,以下描述错误的是____。

A.调用函数时,函数名必须与被调用的函数名完全一致

B.函数名允许用数字开头

C.函数调用时,不必区分函数名称的大小写

D.在函数体中只能出现一次return语句

14.【多选】在C语言中,关于break的说法正确的是____。

A.break不可用在while循环中

B.break可以用在for循环中

C.break不可用在do while循环中

D.break可以用在switch语句中

15.【多选】C语言中下列数组定义语句中合法的有____。

A. int a[3] = { 0 };

B. int a[3] = { 0, 1, 2 };

C. int a[3] = { 0, 1, 2, 3 };

D. int a[] = { 0, 1, 2 };

16.【多选】下列关于C语言中for循环的描述错误的是____。

A. for循环只能用于循环次数已经确定的情况

B. for循环的循环体语句中,不可以包含多条语句

C. for循环是先执行循环体语句,后判断表达式

D.在for循环中,不能用break 语句跳出循环体

17.【多选】C语言中,以下关于静态变量的说法不正确的是____。

A.静态全局变量过大,可能会导致堆栈溢出

B.静态全局变量的作用域为一个程序的所有源文件

C.函数中的静态变量,在函数退出后不被释放

D.静态变量只可以赋值一次,赋值后则不能改变

18.【多选】结构化程序设计的基本原则包括____。

A.自顶向下

B.逐步求精

C.模块化

D.限制使用 goto 语句

19.【多选】在C语言中,以下说法错误的是____。

A.自定义的函数只能调用库函数

B.函数的定义和调用都可以嵌套

C.函数的定义和调用都不可以嵌套

D.实用的C语言源程序通常由一个或多个函数组成

20.【多选】在C语言中,以下哪些是错误的字符常量____。

A.a

B.”a”

C.’abc’

D.’\101’

复制代码

猜你喜欢

转载自juejin.im/post/7087381087864750094
今日推荐