实验五

task1.

#include<stdio.h>
#define N 5
void output(int x[],int n);
int main()
{
int x[N]={9,55,30,27,22}; int i,k,t; printf("original array:\n"); output(x,N); k=0; for(i=1;i<N;++i) if(x[i]>x[k]) k=i;//找出这组数中最大的的元素x[k] if(k!=N-1) {
t
=x[N-1]; x[N-1]=x[k]; x[k]=t;//如果x[k]不是最后一个元素,就和最后一个元素交换 } printf("after swapped:\n"); output(x,N); return 0; }
void output(int x[],int n) {
int i; for(i=0;i<n;++i) printf("%d ",x[i]); printf("\n"); }

 

 

 

 

#include <stdio.h>
#define N 5
void output(int x[], int n);
int main()
{
int x[N] = {9, 55, 30, 27, 22};
int i,t;  
printf("original array:\n");
output(x, N);
for(i=0; i<N-1; ++i)
if(x[i] > x[i+1])
 {
 t = x[i];
 x[i] = x[i+1];
 x[i+1] = t;
 }
printf("after swapped:\n");
output(x, N);
return 0;
}
void output(int x[], int n)
{
int i;
for(i=0; i<n; ++i)
  printf("%d ", x[i]);
printf("\n");
}

 

 

 1.1中只交换一次,1.2中交换了三次。区别:1.1中先找出数组所有元素中最大的元素x[k],如果x[k]不在最后,将它与最后一个元素交换;1.2中类似于冒泡排序,依次比较前后两个元素,最终将最大的元素沉到数组最后。

 

task2.

#include <stdio.h>
#define 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,5,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;
}

 

 

 

 task3.

#include <stdio.h>
#define N 5
void selectSort(int a[], int n);
void input(int a[], int n);
void output(int a[], int n);
int main()
{
 int a[N];
 printf("输入%d个整数\n", N);
 input(a, N);
 printf("排序前的数据:\n");
 output(a, N);
 selectSort(a, N); 
 printf("排序后的数据:\n");
 output(a, N);
 return 0;
}

void input(int a[], int n)
{
 int i;
 for (i = 0; i < n; i++)
    scanf("%d", &a[i]);
}

void output(int a[], int n)
{
  int i;
  for (i = 0; i < n; i++)
    printf("%d ", a[i]);
  printf("\n");
}

void selectSort(int a[], int n)
{
 int i, j, k, temp;
 for (i = 0; i < n - 1; i++)
 {
   k = i; // k用于记录当前最小元素的下标
   for (j = i + 1; j < n; j++)
   if (a[j] < a[k])
   k = j; // 如果a[j]比当前最小元素还要小,就更新k,确保它总是存放最小元素的下标
   if (k != i)
   {            
    temp = a[i];
    a[i] = a[k];
    a[k] = temp;// 找到最小元素后,交换a[i]和a[k]
   }
  }
}

 

#include <stdio.h>
#include<string.h>
#define 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); // 调用选择法对name数组中的字符串排序
 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;
 char t[100]; 
 for(i=0;i<n-1;i++)
 {
  k=i;
  for(j=i+1;j<n;j++)
  {
   if(strcmp(str[j],str[k])<0)
   k=j;
   if(k!=i)
   {
    strcpy(t,str[k]);
    strcpy(str[k],str[i]);
    strcpy(str[i],t);
   }
  }
 }
}

task4.

 

#include<stdio.h>
int main()
{
    int n=42;
    int *pn;
    pn=&n;
    printf("&n=%#x,n=%d\n",&n,n);
    printf("&pn=%#x,pn=%#x\n",&pn,pn);//%x表示以十六进制输出,#表示显示前导符0x 
    printf("*pn=%d\n",*pn);
    return 0;
}

 

整型变量n的地址:0x 62fe1c;变量n里存放的数:42;

指针变量pn的地址:0x 62fe10;pn里存放的是:n的地址&n;

*pn间接访问的是n里存放的数。

task5.

#include<stdio.h>
#define N 5
int main()
{
    int a[N]={1,9,2,0,7};
    int i;
    int *p;
    for(i=0;i<N;i++)
      printf("&a[%d]=%#x,a[%d]=%d\n",i,&a[i],i,a[i]); 
    printf("\n");
    for(i=0;i<N;i++)
      printf("a+%d=%#x,*(a+%d)=%d\n",i,a+i,i,*(a+i));
    printf("\n");
    p=a;//指针变量p存放数组a的首地址 
    for(i=0;i<N;i++)
      printf("p+%d=%#x,*(p+%d)=%d\n",i,p+i,i,*(p+i));
    return 0;
}

可以,可以。

 

 

posted @ 2021-12-14 22:43  玥浅浅  阅读(56)  评论(0编辑  收藏  举报