实验五
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; }
可以,可以。