实验五

Task 1-1

#include <stdio.h>
#define N 5
void output(int x[], int n);
int main()
{
	int x[N] = {9, 55, 30, 27, 22};
	int i;
	int k; 
	int t; 
	printf("original array:\n");
	output(x, N);
	k = 0;
	for(i=1; i<N; ++i)
		if(x[i] > x[k])
			k = i;
	if(k != N-1)
	{
		t = x[N-1];
		x[N-1] = x[k];
		x[k] = 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");
}

Task 1-2

#include <stdio.h>
#define N 5
void output(int x[], int n);
int main()
{
	int x[N] = {9, 55, 30, 27, 22};
	int i;
	int 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");
}

答:

task1-1.c实现方式中,相较于原始数组,发生数组元素值交换是1次 

task1-2.c实现方式中,相较于原始数组,发生数组元素值交换的是3次

Task 2

#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;
}

Task 3-1

#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); // 调用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)// 找到最小元素后,交换a[i]和a[k]
		{ 
			temp = a[i];
			a[i] = a[k];
			a[k] = temp;
		}
	}
}

Task 3-2

#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);
	printf("按字典序输出名单:\n");
	for (i = 0; i < N; i++)
		printf("%s\n", name[i]);
	return 0;
}
void selectSort(char str[][20], int n)
{
	int k;
	char temp[20];
	for(int i=0;i<n-1;i++)
	{
		k=i;
		for(int j=i+1;j<n;j++)
			if(strcmp(str[j],str[k])<0)
				k=j;
		if(k!=i)
		{
			strcpy(temp,str[k]);
			strcpy(str[k],str[i]);
			strcpy(str[i],temp);
		}
	}			
}

Task 4

#include <stdio.h>
int main()
{
	int n;
	int *pn;
	n = 42;
	pn = &n;
	printf("&n = %#x, n = %d\n", &n, n);
	printf("&pn = %#x, pn = %#x\n", &pn, pn);
	printf("*pn = %d\n", *pn);
	return 0;
}

① 整型变量n的地址是0x62fe1c;变量n里存放的数是42.

② 指针变量pn的地址是0x62fe10;变量pn里存放的是n的地址0x62fe1c.

③ 通过 *pn 间接访问的是n中存放的数字42.

Task 5

#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;
	for(i=0; i<N; ++i)
		printf("p+%d = %#x, *(p+%d) = %d\n", i, p+i, i, *(p+i));
	return 0;
}

① 通过 a[i] 和 *(p+i) 都可以访问到数组元素a[i].

② 通过 &a[i] 和 p+i 都可以获得元素a[i]的地址. 

  

 

  

 

  

 

  

 

 

 

  

 

  

posted on 2021-12-13 16:54  黄爽  阅读(13)  评论(1编辑  收藏  举报