1.利用指针将输入的多个字符串按长度升序排序 2. 在[0,100]范围生成10个随机种子为824的学生成绩。请你设计子函数实现指针法统计低于均分的情况。 3.利用指针在字符串s中的指定位置pos处

前言:学校cg作业笔记,第一题的指针数组本人也是第一次练,收获良多。第三题使用字符串函数实现,是个很巧妙的方法。第二题很基础。

1.利用指针将输入的多个字符串按长度升序排序

【问题描述】

编写一个函数,利用指针将输入的多个字符串按长度升序排序

void StrSort(char *p[N])

【输入形式】

循环输入四个字符串。每输入完一个按回车。

【输出形式】

输出排序后的四个字符串。
【样例输入】

HU
KOBE
BRYANT
CCZU
【样例输出】

HU
KOBE
CCZU
BRYANT

下面给出两种方法,第一种为冒泡排序实现的常规方法,第二种为qsort快排实现的方法,需要对qosrt有一定的了解。

话不多说,直接上代码:

//冒泡实现,冒泡的思路还是非常简单的
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 4
void StrSort(char* p[N])
{
	int i = 0,j = 0;
	for (i = 0; i < 3; i++)
		for (j = 0; j < 3 - i; j++)
			if (strlen(p[j]) > strlen(p[j + 1]))
			{
				char* tmp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = tmp;
			}
}
int main()
{
	char* p[4] = { 0 };
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		//指针数组需要开辟动态内存空间存储数据,这是个重点
		p[i] = (char*)malloc(sizeof(50));
		gets(p[i]);
	}
	StrSort(p); //引用函数
	for (i = 0; i < 4; i++)
	{
		printf("\n%s", p[i]);
	}
	return 0;
}
//qsort快排实现,函数主体只有快排一句,怎么样,是不是酷毙了?但是快排需要自己写一个
//比较函数,理解起来还是有难度的,本人就被难住了不少时间。掌握不熟练不是很推荐此方法
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int str_cmp(const void* s1,const void* s2)
{
	return strlen(*((char**)s1)) - strlen(*((char**)s2));
}
void StrSort(char* p[])
{
	qsort(p, 4, sizeof(char*), str_cmp);
}
int main()
{
	char* p[4] = { 0 };
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		//指针数组需要开辟动态内存空间存储数据
		p[i] = (char*)malloc(sizeof(50));
		gets(p[i]);
	}
	StrSort(p);
	for (i = 0; i < 4; i++)
	{
		printf("\n%s", p[i]);
	}
	return 0;
}

2.在[0,100]范围生成10个随机种子为824的学生成绩。请你设计子函数实现指针法统计低于均分的情况

【问题描述】

在[0,100]范围生成10个随机种子为824的学生成绩。请你设计子函数实现指针法统计低于均分的情况。

要求:

1、使用子函数:

void GetScore(int *p,float *avg,int
*num)//p是指向原成绩数组的指针,avg存储均分,num指针存储低于均分人数。

2、使用指针法处理数据在子函数中实现统计,不允许在子函数中输出。

3、主函数中输出

【输出形式】

输出分三行:

第一行输出原始成绩

第二行输出均分(保留一位小数)及低于均分总个数

第三行输出低于均分的成绩

【样例输出】

2 78 1 8 43 57 52 54 9 69

avg=37.3 num=4

2 1 8 9

这个题目算是3个题目中的清流,题目单纯考察同学对传参的掌握,不过题目给的有点错误,我觉得输出形式中的末尾保留一位小数应该指的是输出均分保留一位小数。

#include<stdio.h>
#include<stdlib.h>
void GetScore(int* p, float* avg, int* num)
{
	int* tmp1 = p;
	int* tmp2 = p;
	float sum = 0.0;
	int i = 0;
	for(i = 0;i<10;i++)
	{
		sum += *tmp1;
		tmp1++;
	}
	*avg = sum / 10.0;
	for (i = 0; i < 10; i++)
	{
		if(*(tmp2+i)<*avg)
			(*num)++;
	}
}
int main()
{
	srand(824);
	int i = 0,num = 0;
	int p[10] = { 0 };
	for (i = 0; i < 10; i++)
	{
		*(p + i) = rand() % 101;
	}
	float avg = 0.0;
	GetScore(p,&avg, &num);
	for (i = 0; i < 10; i++)
	{
		printf("%d ", *(p + i));
	}
	printf("\navg=%.1f num=%d\n",avg,num);
	for (i = 0; i < 10; i++)
	{
		if (*(p + i) < avg)
			printf("%d ", *(p + i));
	}
	return 0;
}

3.编写一个函数,利用指针在字符串s中的指定位置pos处

【问题描述】

编写一个函数,利用指针在字符串s中的指定位置pos处(这里插入的位置是从1开始,不是下标)插入字符串。插入的位置和内容是从键盘输入

要求:子函数 char *InsertStr(char *s,int pos,char *t)

【输入形式】

输入主串s,输入插入的子串t,输入插入位置pos。 【输出形式】

输出插入后字符串 【样例输入】

输入:

abcde

KOBE

2

【样例输出】

aKOBEbcde

这个题目博主是用字符串函数实现的,个人感觉还是比常规的将数据后移方便很多。常规方法我没有写,这里就不展示了。但感觉函数主体的部分代码可以再精简点,这个以后再修改。

#include<stdio.h>
#include<string.h>
char* InsertStr(char* s, int pos, char* t)
{
	char* tmp1 = s;
	char arr[100] = { 0 };
	char* p = NULL;
	p = tmp1 + pos - 1;
	strcpy(arr, p);
	*(tmp1+pos-1) = '\0';
	strcat(tmp1, t);
	strcat(tmp1, arr);
	return tmp1;
}
int main()
{
	char s[100] = { 0 };
	char* p1 = NULL;
	gets(s);
	char t[100] = { 0 };
	gets(t);
	int pos = 0;
	scanf("%d", &pos);
	p1 = InsertStr(s, pos, t);
	printf("%s", p1);
	return 0;
}

文末BB:对哪里有问题的朋友,可以在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给点点赞和关注.
在这里插入图片描述

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 以下是一个示例函数,可以实现输入的多个字符串按大小升序排序: ```c void sort_strings(char** strings, int num_strings) { int i, j; char* temp; for (i = 0; i < num_strings - 1; i++) { for (j = i + 1; j < num_strings; j++) { if (strcmp(strings[i], strings[j]) > 0) { temp = strings[i]; strings[i] = strings[j]; strings[j] = temp; } } } } ``` 该函数接受两个参数:一个指向字符串数组的指针字符串数组字符串的数量。它使用嵌套的循环来比较字符串并交换它们的位置,以便按升序排序。在每次比较,使用 `strcmp` 函数来比较两个字符串的大小。如果第一个字符串比第二个字符串大,则交换它们的位置。最终,字符串数组字符串将按升序排序。 ### 回答2: 要编写一个函数利用指针输入的多个字符串按大小升序排序,我们可以按照以下步骤来完成: 1. 先确定要排序字符串个数,然后动态申一个二维字符数组,用于存储输入的多个字符串。 2. 考虑使用指针,编写一个函数来比较两个字符串的大小,返回值为一个整数,表示两个字符串的大小关系。例如,如果第一个字符串比第二个字符串小,则返回负数;如果两个字符串相等,则返回0;如果第一个字符串比第二个字符串大,则返回正数。 3. 编写一个函数,用于实现冒泡排序利用第二步的比较函数来比较每个字符串的大小,并使用指针来进行交换操作,把输入的多个字符串按大小升序排列。 4. 最后,在主函数调用以上函数输入多个字符串,按大小升序排序后输出结果。 以下是可能的代码实现: ```c++ #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义字符串个数,可根据需要自定义修改 #define MAX_STR_NUM 5 // 定义字符串长度,可根据需要自定义修改 #define MAX_STR_LEN 20 // 比较函数,返回值为一个整数 // 如果第一个字符串比第二个字符串小,则返回负数 // 如果两个字符串相等,则返回0 // 如果第一个字符串比第二个字符串大,则返回正数 int str_cmp(const void* a, const void* b) { return strcmp(*(const char**)a, *(const char**)b); } // 冒泡排序函数 void bubble_sort(char** str, int str_num) { int i, j; char* temp; for (i = 0; i < str_num; i++) { for (j = 0; j < str_num - i - 1; j++) { if (str_cmp(&str[j], &str[j + 1]) > 0) { temp = str[j]; str[j] = str[j + 1]; str[j + 1] = temp; } } } } int main() { // 动态申一个二维字符数组 char** str = (char**)malloc(MAX_STR_NUM * sizeof(char*)); int i, str_num; printf("输入字符串个数(不大于%d):\n", MAX_STR_NUM); scanf("%d", &str_num); if (str_num > MAX_STR_NUM) { printf("输入字符串个数不得大于%d!\n", MAX_STR_NUM); exit(1); } printf("输入%d个长度不超过%d的字符串(以空格隔开):\n", str_num, MAX_STR_LEN - 1); for (i = 0; i < str_num; i++) { str[i] = (char*)malloc(MAX_STR_LEN * sizeof(char)); scanf("%s", str[i]); } // 调用冒泡排序函数 bubble_sort(str, str_num); printf("按大小升序排序后的字符串为:\n"); for (i = 0; i < str_num; i++) { printf("%s ", str[i]); } printf("\n"); // 释放动态申的空间 for (i = 0; i < str_num; i++) { free(str[i]); } free(str); return 0; } ``` 以上代码,我们使用了qsort函数来自动排序,还可以使用其他的快速排序,如归并排序等。 ### 回答3: 题目要求编写一个函数实现输入多个字符串并按照大小升序排序。为了方便理,我们可以将这些字符串存储在一个字符数组,并且每个字符串之间用空字符 '\0' 分开。 接下来,我们就可以开始编写函数了。根据题目的要求,我们需要利用指针实现字符串排序。因此,我们需要先定义一个指向字符数组的指针,用来指向数组的首地址。 然后,我们需要编写一个 for 循环来遍历字符数组,并比较每个字符串之间的大小。在比较完成过后,我们需要进行数据的交换,以实现字符串排序。 在排序完成后,我们就可以输出排序后的结果,即按照大小升序排列的字符串数组。 下面是具体实现: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 1000 void sort(char *arr[], int n); int main() { char strs[MAX_LEN]; char *arr[MAX_LEN]; int i = 0; printf("输入多个字符串,按照回车分割,输入 exit 退出:\n"); while (fgets(strs, MAX_LEN, stdin) != NULL) { strs[strlen(strs) - 1] = '\0'; // 去掉换行符 if (strcmp(strs, "exit") == 0) { break; } arr[i] = (char *) malloc(strlen(strs) + 1); // 分配内存 strcpy(arr[i], strs); // 将字符串复制到动态分配的内存 i++; } sort(arr, i); // 排序 printf("\n排序后的字符串数组为:\n"); for (int j = 0; j < i; j++) { printf("%s\n", arr[j]); free(arr[j]); // 释放内存 } return 0; } void sort(char *arr[], int n) { char *temp; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (strcmp(arr[j], arr[j + 1]) > 0) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } ``` 上面的代码,我们使用了一个字符数组 `strs` 来暂存每个输入字符串,如果输入字符串为 "exit" 则退出程序。然后,我们将每个字符串动态分配内存,并将它们存储到一个字符指针数组 `arr` 。 在 `sort` 函数,我们使用了冒泡排序来对字符串进行排序。最后,我们输出排序后的字符串数组,然后释放内存。 以上就是按照题目要求编写的函数实现过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

溪读卖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值