实验五

#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. 对于数组元素及其地址的访问,以下访问方式是否是等价的      是等价的
a+i和&a[i]都表示数组元素a[i]的地址
*(a+i)和a[i]都表示数组元素a[i]
 
任务二
#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("通过数组名直接访问数组元素\n");
    for(i=0;i<LINE;i++)
    for(j=0;j<COL;j++)
    printf("%d:%d\n",&a[i][j],a[i][j]);
    printf("通过地址间接访问数组元素\n");
    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. c语言中,二维数组在内存中是否是按行存放的?                                             是的
2. 对于二维数组元素及其地址的访问,以下方式是否是等价的?                    都是等价的
a[i]+j和&a[i][j]都表示二维数组元素a[i][j]的地址
*(a[i]+j)和a[i][j]都表示二维数组元素a[i][j]
3. 对于二维数组a[2][3],以下方式是否是等价的?                                               都不等价
a和&a[0]都表示二维数组第0行的地址
a+1和&a[1]都表示二维数组第1行的地址
 
任务三
#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. 程序源码中,line12-line13执行完后,指针变量p指向哪里?line16-line17执行完后,指针变量p       a[2]  a[2]
指向哪里?
3. 程序源码中,line22-line27执行完后,指针变量p指向哪里?line26-line27执行完后,指针变量p         a[2]   a[2]
指向哪里?
4. 对比line16-line17和line26-line27,体会它们通过指针变量间接访问一维数组时的差异和灵活
性              通过指针变量间接访问一堆数组时,指向的对象相对自由,并且可以随着指针的推移来改变被指向对象的值,但是直接访问却做不到。
 
任务四
改写前:
#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;
    
    
    
}

改写后
#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][0];p<&a[0][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. 程序源码中,line11改成如下形式是否可以?      可以
2. 程序源码中,line18中,*q+j和*(*q+j)分别表示什么?            *q+j表示第0行第j列的元素,*(*q+j)表示第0行第j列的元素
3. 结合line11-line12和line16-line18,理解和体会二维数组中,指向数组元素的指针变量p和指向                     
一维数组的指针变量q的不同              二维数组中指向数组元素的指针变量q的指向对象也是指针,一位数组中,q指向的是存储的具体数值。
4.ABCDEFG
 
任务五
#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;
    }

 

任务六

 

#include<stdio.h> 
#include<string.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]);
    return 0;
    }

void selectSort(char str[][20],int n){
    int i,j,k,sign;
    char temp[20]="";
    
    for(i=0;i<n-1;i++){
        k=i;
        for(j=i+1;j<n;j++){
            sign=strcmp(str[j],str[k]);
            if(sign<0)
            k=j;
        }
    
    if(k!=i){
    
    strcpy(temp,str[i]);
    strcpy(str[i],str[k]);
    strcpy(str[k],temp);
    
        }
    
    }
}

posted @ 2020-12-17 11:44  新西兰小花猪  阅读(96)  评论(1)    收藏  举报