实验四

Posted lyrue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验四相关的知识,希望对你有一定的参考价值。

实验结论

Part 1

通过运行demo1,观察地址数字的变化可得:

整型数据int每个数据占四个字节

字符型数据char每个数据占一个字节

浮点型数据float同int相同,占四个字节

双精度型double占八个字节,和浮点型float数据输出结果都为六位小数,如果特殊输入为“%.2f”则为二位小数。

就我个人而言,更换输出类型时需要注意调整输出格式符。

——int是“%d”; char是“%c”;double和float都是“%f”。

Part 2

demo2_1

这部分实验和Part 1对比的话是将数据的地址换成了a[],观感上更简洁了当一些。

一开始对int中和大括号里面的a[]不是很能区分,现在大概明白了,int a[]是指定义一个数组,方括号内的数字指数据个数;后面的a[]是定义数组里的每个数,方括号里的数字表明的是次序。

在这个实验里面,因为是直接运行老师提供的代码,所以引用数组元素时也只是看了一眼注解,自我感觉良好,并且可以理解这个是从零开始而不是从一开始的。【后面吃了亏

demo2_2

跟上一组实验的输出结果相同,但是过程简化了许多。

——在定义数组时直接对数组内的元素进行了初始化,而不是像上一个代码一样每一行都要进行一次赋值;用for循环代替了上个代码的五次printf()。

demo2_3

这个更简洁了……定义数组时省去了数组内元素的个数,需要注意的是只有当所有元素都被赋值时才可以省去这个数据个数的输入。

熟悉了sizeof()的用法,是用来计算字节数的。个人认为这个改进后的巧妙之处在于从未说明数组内数据个数也可以运用for循环,关键就在于先是计算出数组整体的字符数,再除以每一个字符所占的字节数得出数据个数。

每个字符所占的字节数可以是sizeof(a[0])也可以把括号里面的改成数据类型,int或者其他的。

demo2_4

这个是可以简化一下初始化的数据个数的写法吧,需要标明数组内数据的个数,将需要赋值为非零的数字写出来即可。

总的来说,就我个人而言,我认为part 2大概可以帮助更熟悉的运用数组这一新概念去解决实际问题,2_1是引入数组概念;2_2是通过循环简化输出;2_3是省略定义数组时原应标明的数组个数,不过前提是必须所有元素都被初始化;2_4是当不是所有元素都被初始化时,其余元素默认为零。

然鹅……当我认为我通过以上四个不同的代码输出相同类别的数据的整理之后应该已经熟练掌握了、并准备做一下那个五十个candidate时,我掉坑里了(…)

用的是2_4这个写法来写的,但是在for循环的时候第一次输入的i<50,输出结果只到了49,觉得少了一个就改成了i<51,然后就尴尬了。

直到后来问完teacher才知道这个坑在于角标从零开始……虽然掉坑了但还是挺开心的吧,这样以后一个不会再出现这个错误了【maybe

Part 3

demo3_1

同Part 2不同的是将数组内原来的常量换成了变量吧,单独对a[]方括号里面的变量进行定义。

demo3_2

在这一部分引入了函数定义。这里面的print(score[i])相当于printf("%d",score[i])

demo3_3

比3_2稍微复杂了一些,需要注意的是在定义函数时,数组名是a[] 调用时需要去掉方括号。

Part 4

看了一眼冒泡法的动画演示…好神奇。

for(j=0; j<n-1-i; j++)

看了老师在群里发的解释之后能明白了,减一仍然是因为数组是从0开始的。

运用了函数定义,函数调用。这个冒泡法的实现过程……挺长的,看着有点累,但是每一行看下来大概能够看懂。

第一个循环和第二个循环有个很相似的地方,是一个很基础的问题但乍一看容易眼花,即

scanf("%d",&a[i])
printf("%d",a[i])

第一个是给数组的每个元素赋值,第二个是输出先前赋值的元素。

Part 5

// 功能描述:输入一组整数,输出最大值 
#include <stdio.h>
int findMax(int x[], int n); // 函数声明
const int N=5;
int main() {
    int a[N];
    int max, i;
    
    printf("输入%d个整数: \\n", N);
        
    // 利用循环输入N个整数给数组a 
    // 补足程序1 
    // 。。。 
    for(i=0;i<N;i++)
        scanf("%d",&a[i]);
    printf("数据:\\n");
    for(i=0;i<N;i++)
        printf("%d",a[i]);
    printf("\\n");
            
    // 调用子函数max求数组a的最大元素值,并赋值给max 
    // 补足程序2 
    // 。。。 
    findMax(a,N);
    max = findMax(a,N);
    printf("\\n") ;

    // 输出最大值
    printf("数组a中最大元素值为: %d\\n\\n", max); 
        
    return 0;
} 

// 函数定义
// 功能描述:找出整型数组a中元素的最大值,并返回次此最大值
// 补足函数findMax()的实现部分3 
// 。。。 
int findMax(int a[],int n)
{
    int i,max;
    max=a[0];
    for(i=0;i<N;i++)
    {
        if(a[i]>max)
            max=a[i];
    }
    return max;
}

我疯了。技术图片

#include <stdio.h>
const int N=4;
void output(char x[], int n);  // 函数声明 
// 排序函数声明
void bubbleSort(char x[],int n);

int main() {
    char string[N] = {2,0,1,9};
    int i;
    
    printf("排序前: \\n");
    output(string, N);
    
    // 调用排序函数对字符数组中的字符由大到小排序 
        bubbleSort(string,N);
    
    printf("\\n排序后: \\n"); 
    output(string, N);
    
    printf("\\n");
    getchar();
    return 0;    
} 

// 函数定义
// 函数功能描述:输出包含有n个元素的字符数组元素
// 形参:字符数组,以及字符数组元素个数
void output(char x[], int n) {
    int i;
    
    for(i=0; i<N; i++)
        printf("%c", x[i]);
} 

// 函数定义
// 函数功能描述:对一组字符由大到小排序
// 形参:字符数组,以及字符数组元素个数
// 补足代码3 
void bubbleSort(char x[],int n){
    int i,j;
    char t; 
    for(i=0;i<n-1;i++){
        for(j=0;j<n-1-i;j++){
            if(x[j]<x[j+1]){
                t=x[j];
                x[j]=x[j+1];
                x[j+1]=t;
            }
        }
    }
}

技术图片

 

做到心态爆炸了。。

实验总结与体会


要期中考试了有点懵逼……做前几个部分的时候还好,到最后要自己动手的时候就整个人都不是很好了,越做越不会做然后怎么写都出错,参考了几位同学的代码然后又删删减减的终于变成现在这样了……

最后打算期中之前复习一遍学过的所有知识吧,然后再自己再重做一遍这个实验。

 

互评:【作为一个菜比互评的时候感觉大家都真的棒。。咸鱼瘫了】

https://www.cnblogs.com/luwenyuisxiaokeai/p/10770362.html

https://www.cnblogs.com/fxy0503/p/10762635.html

https://www.cnblogs.com/angel-x/p/10770343.html

 

以上是关于实验四的主要内容,如果未能解决你的问题,请参考以下文章

实验代码审查

实验代码审查

验证码逆向专栏极验三代四代点选类验证码逆向分析

验证码逆向专栏某验四代文字点选验证码逆向分析

实验四 代码审查

实验四 代码审查