实验五:还行吧

实验五

实验任务1

程序源代码

#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.C语言中,二维数组在内存中是连续存放的(每个地址间差4)

2.等价(运行结果相同)

 

实验任务2

程序源代码

#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][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.是

3.是

其中我由于一不小心手滑把

&a[i][a[i][j]]打成了&a[i][j,a[i][j])结果也能正常运行(仅限于我这个版本的Windows 10(HP color),部分window10不能正常运行)
不是语法糖而是,和2个%d的共同问题

实验任务3

程序源代码


#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在使用时指向的地址确定

因为每次p都被重新赋值为数组,而数组原来的元素被新的元素所覆盖

2.line12-13:指针变量p指向元素a[N]所在的地址.

  line16-17:指针变量p指向元素a[N]所在的地址。

3.line22-27:指针变量指向a所在的地址

 line26-27:指针变量指向a所在的地址

4.通过指针变量可以用不同的方式间接访问一维数组

比如说单纯的对地址用循环语句等价于对不改变原来的地址但再加上一个数使地址整体发生变化,而数组是特殊的指针,有时也可以用数组来表示指针,

而直接访问则明显受限于方法,在访问多个数据时存在不便。

实验任务4

源代码

#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\n",p);
    printf("\n");
    
    for(q=a;q<a+2;q++)
       for(j=0;j<3;j++)
         printf("%d\n",*(*q+j));
    printf("\n");
    
    
    return 0;
    } 

运行结果

1.改程序后运行结果

运行结果一样,可以

2.line18中,*q+j表示指针*q指向元素a[j]

*(*q+j)表示以a[j]为地址,以这些地址为元素的指针

3.指向数组元素的指针变量p指向的只是单一的数组元素,而指向一维数组的指针则指向的是整个数组

4.ABCDEFG(对E要特别注意,是先加一行后在加2列)

 

实验任务5

(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);
    
    // 调用函数binarySearch()在数组a中查找指定数据项key,并返回查找结果给index
    // 补足代码① 
    index= binarySearch(a, N, key) ;
    
    if(index>=0) 
        printf("%d在数组中,下标为%d\n", key, index);
    else
        printf("%d不在数组中\n", key); 
   
   return 0;
}

//函数功能描述:
//使用二分查找算法在数组x中查找特定值item,数组x大小为n 
// 如果找到,返回其下标 
// 如果没找到,返回-1 
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 (item==x[mid])
            return mid;
        else if(item<x[mid])
            high = mid - 1;
        else
            low = mid + 1;
    }
    
    return -1;
}

运行结果

(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);
    
    // 调用函数binarySearch()在数组a中查找指定数据项key,并返回查找结果给index
    // 补足代码① 
    index=binarySearch(a, N, key) ;
    
    if(index>=0) 
        printf("%d在数组中,下标为%d\n", key, index);
    else
        printf("%d不在数组中\n", key); 
   
   return 0;
}

//函数功能描述:
//使用二分查找算法在从x中查找特定值item,数组x大小为n 
// 如果找到,返回其下标 
// 如果没找到,返回-1 
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 ( item == *(x+mid) )
        {
                return *(x+mid);
            break;}
        else if(item < *(x+mid))
             high=mid-1;
        else
            low=mid+1;
            
    }
    return -1;
}
    

运行结果

 

实验任务6

源代码

#include <stdio.h>

const int N = 5;

void selectSort(char str[][20], int n ); // 函数声明,形参str是二维数组名
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); // 调用选择法对name数组中的字符串排序

printf("按字典序输出名单:\n");
for(i=0; i<N; i++)
printf("%s\n", name[i]);

return 0;
}

// 函数定义
// 函数功能描述:使用选择法对二维数组str中的n个字符串按字典序排序
void selectSort(char str[][20], int n) {
int i,j,k,m,a,b;
char temp[20];
for(i=0;i<n-1;i++){

for(j=i+1;j<n;j++){
k=i;
if(str[i][0]>str[j][0])
k=j;
else
if(str[i][0]==str[j][0]&&str[i][j]>str[j][1])
k=j;


if(k!=i)
{
for(a=0;a<20;a++){


temp[a]=str[i][a];
str[i][a]=str[k][a];
str[k][a]=temp[a];}

}}}
}

运行结果

而我纠结了最长的程序的运行结果

原来是忘加了k=i导致前面Bob和Bill几乎没动......当然还有括号的问题

五.实验总结

1.在本次实验中我学到了指针应用的灵活性与多样性

2.主要大坑上面都有提到

3.个人感觉自己还是没法跳出既定的思维陈式,对某些C语言的运算还不是很熟练,还是以后多上机操作吧。尤其是数组与循环语句,简直就是永远的神。

4.关于二维数组理解地更深一步

谢谢所有看到最后的人!

posted @ 2020-12-13 17:43  怅望灰天的小奇  阅读(113)  评论(2)    收藏  举报