C语言 实验五 任务报告

📝实验五 任务报告

✨实验总结

😟遇到的问题:

这次报告本来已经写好了的,但是宿舍突然停电,电脑直接关闭,我也没开自动保存,真是一个悲惨的故事。导致只有先交上去再修改😥

🧐解决方法:

重新写一遍

🤔反思:

要养成随时保存的习惯

✨实验内容

🕐任务一

📃代码:

#include <stdio.h>
#include "stdlib.h"
#define N 5
int main()
{
    int a[N]={1,2,3,5,8};
    printf("通过数组名及下标直接访问数组元素:\n");
    for (int i = 0; i < N; ++i)
    {
        printf("a[%d]的地址为:%d,值为:%d\n",i,&a[i],a[i]);
    }
    printf("通过地址间接访问数组元素:\n");
    for (int i = 0; i < N; ++i)
    {
        printf("a[%d]的地址为:%d,值为:%d\n",i,a+i,a[i]);
    }
    return 0;
}

🎨截图:

image.png

🤓反思:

image.png

通过截图可以清楚的看到数组的每个元素地址都相差4个字节,刚好是定义int所分配的字节数,因此数组在内存中是连续存放的;

就本例而言,我认为a+i和&a[i]、*(a+i)和a[i]是等价的,但是仅仅只针对一维数组。换做是二维数组就明显不等价了。

🕑任务二

代码:

#include <stdio.h>
#include <stdlib.h>
#define line 4
#define col 3
int main()
{
    int a[line][col]={1,2,3,5,8,13,21,34,55,89,144,233};
    printf("通过数组名及下标直接访问数组元素:\n");
    for (int i = 0; i < line; ++i)
    {
        for (int j = 0; j < col; ++j)
        {
            printf("a[%d][%d]的地址为:%d,值为:%d\n",i,j,&a[i][j],a[i][j]);
        }

    }
    printf("通过地址间接访问数组元素:\n");
    for (int i = 0; i < line; ++i)
    {
        for (int j = 0; j < col; ++j)
        {
            printf("a[%d][%d]的地址为:%d,值为:%d\n",i,j,a+i,a[i][j]);
        }
    }
    return 0;
}

截图:

image.png

反思:

image.png

观察一下,二维数组的确是按照行的顺序存放的a[3][0]a[3][3]的地址都是一样的,整个数组由m行组成,每一行又由n列组成。

也同样是只针对二维数组而言,这些形式是等价的。

🕒任务三

📃代码:

#include <stdio.h>
#include "stdlib.h"
#define N 5
int main()
{
    int a[N];
    int *p;
    for (p = a; p < a + N; ++p)
        {
            scanf("%d",p);
        }
    for (p = a;p < a+N; ++p)
        {
            printf("%d ",*p);
        }
    printf("\n");
    p=a;
    for (int i = 0; i < N; ++i)
        {
            scanf("%d",p+i);
        }
    for (int i = 0; i < N; ++i)
        {
            printf("%d ",*(p+i));
        }
    printf("\n");
    return 0;
}

🎨截图:

image.png

🤓反思:

imagee77e201275352bb4.png

指针变量在使用时一定要有指向的地址,否则指向不明确,程序会出错;

指向a[3];

p = a;这一行之后的p+i并未改变p的指向,所以全部指向a[0]

🕓任务四

📃代码:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int a[2][3]={1,2,3,5,6,11};
    int *p;
    int (*q)[3];
    for(p=a[0];p<(a[0]+6);++p)
    {
        printf("%d ",*p);
    }
    printf("\n");
    for(q=a;q<a+2;++q)
    {
        for (int i = 0; i < 3; ++i)
        {
            printf("%d ",*(*q+i));
        }
    }
    printf("\n");
    return 0;
}

🎨截图:

image.png

🤓反思:

image.png

for(p=a[0];p<(a[0]+6);++p)可以换为for(p=&a[0][0]; p<&a[0][0] + 6; p++),由任务2可得对于二维数组,&a[0][0]a[0]等价;

*q+j表示a[0]+j,*(q+j)表示a[j];

指向一维数组的指针变量

设一维数组为a[n]

定义方法: *指针变量名 ,即 *p这个p一般指向的一维数组的首地址,即p=a,或者p=&a[0]p,a,&a[0]均指向同一单元,它们是数组a的首地址,也是0 号元素a[0]的首地址。p+1,a+1,&a[1]均指向1号元素a[1]。类推可知a+i,a+i,&a[i]

指向二维数的指针变量

定义方法:(*指针变量名)[长度](*P)[n]把二维数组a 分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为: int (*p)[4] 它表示p是一个指针变量,它指向二维数组a 或指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0]等。而p+i则指向一维数组a[i]。从前面的分析可得出*(p+i)+j是二维数组i行j 列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值。

imageffebc809badb6c70.png

A、E、D、F、G、B、C

🕔任务五

📃代码:

5.1

#include <stdio.h>
#include <stdlib.h>
#define N 5
int bisearch(int x[],int n,int item);
int main()
{
    int a[N]={1,12,65,123,644};
    int index,key;
    printf("数组a中的数据:\n");
    for (int i = 0; i < N; ++i)
    {
        printf("%d,",a[i]);
    }
    printf("\n");
    printf("输入待查找的数据项:");
    scanf("%d",&key);
    index=bisearch(a,N,key);
    if(index>=0)
        printf("%d在数组中,下标为%d\n",key,index);
    else
        printf("%d不在数组中\n",key);
    return 0;
}
int bisearch(int x[],int n,int item)
{
    int low,high,mid;
    low=0;
    high=n-1;
    while (low<=high)
    {
        mid=low+(high-low)/2;
        if (x[mid]==item)
            return mid;
        else if (x[mid]>item)
            high=mid-1;
        else
            low=mid+1;
    }
    return -1;
}

5.2

#include <stdio.h>
#include <stdlib.h>
#define N 5
int bisearch(int *x,int n,int item);
int main()
{
    int a[N]={1,12,65,123,644};
    int index,key;
    for (int j = 0; j < 3; ++j)
    {
        printf("数组a中的数据:\n");
        for (int i = 0; i < N; ++i)
        {
            printf("%d,",a[i]);
        }
        printf("\n");
        printf("输入待查找的数据项:");
        scanf("%d",&key);
        index=bisearch(a,N,key);
        if(index>=0)
            printf("%d在数组中,下标为%d\n",key,index);
        else
            printf("%d不在数组中\n",key);
    }
    return 0;
}
int bisearch(int *x,int n,int item)
{
    int low,high,mid;
    low=0;
    high=n-1;
    while (low<=high)
    {
        mid=(low+high)/2;
        if (*(x+mid)==item)
            return mid;
        else if (x[mid]>item)
            high=mid-1;
        else
            low=mid+1;
    }
    return -1;
}

🎨截图:

5.1

image.png

5.2

image.png

🤓反思:

二分查找是一种效率较高的查找方法。但是要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

🕕任务六

📃代码:

6.1

#include <stdio.h>
#include <stdlib.h>
void input(int x[],int n);
void output(int x[],int n);
void select_sort(int x[],int n,int order);
int main()
{
    int N;
    printf("请输入数组的元素个数:");
    scanf("%d",&N);
    int a[N];
    printf("请依次输入%d个数:",N);
    input(a,N);
    printf("排序前的数据:\n");
    output(a,N);
    select_sort(a,N,1);
    printf("排序后的数据:\n");
    output(a,N);
    return 0;
}
void input(int x[],int n)
{
    for (int i = 0; i < n; ++i)
    {
        scanf("%d",&x[i]);
    }
}
void output(int x[],int n)
{
    for (int i = 0; i < n; ++i)
    {
        printf("%d ",x[i]);
    }
    printf("\n");
}
void select_sort (int x[],int n,int order)
{
    int temp,p,i,min;
    for (int j = 0; j < n; ++j)
    {
        min=x[j];
        for (i = j; i < n; ++i)
        {
            if(min>=x[i])
            {
                min=x[i];
                p=i;
            }
        }
        temp=x[p];
        x[p]=x[j];
        x[j]=temp;
    }
    if (order)
    {
        int t;
        for (int i = 0; i < n/2; ++i)
        {
            t=x[i];
            x[i]=x[n-i-1];
            x[n-i-1]=t;
        }
    }
}

6.2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5
#define order 1
void output(char x[][20],int n);
void select_sort(char x[][20],int n,int o);
int main()
    {

    char name [][20]={"Jay","Z","Jobs","Bill","Trump"};
    printf("输出初始名单:\n");
    output(name,N);
    select_sort(name,N,order);
    printf("按字典序输出名单:\n");
    output(name,N);
    return 0;

    }

void output(char x[][20],int n)
    {

    for (int i = 0; i < n; ++i)
    {
        printf("%s ",x[i]);
    }
    printf("\n");

    }
void select_sort (char x[][20],int n,int o)
    {

    char temp[20],min[20];
    int i,j,p;
    for (j = 0; j < n; ++j)
    {
        strcpy(min,x[j]);
        for (i = j; i < n; ++i)
        {
            if(strcmp(min,x[i])>=0)
            {
                strcpy(min,x[i]);
                p=i;
            }
        }
        strcpy(temp,x[p]);
        strcpy(x[p],x[j]);
        strcpy(x[j],temp);
    }

    if (o)
    {
        char t[20];
        for (int i = 0; i < n/2; ++i)
        {
            strcpy(t,x[i]);
            strcpy(x[i],x[n-i-1]);
            strcpy(x[n-i-1],t);
        }
    }


    }

🎨截图:

6.1

image.png

6.2

image.png

🤓反思:

感觉代码有点多余,但是想优化又无从下手,如果能有评论指出就好了。

posted @ 2020-12-18 12:53  李柳星  阅读(103)  评论(1编辑  收藏  举报