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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340