实验5

e1.

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

        return 0;
}

1,连续存放。

2作用相同但不等价。

e2

#include<stdio.h>
const int LINE = 2;
const int COL = 3;
int main() {
    int a[LINE][COL] = { 1, 2, 3, 4, 5, 6 };
    int i, j;
    printf("通过数组名及下标直接访问数组元素");
    for (i = 0; i < LINE; i++)
        for (j = 0; j < COL; j++)
            printf("%d:%d\n", &a[i][j], a[i][j]);
    printf("通过地址间接访问数组元素");
    for (i = 0; i < LINE; i++)
        for (j = 0; j < COL; j++)
            printf("%d:%d\n", a[i]+j, *(a[i] + j));
    printf("二维地址中a+i表示的地址:\n");
    for (i = 0; i < LINE; i++)
        printf("a+%d: %d\n", i, a + i);
    return 0;
}

1.是

2.不等价

3是,是

e3

#include<stdio.h>
#include<stdlib.h>
const int N = 3;
int main(){

        int a[N];
        int* p, i;

        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 (i = 0; i < N; i++)
            scanf("%d", p + i);

        for (i = 0; i < N; i++)
            printf("%d", *(p + i));

        printf("\n");
        return 0;
    }
    

1.指向p+2和a[2]

2指向a[0]

3这种方式更灵活

e4

#include<stdio.h>
int main()
{
    int a[2][3] = { 1, 2, 3, 4, 5, 6 };
    int i, j;
    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 (j = 0; j < 3; j++)
            printf("%d", *(*q + j));
            printf("\n");
    return 0;
}

1.可以

2a[0]+j的地址和a[0]+j的值

e5.1

#include<stdio.h>
const int N = 5;
int binarySearch(int x[], int n,int item);
int main()
{
    int a[N] = { 2,7,19,45,66 };
    int i, index, key;
    printf("数组a中的数据:\n");
    for (i = 0; i < N; i++)
        printf("%d ", a[i]);
    printf("\n");
    printf("输入待查找的数据项:");
    scanf("%d", &key);
    index=binarySearch(a, N, key);
    if (index >= 0)
        printf("%d在数组中,下标为%d\n",key,index);
    else
        printf("%d不在数组中\n", key);
    return 0;
}
int binarySearch(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;
}

e5.2

#include<stdio.h>
const int N = 5;
int binarySearch(int *x, int n, int item);
int main()
{
    int a[N] = { 2,7,19,45,66 };
    int i, index, key;
    printf("数组a中的数据:\n");
    for (i = 0; i < N; i++)
        printf("%d ", a[i]);
    printf("\n");
    printf("输入待查找的数据项:");
    scanf("%d", &key);
    index = binarySearch(a, N, key);
    if (index >= 0)
        printf("%d在数组中,下标为%d\n", key, index);
    else
        printf("%d不在数组中\n", key);
    return 0;
}
int binarySearch(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;
}

e6.2

#include<stdio.h>
const int N = 5;
void selectSort(char str[][20] ,int n);
int main() {
    char name[][20] = { "Bob","Bill","Joseph","Taylor","George" };
    int i;
    printf("输出初始名单:\n");
    for (i = 0; i < N; i++)
        printf("%s\n", name[i]);
     selectSort(name, N);
     printf("按字典序输出名单:\n");
     for (i = 0; i < N; i++)
     printf("%s\n", name[i]);
}
void selectSort(char str[][20], int n) {
    char temp[20];
    int a,j,k;
    int x, y;
    x = 0;
    y = 0;
    for (a = 0; a < 4; a++) 
    {
        k = a;
        for (j = a + 1; j < n; j++)
            for (y = 0; y < 20; )
            {
                if (str[j][y] < str[k][y])
                {
                    k = j; break;
                }
                else if (str[j][y] > str[k][y])
                    break;
                else
                    y++;
            }
        if (k != a)
        {
            while ((temp[x] = str[a][x] )!= '\0')
            {
                x++;
            }
            x = 0;
            while ((str[a][x] = str[k][x] )!= '\0')
            {
                x++;
            }
            x = 0;
            while ((str[k][x] = temp[x])!= '\0')
            {
                x++;
            }
            x = 0;
        }
    }
}

 唯一不明白的就是实验六比较两个字符串大小直接用><为什么也可以?

posted @ 2020-12-13 10:59  我想学好c语言  阅读(107)  评论(1编辑  收藏  举报