C语言暑假学习刷题——Day7

目录

选择题

考点一:C语言函数

考点二:函数在内存中存储

考点三:函数的具体使用

考点四:调用函数的理解

考点五:递归函数

编程题

【牛客网题号: HJ34 图片整理】【难度:中等】

【 leetcode 题号:724. 寻找数组的中心下标】【难度:简单】


 

选择题

考点一:C语言函数

 以下对C语言函数的有关描述中,正确的有【多选】( )

A: 在C语言中,一个函数一般由两个部分组成,它们是函数首部和函数体
B: 函数的实参和形参可以是相同的名字
C: 在main()中定义的变量都可以在其它被调函数中直接使用
D: 在C程序中,函数调用不能出现在表达式语句中

正确答案:AB

主函数中定义的局部变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系,C错误;

当函数有返回值时,可以出现在表达式中,D错误

考点二:函数在内存中存储

在C语言中,以下正确的说法是( )

A: 实参和与其对应的形参各占用独立的存储单元
B: 实参和与其对应的形参共占用一个存储单元
C: 只有当实参和与其对应的形参同名时才共占用存储单元
D: 形参是虚拟的,不占用存储单元

正确答案:A

在调用函数的时候,真实传递给函数的是实参,函数定义部分函数名后的参数是形参。形参和实参的名字是可以相同的,在函数调用的时候,形参是实参的一份临时拷贝,分别占用不同的内存空间,所以A正确

即使形参和实参的名字相同,也是占用不同的内存空间,所以B错误;

函数如果不被调用时,函数的形参是形式上存在的,但是函数在被调用的时候,形参是要
分配内存空间的,所以D错误。

小知识:

实际参数(实参):
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

考点三:函数的具体使用

在上下文及头文件均正常的情况下,下列代码的输出是( )(注: print 已经声明过)
 

int main()
{
	char str[] = "Geneius";
	print(str);
	return 0;
}

 print(char *s)
{
	if(*s)
	{
		print(++s);
		printf("%c", *s);
	}
}

A: suiene B: neius C: run-time error D: suieneG

正确答案:A(注意s前面有个空格)

知识点:函数声明

因为程序是从上往下按顺序走的,如果其它函数写在主函数后面而且没有被声明的话,此时程序是不知道有这个函数,那程序走到这些函数被调用的地方的时候,是找不到它们函数的本体的,因为从头都没发现函数体

但如果在程序开头声明过的话,在程序走到函数声明的地方时,就相当于将最后的函数体整体替代了声明的语句,就告诉程序是有这个函数的,那在调用的时候就能被调用了

代码实现了递归倒序打印字符串的功能,但是++s使得s的值发生了变化,回不到'G'的位置上,故而没有打印'G'

*s为G,执行print(e),printf(e)被压入倒数第1层,应该输出e;
*s为e,执行print(n),printf(n)被压入倒数第2层,应该输出n;
*s为n,执行print(e),printf (e) 被压入倒数第3层,应该输出e;
*s为e,执行print(i),printf (i) 被压入倒数第4层,应该输出i;
*s为i,执行print(u),printf (u) 被压入倒数第5层,应该输出u;
*s为u,执行print(s),printf (s) 被压入倒数第6层,应该输出s;
*s为s,执行print(\0),printf (\0) 被压入倒数第7层,应该输出空格
开始跳出print,从上向下得到压入栈中的printf,得到最后结果“ suiene”

考点四:调用函数的理解

对于函数 void f(int x); ,下面调用正确的是( )

A: int y=f(9); B: f(9); C: f(f(9)); D: x=f();

正确答案:B

函数f是没有返回值的,不能给int类型变量赋值故A错误

同时需要一个整型参数,C中f(9)不能作为f的参数,也是错的,
D选项没有传参,也不能接收返回值也是错误的。

考点五:递归函数

给定 fun 函数如下,那么 fun(10) 的输出结果是( )

int fun(int x)
{
	return (x==1) ? 1 : (x + fun(x-1));
}

A: 0 B: 10 C: 55 D: 3628800

正确答案:C

代码是一个递归函数

计算x+(x-1)+(x-2)+...+2+1即等差数列的和

编程题

【牛客网题号: HJ34 图片整理】【难度:中等】

描述
Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
Lily使用的图片使用字符"A"到"Z"、"a"到"z"、"0"到"9"表示。
数据范围:每组输入的字符串长度满足 1≤n≤1000
输入描述:
一行,一个字符串,字符串中的每个字符表示一张Lily使用的图片。
输出描述:
Lily的所有图片按照从小到大的顺序输出
示例1
输入:
Ihave1nose2hands10fingers
输出:
0112Iaadeeefghhinnnorsssv

题目传送门:OJ链接

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[1000] = { 0 };
    int i = 0;
    while (scanf("%s", &arr) != EOF)//如果没有这样写会超内存的
    {
        int a[1000] = { 0 };//定义一个数组,记录字符存放的个数
        int len = strlen(arr);
        for (i = 0; i < len; i++)
        {
            a[arr[i]]++;//对应ASCII码次数+1
        }
        for(int i=0; i<1000; i++)//遍历数组a
        {
            while (a[i] != 0)//如果a里面的字符还有
            {
                printf("%c",i);//打印字符,此时i为字符
                a[i]--;//字符次数-1,到0为止
            }
        }
        printf("\n");
    }
    return 0;
}

冒泡排序:相邻数据之间进行比较交换,将较大或较小的数据向后推到数组末尾,然后开始下一轮次大数据的冒泡过程

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[1000] = { 0 };
	while (scanf("%s", &arr) != EOF)
	{
		int len = strlen(arr);
		for (int i = 0; i < len - 1; i++)
		{
			for (int j = i + 1; j < len; j++)
			{
				if (arr[i] > arr[j])
				{
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
		printf("%s\n", arr);
	}
	return 0;
}

【 leetcode 题号:724. 寻找数组的中心下标】【难度:简单】

给你一个整数数组 nums ,请计算数组的 中心下标

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

示例 1:

输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

题目传送门:OJ链接

思路:

从数组的0下标处开始向后逐下标统计,计算当前下标左边之和,和右边之和,进行判断,相等则为中心下标,如果
数组循环结束都没有找到中心下标,则返回-1,表示没有中心下标

int pivotIndex(int* nums, int numsSize)
{
    int i = 0;
    int total = 0;
    
    for(i=0;i<numsSize;i++)
    {
        total += nums[i];
    }
    
    int sum = 0; // 左边下标的和
    
    for(i=0;i<numsSize;i++)
    {
        if(sum == total - nums[i] - sum)
        //判断 左边下标之和 是否等于 右边下标之和
        {
            return i;
        }
        sum = sum + nums[i];
    }
    
    return -1;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗小温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值