阶段性回顾(4)与四道题目

TIPS

1. 当创建数组的时候,如果没有指定数组的元素个数也没关系,编译器会根据你初始化的内容来自行确定。

2. 在逻辑表达式当中,如果为真,就以1作为结果,如果为假,就以0作为结果。

3. 输入字符串的时候,可以用scanf加上%s,但是这么弄有一个缺陷,就是说scanf一旦读到空格就会停下来(有\n的话也会继续读下去),这就导致在输入字符串的时候,如果想要完整读入,就不能有空格。而gets()读取字符串的时候就没有那么多事了,并且还会把最后输入的一个\n自动从入缓冲区里面拿掉。

4. 指针的核心在于进行解引用操作,解引用操作!bty,指针(变量)与地址与内存编号这三个概念完全等价!

5. 比如说一个函数返回值是一个数组,那么其实我们知道,在代码里面数组名就是首元素的地址,其实也相当于就是返回了一个指针,于是在定义函数的时候开头比如说是int *。

6. 每一次函数调用,都需要在内存的栈区上为该函数开辟一块内存空间,事实上也就是该函数的函数栈帧。

7.  寄存器是电脑当中独立于内存的存储介质,常见的有eax, ebx,ecx,edx,ebp,esp等等,其中,ebp与esp这两个寄存器很关键。
 1. 首先这两个寄存器里面放的是地址。
 2. 其次这两个寄存器一个维护栈顶,一个维护栈底。
 3. 这两个寄存器指向的位置=在维护的位置=里面放的地址=寄存器的值

8. 每压一次栈,esp指向的位置就会发生变化。

9. 内存栈区的使用习惯是先使用高地址,在使用低地址,由高向低不断蔓延

10.strlen与printf在操作字符串时,\0都是不统计在内,而sizeof则不一样,字符串末尾的\0也是统计在内。

11. 不完全初始化的时候,其他位置默认初始化为0;静态区里面的值(如全局变量)就算不初始化,也默认为0.

12. 在C语言中,非0表示真,0表示假。逻辑表达式为真则为1,逻辑表达式为假则为0.

13. 尤其要注意,在除/时,如果两边操作数都为整数的话,执行的是整数除法,这时候就算你用double类型的数据去接受结果,也无非白添了小数点加6个0。当两边其中一个操作数为浮点数时,才执行小数除法,用double类型去接受结果才能如你所意。

14. #define定义常量与宏的时候不需要在末尾加;号。在代码里面就无脑替换就可以了,举个例子:

题目1

代码1:

/**
 * 
 * @param rotateArray int整型一维数组 
 * @param rotateArrayLen int rotateArray数组长度
 * @return int整型
 */
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) 
{
    int left=0;
    int right=rotateArrayLen-1;
    while(left<right)
    {
        int mid=(left+right)/2;
        if (*(rotateArray+mid)>*(rotateArray+right))
        {
            left=mid+1;
        }
        else if (*(rotateArray+mid)<*(rotateArray+right))
        {
            right=mid;
        }
        else
        {
            right--;
        }
    }
    return *(rotateArray+left);
}

经验总结:

1. 数组有关问题利用双指针指向首尾做为区间的端点是个常见的操作。
2. 像这道题可以用二分法的思路(同样经常运用在查找当中),旋转数组将原本有序的数组分成了两部分有序的数组,在原始有序数组中,最小的元素一定是在首位,现在相当于切断成了两部分,并且旋转了一下,我们可以将旋转前的前半段叫A,后半段叫B,现在相当于由原先的AB变成了BA。那么就可以知道:那个切点一定是数组的最小值所在。

3. 这时候就把中间值与端点值进行比较,发现:

     1. 若是区间中点值大于区间右界值,则最小的数字一定在中点右边。

     2. 若是区间中点值等于区间右界值,则是不容易分辨最小数字在哪半个区间,比如[1,1,1,0,1],应该逐个缩减右界。

     3. 若是区间中点值小于区间右界值,则最小的数字一定在中点左边。

4. 于是就用二分法调整区间,最后就可以锁定最小值所在。

代码2:

/**
 * 
 * @param rotateArray int整型一维数组 
 * @param rotateArrayLen int rotateArray数组长度
 * @return int整型
 */
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) 
{
    int i=0;
    for (i=1;i<rotateArrayLen;i++)
    {
        if (*(rotateArray+i)<*(rotateArray+i-1))
        {
            return *(rotateArray+i);
        }

    }
    return *(rotateArray);
}

经验总结:

1. 再怎么旋转,这也是一个数组,我们要找的数组最小值,更通用的解法莫过于遍历数组。

题目2

答案:8

经验总结:

1. 像这样define定义的常量与宏,都是可以去进行替代的,但是尤其要注意的一点就是,不能用数学的惯性给它随意加上括号(),如下面这样就是大错特错的

2. 而应该是这样才对:

题目3

设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )


 

答案:D

经验总结:

1.  这是for循环的执行流程图:for (exp1 ; exp2 ; exp3),是先执行exp1,然后判断exp2,为真的话再执行循环体,再执行exp3,然后在进行判断。

 

2. getchar()可以用来读取一个字符(你输入的),它的返回值是读取到的那个字符的ASCII码。

3. 当程序执行时一旦出现getchar,如果此时输入缓冲区里面没有东西,就会弹出一个界面,让你去输入字符(它读取不到就会返回EOF)。如果此时输入缓冲区里面有东西,那么getchar对抓去它干它自己的活。一次只能读取一个字符

题目4

代码:

#include <stdio.h>
#include <string.h>
int Judge(char* arr)
{
    //条件2
    if ((*arr>=48)&&(*arr<=57)) 
    {
        return 0;
    }
    //条件4
    if (strlen(arr)<8)
    {
        return 0;
    }
    //条件3
    int flag1=0;
    int flag2=0;
    int flag3=0;
    while(*arr!='\0')
    {
        if ((*arr>=48)&&(*arr<=57)) 
        {
            flag1=1;
        }
        else if ((*arr>=65)&&(*arr<=90)) 
        {
            flag2=1;
        }
        else
        {
            flag3=1;
        }
        int sum=flag1+flag2+flag3;
        if (sum>=2)
        {
            return 1;
        }
        arr++;
    }
    return 0;
}
int main()
{
    //输入n
    int n=0;
    scanf("%d",&n);
    //循环n次
    int i=0;
    char arr[100]={0};
    for (i=0;i<n;i++)
    {
        //输入字符串
        scanf("%s",arr);
        if (Judge(arr))
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
    return 0;
}

经验总结:

1. 在计算机代码里面,可以用简单的数字来表达一个事件的发生与否与状态。比如这边就定义flag1,flag2, flag3即使如此。 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

絕知此事要躬行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值