C语言基础练习——Day07

目录

选择题

编程题

图片整理

寻找数组的中心下标


选择题

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

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

解析:

主函数中定义的局部变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平行关系,C错误;当函数有返回值时,可以出现在表达式中,D错误

2、在C语言中,以下正确的说法是

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

解析:

在调用函数的时候,真实传递给函数的是实参,函数定义部分函数名后的参数是形参。形参和实参的名字是可以相同的,在函数调用的时候,形参是实参的一份临时拷贝,分别占用不同的内存空间,所以A正确,B错误,及时形参和实参的名字相同,也是占用不同的内存空间,所以B错误;函数如果不被调用时,函数的形参是形式上存在的,但是函数在被调用的时候,形参是要分配内存空间的,所以D错误。

3、在上下文及头文件均正常的情况下,下列代码的输出是(注: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 运行错误
  • D suieneG
答案:A
💡

解析:

代码实现了递归倒序打印字符串的功能,但是++s存在副作用,在第一次进入递归时s已经被改变,注意区分s+1++s,故因为s的值发生了变化,回不到'G'的位置上,故而没有打印'G'

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

  • A int y=f(9);
  • B f(9);
  • C f(f(9));
  • Dx=f();
答案:B

解析:

💡

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

5、给定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即等差数列的和

编程题

图片整理

题目链接:图片整理_牛客题霸_牛客网 (nowcoder.com)

描述
Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过代码解决。
Lily使用的图片使用字符"A"到"Z"、"a"到"z"、"0"到"9"表示。

数据范围:每组输入的字符串长度满足 1≤ n≤1000
输入描述:
一行,一个字符串,字符串中的每个字符表示一张Lily使用的图片。
输出描述:
Lily的所有图片按照从小到大的顺序输出

思路解析:

因为图片最后是按照对应字符的ASCII码值从小到大依次输出,故直接将原数组中的所有字符进行排序再输出即可,注意字符数组的实际长度不一定是开辟的长度,使用strlen进行计算

参考代码

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

int cmp(const void* p1, const void* p2)
{
    return ((*(char*)p1) - (*(char*)p2));
}

int main() {
    char str[1000] = {0};
    scanf("%s",str);
    qsort(str, strlen(str), sizeof(char), cmp);
    for(int i = 0; i<strlen(str);i++)
    {
        printf("%c", str[i]);
    }
    
    return 0;
}

寻找数组的中心下标

题目链接:724. 寻找数组的中心下标 - 力扣(LeetCode)

给你一个整数数组 nums ,请计算数组的 中心下标
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1

思路解析:

本题观察规律,当数组中存在中心下标时,满足sumLeft + sumRight + numMid = total,化简等式可以得到numMid = total - sumLeft - sumRight,因为存在中心下标,故存在sumLeft == sumRight,则等式简化为total = 2 * sumLeft + numMid,而sumLeft即为此时数组的前缀和,如果数组的前缀和的两倍加上中心下标的数值为total值时即为存在中心下标,此时numMid对应的下标即为中心下标,否则没有中心下标,在程序中,当左侧或右侧不存在前缀和时,默认前缀和为0

参考代码:

/*
 * @lc app=leetcode.cn id=724 lang=c
 *
 * [724] 寻找数组的中心下标
 */

// @lc code=start
int pivotIndex(int *nums, int numsSize)
{
    // 求数组总和
    int total = 0;
    for (int i = 0; i < numsSize; i++)
    {
        total += nums[i];
    }

    // 求前缀和
    int sum = 0;// 当不存在左侧前缀和时,默认为0
    for (int i = 0; i < numsSize; i++)
    {
        if (2 * sum + nums[i] == total)
        {
            return i;
        }
        sum += nums[i];
    }
    return -1;
}
// @lc code=end
  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

怡晗★

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

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

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

打赏作者

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

抵扣说明:

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

余额充值