C语言函数小练习

本文详细解释了C语言中函数的定义、参数传递、返回值、数组操作、条件判断以及基本数学逻辑(如素数和闰年的判断)。通过实例展示了如何打印乘法表、数组初始化和反转。
摘要由CSDN通过智能技术生成

#include <stdio.h>


int main()
{
    int n = 0;
    while(scanf("%d", &n) != EOF)
    {
        int i = 0;
        int j = 0;
        for(i=0; i<n; i++)
        {
            for(j=0; j<n; j++)
            {
                if(i == j)
                    printf("*");
                else if(i+j == n-1)//因为行和列是从0开始的
                    printf("*");
                else
                    printf(" ");
            }
            printf("\n");
        }
    }
    return 0;
}

#include <stdio.h>


int main()
{
    int n = 0;
    int m = 0;
    int arr1[1000] = {0};
    int arr2[1000] = {0};
    //输入
    scanf("%d %d", &n, &m);
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    for(i=0; i<m; i++)
    {
        scanf("%d", &arr2[i]);
    }
    //处理
    int j = 0;
    i = 0;
    while(i<n && j<m)
    {
        if(arr1[i] < arr2[j])
        {
            printf("%d ", arr1[i]);
            i++;
        }
        else
        {
            printf("%d ", arr2[j]);    
            j++;
        }
    }
    if(i == n)
    {
        for(; j<m; j++)
        {
            printf("%d ", arr2[j]);
        }
    }
    else
    {
        for(; i<n; i++)
        {
            printf("%d ", arr1[i]);
        }
    }
    return 0;
}

解析:

A:错误,可以没有参数和返回值类型,根据具体功能实现

B:错误,函数的实参可能是变量,也可能是常量,也可能是宏,也可能是指针等等

C:正确,在使用库函数时,必须要包含该库函数所在的头文件,否则编译器将不能识别

D:错误,库函数是语言设计者为了让用户能够更好的使用,而给出的,但并不能解决用户的所有问题,因此其他问题还需要用户自己写方法解决

解析:

A:正确 不同的函数属于不同的作用域,因此不同的函数中定义相同名字的变量不会冲突

B:正确 在C语言中,函数的形参一般都是通过参数压栈的方式传递的

C:正确 在函数内定义的变量,称为局部变量,局部变量只能在其定义的函数中使用

D:错误 复合语句中定义的变量只能在复合语句中使用

因此:选择D

解析:

A:正确,高内聚低耦合即:函数体内部实现修改了,尽量不要对外部产生影响,否则:代码不方便维护

B:错误,全局变量每个方法都可以访问,很难保证数据的正确性和安全性

C:正确,参数越少越好,否则用户在使用时体验不是很好,还得必须将所有参数完全搞明白才可以使用

D:正确,谁申请的谁维护谁释放,否则如果交给外部使用者释放,外部使用者可能不知道或者忘记,就会造成资源泄漏

因此,选择B

解析:

exec((vl,v2),(v3,v4),v5,v6) 总共有四个参数

 (v1, v2)属于第一个实参,逗号表达式,真实的参数时v2

 (v3,v4)属于第二个实参,逗号表达式,真实的参数是v4

 v5属于第三个实参

 v6属于第四个实参

 因此选择:B

解析:

A:正确,传参时不论是按照值还是指针方式传递,形参拿到的都是实参的一份拷贝

B:正确,函数没有调用时,新参没有空间

C:错误,如果是按照值的方式传递,形参和实参各自有各自的空间,改变形参不能改变外部的实参

D:正确,因为形参和实参是两个不同的变量

解析:

A:错误,函数可以没有返回值,如果没有返回值也就不需要带回任何结果

B:正确,形参和实参在不同的函数中,即不同的作用域,因此形参和实参可以同名

C:错误,可以使用全局变量传参

D:错误,不一定,函数的定义可以放在任意的文件中,使用时只需要包含头文件即可

因此,选择B

解析:

A:错误,函数的定义可以放在任意位置,函数的声明必须放在函数的使用之前

B:正确

C:错误,函数定义在使用之后,使用之前没有声明时,编译器编译时识别不了该函数

D:错误,函数的声明只是告诉编译器函数返回值类型、函数名字以及函数所需要的参数,函数定义才是说明函数是怎么实现的

解析:

A: 函数中可以没return语句,只有需要返回值,或者提前结束函数的是才使用retutrn

B:函数中需要提前结束,但是函数的返回类型是void,不需要返回任何值的时候,就使用return;

C: 正确

D: 函数中创建的数组,只能在函数内部使用,函数中返回数组,其实是将数组的地址返回给主调函数,等函数返回后,数组空间还给操作系统了,主调函数得到的地址就是野指针了。

/*
思路:
 0. 函数原型设计
 返回值:必须要有返回值,0表示不是素数,1表示是素数
 1. 检测该数据是否为素数,方法参考前文。


*/

#include <stdio.h>
#include<math.h>






int is_prime(int n)
{
	int i = 0;
	for (i = 2; i <= sqrt(n); i++)
	{
		if (0 == n % i)
		{
			return 0;
		}
	}
	return 1;
}

/*
思路:
  0. 函数原型设计
    返回值:必须要有返回值,返回结果为0说明不是闰年,为非0说明时闰年
    参数:年份
    
  1. 十年一闰百年不闰:即如果year能够被4整除,但是不能被100整除,则year是闰年
  2. 每四百年再一闰:如果year能够被400整除,则year是闰年


具体实现:请参考以下代码
*/
int is_leap_year(int year)
{
	if(((0 == year%4)&&(0!=year%100))||(0==year%400))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

/*
思路:
1. 设计函数原型,不需要返回值,参数N表示乘法口诀表总共有多少行
2. 设定两个循环,外层循环控制总共有多少行
             内层循环控制每行有多少个表达式以及表达式中的内容
*/
void PrintMulTable(int N)
{
	for (int i = 1; i <= N; ++i)
	{
		for (int j = 1; j <= i; ++j)
		{
			printf("%d*%d=%2d  ", j, i, j*i);
		}
		printf("\n");
	}
}

/*
思路:函数比较简单,请参考实现
*/


void Init(int arr[], int sz, int set)
{
	int i = 0;
	for(i=0; i<sz; i++)
	{
		arr[i] = set;
	}
}


void Print(int arr[], int sz)
{
	int i = 0;
	for(i=0; i<sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


void Reverse(int arr[], int sz)
{
	int left = 0;
	int right = sz-1;


	while(left<right)
	{
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}

int main()
{
	int arry[] = { 0,1,2,3,4,5,6,7,8,9 };
	int sz = sizeof(arry) / sizeof(arry[0]);
	Print(arry, sz);
	Reverse(arry, sz);
	Print(arry, sz);
	Init(arry, sz,0);
	Print(arry, sz);
	return 0;
}

感谢您的观看

  • 24
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值