PTA实验七——指针

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值