c语言每日一练(9)

这篇具有很好参考价值的文章主要介绍了c语言每日一练(9)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:
每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。

五道选择题:

1、以下 scanf 函数调用选项中, 错误的是( )

struct T
{
char name[20];
int age;
int sex;
} a[5], *pa=a;

A、scanf("%s",a[0].name);

B、scanf("%d", &pa[0].age);

C、scanf("%d",&(pa->age));

D、scanf("%d", pa->age);

解析:首先,你要明白scanf需要什么,它需要地址,你只要给它对应数据的地址,它就会根据地址对你所给的目标进行修改

选项A,通过结构体数组访问到结构体,再通过结构体访问到结构体成员,但它访问的是字符数组,而字符数组的本质就是指针,故A正确。选项B,使用结构体数组的方式访问结构体,再通过结构体访问结构体成员,不同于A的是它访问的是整型变量,整型变量没有字符数组那么特殊,因此要取地址,它也取了,故B正确。

选项C,使用->的方式取到了结构体成员,并取了地址,和B雷同,C正确。D选项,与C不同的就在于没有取地址,因此,scanf无法正确地执行,故D错误。

2、关于指针下列说法正确的是【多选】( )
A、 任何指针都可以转化为void * B、 void *可以转化为任何指针
C、 指针的大小为8个字节           D、 指针虽然高效、灵活但可能不安全

解析:C错误,因为指针的大小是随着平台的变化而变化的,当指针处于32位平台时,大小为4,为64位平台时位8,ABD没有问题。 

3、请指出以下程序的错误【多选】( )

void GetMemory(char** p, int num)
{
    if (NULL == p && num <= 0)//1
        return;
    *p = (char*)malloc(num);
    return;
}
int main()
{
    char* str = NULL;
    GetMemory(&str, 80); //2
    if (NULL != str)
    {
        strcpy(&str, "hello"); //3
        printf(str); //4
    } 
    return 0;
} 

A、1      B、2      C、3     D、4

 解析:代码1错误,因为得同时满足两个条件才会直接报错,但很显然,我们的目的是令num>0,p!=NULL,因此一个有误就得报错。

在语句GetMemory(&str,100);中传入str的地址,在语句char*str=NULL;中str初始化为空指针,但是str指针变量也有地址,所以参数char**p里面的p保存的是指针变量str的地址,所以调用GetMemory函数之后,动态开辟的空间的地址存放在了str中,在函数返回之后没有释放内存,但是这不会导致程序错误,只会导致内存泄漏。故代码2无误。

代码3错误,&str相当于是对地址的地址进行操作了,没操作到该操作的。代码4是正确的,相当于printf("hello");综上所述,选AC

4、下面这个程序执行后会有什么错误或者效果【多选】( )

#define MAX 255
int main()
{
unsigned char A[MAX], i;
for(i = 0; i <= MAX; i++)
A[i] = i;
return 0;
}

A、 数组越界 B、 死循环 C、 栈溢出 D、 内存泄露

解析:选项A,观察代码可以看出创建的数组大小为255,因此,数组下标最大为254,i<=MAX的条件一定会令i达到255,会越界。选项B,每次循环i++,MAX的值是定值,好像不会造成死循环,但i是unsigned char型的,因此,i最大为255,当要超出255时就会像一个圆绕回到0,所以会导致死循环。

C选项,创建的临时变量,在栈中,应该会由系统自动释放,所以是不存在内存泄漏的问题。栈溢出:属于缓冲区溢出的一种。栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围,D选项,无稽之谈,我都没有申请空间,所以根本不会有内存泄漏。综上所述,答案为AB

5、请问下列程序的输出是多少( )

#include<stdio.h>
int main()
{
    unsigned char i = 7;
    int j = 0;
    for (; i > 0; i -= 3)
    {
        ++j;
    }
    printf("%d\n", j);
    return 0;
}

A、2     B、死循环    C、173    D、172

解析:unsigned char 型的范围为0~255,为负数的时候也会像圆一样绕回来,反着绕。观察代码,i被初始化为7,每次进行循环i-3,i>0循环继续,每次循环j++,最后打印出j,目标计算循环次数。i=7,循环到i=-2时,由于unsigned char的特殊性会令i=254,254/3=84余2,即i=2,再使i=-1,由于特殊性,i=255,255/3=85,i=0,循环结束。综上所述,循环次数为3+84+1+85=173,故选C

c语言每日一练(9),每日一练,c语言,开发语言

编程题1:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

c语言每日一练(9),每日一练,c语言,开发语言

 思路:猜中次数很好计算,一次循环就可以计算出来,难的是伪猜中的次数。首先,猜中不能被算作伪猜中,那么一旦猜中,那两个被猜中的槽就可以看作配对成功,不用再考虑,可以把它们置为-1。在后期的判定中,一遇到-1便continue切换槽位即可,而一旦伪猜中成功,那两个槽也相当于废掉了,不能在同一个槽伪猜中多次,这是一个隐藏规则,所以把这两个槽也置为-1

#include<stdio.h>
#include<stdlib.h>
int* masterMind(char* solution, char* guess, int* returnSize) {
    *returnSize = 2;
    //初始化返回的数组,因为我们仅仅只需要返回猜中次数和伪猜中次数,所以必定为2
    int* order = (int*)malloc(sizeof(int) * 2);
    //创建返回数组
    int i = 0; int j = 0;
    int count_true = 0;//猜中次数计数
    int count_false = 0;//伪猜中次数计数
    for (i = 0; i < 4; i++)
        //一共四个槽,所以solution和guess的数组大小都为4
    {
        if (solution[i] == guess[i])
        {
            count_true++;
            solution[i] = -1;
            guess[i] = -1;
            //由于猜中的槽,伪猜中的不能重复,所以置为-1,用来判定
        }
    }
        for (i = 0; i < 4; i++)
        {
            if (solution[i] == -1)
            {
                continue;
            }
            for (j = 0; j < 4; j++)
            {
                if (guess[j] == -1)
                {
                    continue;
                }
                if (solution[i] == guess[j])
                {
                    count_false++;
                    solution[i] = -1;
                    guess[j] = -1;
                }
            }
        }
        order[0] = count_true;
        //存放猜中次数
        order[1] = count_false;
        //存放伪猜中次数
        return order;
        //返回目标
    }

编程题2:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

c语言每日一练(9),每日一练,c语言,开发语言

思路:暴力破解,没什么好说的,两个循环遍历完蛋

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    *returnSize = 2;
    //只用返回两个数,所以数组大小必定为2
    int* order = (int*)malloc(sizeof(int) * 2);
    //创建一个符合条件的数组
    int i = 0; int j = 0;
    for (i = 0; i < numsSize; i++)
    {
          for(j=i+1;j<numsSize;j++)
        {   //减少循环次数
            if (nums[i] + nums[j] == target)
                //找到目标,直接储存并返回
            {
                order[0] = i;
                order[1] = j;
                return order;
            }
        }
    }
    return NULL;//找不到返回空
}

  好了,今天的练习到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O文章来源地址https://www.toymoban.com/news/detail-655410.html

到了这里,关于c语言每日一练(9)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c语言每日一练(10)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、如果 x=2014 ,下面函数的返回值是( )  A、20   B、21    C、

    2024年02月11日
    浏览(37)
  • c语言每日一练(4)

    1、有以下代码,程序的输出结果是( ) A.10       B.9       C.8       D.7 解析: 先看代码构成,代码的主要部分是一个循环,最终目标是打印出a的大小。 直接看循环,for循环先将a和b都初始化成了1,循环进行的条件是a=100,循环每次结束后,a+1 接着看循环的内部,1代码代

    2024年02月13日
    浏览(37)
  • c语言每日一练(12)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、程序运行的结果是()  A、 sum=9 B、 sum=10 C、 sum=12 D、 su

    2024年02月11日
    浏览(32)
  • c语言每日一练(8)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、请阅读以下程序,其运行结果是( )   A、YES       B、NO 

    2024年02月12日
    浏览(32)
  • C语言每日一练(1)

    题目: 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析: 可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 程序源代码: 以上实例输出结果为: 题目: 企业发放的奖金根据利润提成。利

    2024年02月12日
    浏览(48)
  • c语言每日一练(5)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、下面代码的结果是:( ) A. a = 8 b = 23 c = 8      B. a = 9 b= 23 c =

    2024年02月13日
    浏览(75)
  • c语言每日一练(6)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、如下程序的功能是( ) A、 测字符数组ch的长度 B、 将数字字

    2024年02月13日
    浏览(36)
  • c语言每日一练(15)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,上学期间将看学业情况更新。 1、程序运行的结果为() A、1,5      B、2,5      C、1,6     D、2,6 解析:首先定义sum和pad为5,接

    2024年02月07日
    浏览(34)
  • C语言每日一练(二)

    解法一:在原链表中删除Node.next=next的节点 注意:当头节点的val==val时,要改变头节点的位置 解法二:创建新的指向头尾的链表 注意:这里如果写head的话,当一个节点是要删除的节点,头节点还是那个删除的节点。 解法一:创建新链表,对新链表进行头插 解法二:定义三个

    2024年02月08日
    浏览(37)
  • c语言每日一练(7)

    前言: 每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。 1、下列定义数组的语句中正确的是【多选】( ) A、 B、char str

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包