PTA实验七——指针
7-1 在数组中查找指定元素
输入一个正整数repeat (0<repeat<10),做repeat次下列运算:
输入一个正整数 n (1<n<=10),然后输入n个整数存入数组a中,再输入一个整数x,在数组a中查找x,如果找到则输出相应元素的最小下标,否则输出"Not found"。
要求定义并调用函数search(list, n, x),它的功能是在数组list中查找元素x,若找到则返回相应元素的最小下标,否则返回-1,函数形参 list 的类型是整型指针,形参n和x的类型是int,函数的类型是int。
输出格式语句:printf(“index = %d\n”, );
输入输出示例:括号内为说明,无需输入输出
输入样例:
2 (repeat=2)
3 (n=3)
1 2 -6
2 (x=2)
5 (n=5)
1 2 2 5 4
0 (x=0)
输出样例:
index = 1
Not found
代码:
#include<stdio.h>
int search(int *list,int n,int x)
{
int i=0;
for(i=0;i<n;i++)
{
if(list[i]==x)
{
return i;
}
}
return -1;
}
int main()
{
int repeat=0,a[11]={0},x,n,j;
scanf("%d",&repeat);
for(;repeat>0;repeat--)
{
scanf("%d",&n);
for(j=0;j<n;j++)
{
scanf("%d",&a[j]);
}
scanf("%d",&x);
int result=search(a,n,x);
if(result!=-1)
{
printf("index = %d\n",result);
}
else
{
printf("Not found\n");
}
}
return 0;
}
7-2 矩阵转置
用指针实现将一个3*3的整型矩阵转置。
要求定义并调用函数void move(int *pointer),实现上述矩阵转置的功能。
输出格式:每行数据之间以空格分隔,最后一个数据后面没有空格
输入样例:
1 2 3
4 5 6
7 8 9
输出样例:
1 4 7
2 5 8
3 6 9
代码:
#include<stdio.h>
void move(int pointer[3][3])
{
int i, j, temp;
for(i = 0; i < 3; i++)
{
for(j = i + 1; j < 3; j++)
{
temp = pointer[i][j];
pointer[i][j] = pointer[j][i];
pointer[j][i] = temp;
}
}
}
int main()
{
int arr[3][3] = {0}, i, j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
scanf("%d", &arr[i][j]);
}
}
move(arr);
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%d", arr[i][j]);
if(j<2)
printf(" ");
}
if(i<2)
printf("\n");
}
return 0;
}
7-3 利用指针返回多个函数值
读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。
输入格式:
输入有两行:
第一行是n值;
第二行是n个数。
输出格式:
输出最大值和最小值。
输入样例:
在这里给出一组输入。例如:
5
8 9 12 0 3
输出样例:
在这里给出相应的输出。例如:
max = 12
min = 0
代码:
#include <stdio.h>
void max_min(int *max, int *min, int *num, int n)
{
int i, max1 = num[0], min1 = num[0];
for (i = 1; i < n; i++)
{
if (max1 < num[i])
max1 = num[i];
if (min1 > num[i])
min1 = num[i];
}
*max = max1;
*min = min1;
}
int main()
{
int n = 0, num[101] = {0}, max = 0, min = 0, i;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
max_min(&max, &min, num, n);
printf("max = %d\nmin = %d\n", max, min);
return 0;
}
7-5 最大和最小
请使用指针法(间接访问)编写程序,程序的功能是从键盘输入 10 个数,求其最大值和最小值的差。
输入格式:
输入10个整数
输出格式:
无
输入样例:
1 2 3 4 5 6 7 8 9 10
输出样例:
9
代码:
#include<stdio.h>
int difference(int* num)
{
int i=0,min=num[0],max=0;
for(i=0;i<10;i++)
{
if(num[i]<min)
min=num[i];
if(num[i]>max)
max=num[i];
}
return max-min;
}
int main()
{
int num[10]={0},j=0;
for(j=0;j<10;j++)
{
scanf("%d",&num[j]);
}
printf("%d",difference(num));
return 0;
}
7-6 求矩阵每行元素的和
本题要求编写程序,使用指针方式求一个给定的m×n矩阵各行元素之和。
输入格式:
输入第一行给出两个正整数m和n(1≤m,n≤6),再输入m行数据,每行n个整数,每个整数之间用空格分隔。
输出格式:
输出m个整数,每行1个数。
输入样例:
2 3
1 2 3
4 5 6
输出样例:
6
15
代码:
#include <stdio.h>
int f_sum(int* num, int n)
{
int sum = 0;
for (int j = 0; j < n; j++)
{
sum += num[j];
}
return sum;
}
int main()
{
int m, n;
scanf("%d%d", &m, &n);
int num[10][6] = {0};
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &num[i][j]);
}
}
for (int i = 0; i < m; i++)
{
printf("%d\n", f_sum(num[i], n));
}
return 0;
}
7-7 字符串的连接
本题要求编写程序,使用指针方式实现两个字符串的连接(不能使用strcat函数),并将连接后的字符串输出。
输入格式:
输入一行以回车结束的非空字符串(不超过40个字符),再输入一行以回车结束的非空字符串(不超过40个字符)。
输出格式:
一行输出俩字符串连接后新的字符串。
输入样例:
Beijing_
China
输出样例:
Beijing_China
代码:
#include<stdio.h>
#include<string.h>
void strcat1(char* str1, char* str2, char* str3)
{
int i = strlen(str1), n=strlen(str2),j = 0, k = 0;
for (j = 0; j < i; j++)
str3[j] = str1[j];
for (k = 0; k < n; k++)
str3[j + k] = str2[k];
str3[j + k] = '\0';
}
int main()
{
char str1[41] = { 0 };
char str2[41] = { 0 };
char str3[82] = { 0 };
gets(str1);
gets(str2);
strcat1(str1, str2, str3);
puts(str3);
return 0;
}
7-8 实数排序
本题要求编写程序,输入n个实数,使用指针引用的方式将它们按从大到小的顺序排列。
输入格式:
输入第一行给出一个正整数n(2≤n≤10),输入第二行给出n个实数,其间以空格分隔。
输出格式:
输出从大到小排好序的n个数(保留2位小数),每个数之间空一格,行末没有空格。
输入样例:
在这里给出一组输入。例如:
5
3.2 5.4 6.12 2.51 4.23
输出样例:
在这里给出相应的输出。例如:
6.12 5.40 4.23 3.20 2.51
代码:
#include<stdio.h>
void choose(float* num, int n)
{
int i = 0,max,j;
float temp;
for (i = 0; i < n; i++)
{
max = i;
for (j = i + 1; j < n; j++)
{
if (num[max] < num[j]) max = j;
temp = num[i];
num[i] = num[max];
num[max] = temp;
}
}
}
void bud(float* num, int n)
{
int i, j;
float min = num[0];
float max = num[0];
float temp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (num[j] < num[j + 1])
{
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
}
void quick(float* num, int left, int right)
{
if (left >= right)
return;
int i = left, j = right;
float key = num[left];
while (i < j)
{
while (i < j && num[j] <= key)
{
j--;
}
while (i < j && num[i] >= key)
{
i++;
}
float temp = num[i];
num[i] = num[j];
num[j] = temp;
}
num[left] = num[i];
num[i] = key;
quick(num, left, i - 1);
quick(num, i + 1, right);
}
int main()
{
int n = 0, i;
float num[11] = { 0 };
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%f", &num[i]);
}
//bud(num, n);//冒泡排序
//quick(num, 0, n - 1);//快速排序
choose(num, n);//选择排序
for (i = 0; i < n; i++)
{
printf("%.2f", num[i]);
if (i < n - 1)
printf(" ");
}
return 0;
}
7-9 使用函数实现字符串复制
输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算:
输入一个字符串 t 和一个正整数 m,将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,再输出字符串 s。
要求定义并调用函数 strmcpy(s,t,m), 它的功能是将字符串 t 中从第 m 个字符开始的全部字符复制到字符串 s 中,函数形参s和t的类型是字符指针,形参m的类型是int,函数类型是void。
输入输出示例:括号内为说明,无需输入输出
输入样例:
3 (repeat=3)
happy new year
7
happy
1
new
4
输出样例:
new year (从"happy new year"第7个字符开始组成的新字符串为"new year")
happy (从"happy"第1个字符开始组成的新字符串为"happy")
error input ("new"的长度小于4)
代码:
#include <stdio.h>
#include <string.h>
#pragma warning (disable:4996)
void strmcpy(char* s, char* t, int m)
{
int i, k;
for (i = m - 1, k = 0; i < strlen(t); i++, k++)
{
s[k] = t[i];
}
s[k] = '\0';
puts(s);
}
int main()
{
int repeat, i, m;
char t[101], s[101] = { 0 };
scanf("%d", &repeat);
for (i = 0; i < repeat; i++)
{
scanf(" %[^\n]", t);
scanf("%d", &m);
if (m <= 0 || m > strlen(t))
{
printf("error input\n");
continue;
}
else
{
strmcpy(s, t, m);
}
}
return 0;
}
7-10 冒泡
鸿鸿哥最近学习了指针,感觉这个知识点有点难以理解,于是想要通过编程实践来掌握它。鸿鸿哥以前学习数组(第7章)的时候已经掌握了冒泡排序的一般写法,现在他想用指针来实现排序的功能函数。但是他遇到了困难,你能帮帮他吗?
指针实现冒泡排序函数,函数名统一用void bubbleSort(int *p,int c)。
具体方法自己实现。
输入格式:
一组输入,第一行是待排数据个数n, 第二行是数据的具体值。
输出格式:
输出排序后的数,两个数之间以空格间开,最后一个数字末尾有空格
输入样例:
在这里给出一组输入。例如:
5
503 87 512 61 908
输出样例:
在这里给出相应的输出。例如:
61 87 503 512 908
代码:
#include<stdio.h>
void bubbleSort(int *p, int c)
{
int i, j;
for(i = 0; i < c - 1; i++)
{
for(j = 0; j < c - i - 1; j++)
{
if(p[j] > p[j + 1])
{
int temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
}
int main()
{
int n = 0, num[101] = {0}, i;
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &num[i]);
}
bubbleSort(num, n);
for(i = 0; i < n; i++)
{
printf("%d ", num[i]);
}
return 0;
}