前言:学校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:对哪里有问题的朋友,可以在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给点点赞和关注.