编写一个函数void fun(int *p, int n),其功能为对整数数组p[5]中的数字进行排序。排序结果在主函数中输出。 输入: 34 78 23 12 69 输出如下: 78,69,34,23,12
注意:输入数字之间用一个空格分隔
#include<stdio.h>
void fun(int *p, int n);
int main()
{
int arr[5] = {0};
int i;
for(i = 0; i < 5; i++)
{
scanf("%d",&arr[i]);
}
int* p = arr;
fun(p, 5);
for(i = 0; i < 5; i++)
{
if(i == 0)
{
printf("%d",arr[i]);
}
else
{
printf(",%d",arr[i]);
}
}
return 0;
}
void fun(int *p, int n)
{
int i,j;
// 这里使用冒泡排序了
for(i = 0; i < n;i++)
for(j = 0; j < ( n - i - 1); j++)
{
if(*(p + j) < *(p + j + 1))
{
// 小的往后移动
int temp = *(p + j);
*(p + j) = *(p + + j + 1);
*(p + j + 1) = temp;
}
}
}
编写函数,使用指针传递实现三个整数的从大到小排序。
编写主函数,输入三个整数,调用函数排序,输出三个从大到小排序的整数。
输入:三个整数,用空格隔开
输出,三个整数,从大到小,用一个空格隔开。
【输入输出样例】
输入:
1 2 3
输出:
3 2 1
注意,本题的关键是要用函数实现三个数的排序,用指针,不用数组。
#include<stdio.h>
void sort(int* n1, int* n2, int* n3);
int main()
{
int n1, n2, n3;
int *p1 = &n1;
int *p2 = &n2;
int *p3 = &n3;
scanf("%d%d%d",p1,p2,p3);
sort(p1,p2,p3);
printf("%d %d %d",n1,n2,n3);
return 0;
}
void sort(int* n1, int* n2, int* n3)
{
int temp;
// 找出第一个最大的
if(*n1 < *n2)
{
temp = *n1;
*n1 = *n2;
*n2 = temp;
}
// 经过这样后,n2存储的值有可能比n1大
if(*n2 < *n3)
{
temp = *n2;
*n2 = *n3;
*n3 = temp;
}
//
if(*n1 < *n2)
{
temp = *n1;
*n1 = *n2;
*n2 = temp;
}
}
若有n个数,循环右移一位指每个数移到相邻的右边一个位置,最右边的数移到最左边。如由数1,2,3,4,5;循环右移一位的结果为5,1,2,3,4。
编写函数,实现数组元素的循环右移k位。如有数组元素1,2,3,4,5右移3位的 结果为3,4,5,1,2。
编写主函数输入若干元素和右移位数,调用函数右移,在主函数中输出结果。元素个数不超过100.
输入:两行,第1行为若干用空格分隔的整数,以9999表示结束;第2行一个整数,表示右移的位数。
输出:一行,移位的结果,用一个空格隔开,末尾无空格。
【输入输出样例】
输入:
1 2 3 4 5 9999
3
输出:
3 4 5 1 2
#include<stdio.h>
void move(int* arr, int n,int len);
int main()
{
int num[100];
int n = 0; // 输入的个数
int temp;
while(1)
{
scanf("%d",&temp);
if(temp == 9999)
{
break;
}
num[n] = temp;
n++;
}
// 右移动的位数
int count;
scanf("%d",&count);
move(num,count,n);
int i;
for(i = 0; i < n; i++)
{
if(i == 0)
{
printf("%d",num[i]);
}
else
{
printf(" %d",num[i]);
}
}
return 0;
}
// n 移动位数 len :数组长度
void move(int* arr, int n, int len)
{
int k;
for(k = 0; k < n; k++)
{
// 移动的逻辑
int i;
// 定义一个变量来容纳最后的一个元素
int temp = arr[len - 1];
for(i = len - 1; i > 0; i--)
{
//swap(arr + i ,arr + i - 1);
*(arr + i) = *(arr + i - 1);
}
// 把最后一个元素放到第一个去
*arr = temp;
}
}
写一个函数int slen(char *s),返回值为字符串s的长度。要求在主函数中输入一个长度不大于20的字符串,调用函数slen,输出字符串对应的长度。
输入:
hello world
输出:
11(空格算作有效字符)
#include<stdio.h>
int slen(char *s);
int main()
{
char s[20];
gets(s);
int len = slen(s);
printf("%d",len);
return 0;
}
int slen(char* s)
{
int count = 0;
while(*s != '\0')
{
count++;
s++;
}
return count;
}
写一个函数int strcmp(char *p1, char *p2)用来实现两个字符串的比较。在主函数中输入两个字符串,输出对应的结果。
输入:
hello
world
则输出:-1
输入:
world
hello
则输出1
输入:
hello
hello
则输出:0
#include<stdio.h>
int strcmp(char *p1, char *p2);
int main()
{
char s1[100];
char s2[100];
gets(s1);
gets(s2);
int res = strcmp(s1,s2);
printf("%d",res);
return 0;
}
int strcmp(char *p1, char *p2)
{
while((*p1 != '\0') && (*p2 != '\0'))
{
if(*p1 > *p2)
{
return 1;
}
if(*p1 < *p2)
{
return -1;
}
p1++;
p2++;
}
// 到结尾了还没有匹配,但是还是有长度不一致的情况
if(*p1 == '\0' && *p2 == '\0')
{
return 0;
}
else if(*p1 == '\0')
{
return -1;
}
else
{
return 1;
}
}
编写函数,将字符串s1中从第n个字符开始的最多k个字符复制到字符串s2中。最多的意思是如果s1从n开始的字符不够k个,则复制到末尾为止。如s1="study",n=4,k=5,则只复制“dy”两个字符。函数返回s2的首地址。函数原型为:
char * copykn(char *s1,char *s2,int n,int k)
编写主函数,输入字符,n和k,调用函数复制,输出结果字符串。主函数为:
int main()
{
char s1[100],s2[100];
int n,k;
gets(s1);
scanf("%d %d",&n,&k);
puts(copykn(s1,s2,n,k));
return 0;
}
【输入输出样例】
输入:
communication
2 3
输出:
omm
#include<stdio.h>
char * copykn(char *s1,char *s2,int n,int k);
int main()
{
char s1[100] = "";
char s2[100] = "";
// 这里需要赋初值,为什么我不清楚
int n,k;
gets(s1);
scanf("%d %d",&n,&k);
puts(copykn(s1,s2,n,k));
return 0;
}
char * copykn(char *s1,char *s2,int n,int k)
{
//多的意思是如果s1从n开始的字符不够k个,则复制到末尾为止
s1 = s1 + (n - 1);
int i;
char * res = s2; // 这里要小心,直接使用s2 的话,返回的就不是s2的首字母地址了
for(i = 0; i < k; i++)
{
*res = *s1;
res++;
s1++;
if(*s1 == '\0')
{
break;
}
}
return s2;
}
有一段文字(文字长度小于200),其中有若干整数。编写函数,找出其中的整数,存入一个数组中。函数原型为:
int findint(char *s,int *a);
其中s表示带数字的字符串,a表示存整数的数组,返回值为字符串中的整数个数。字符串中只有大于等于0的整数。
编写主函数,输入字符串,调用函数识别整数,逆序输出它们。例如,输入字符串“The Wandering Earth exhibition at the China Science and Technology Museum in Beijing, April 4, 2019.”识别数字,输出“2019,4”。
输入:带空格字符串
输出:若干整数,用逗号隔开。
【输入输出样例】
输入:
he Wandering Earth exhibition at the China Science and Technology Museum in Beijing, April 4, 2019.
输出:
2019,4
题目延伸:(1)如果字符串中有负整数,如何修改程序。(2)如果字符串中是实数,如何编写程序
#include<stdio.h>
int findint(char *s,int *a);
int main()
{
char s[200];
int n[10] = {0};
gets(s);
int count = findint(s,n);
int i;
for(i = count -1 ; i >= 0; i--)
{
if(i == count - 1)
printf("%d",n[i]);
else
{
printf(",%d",n[i]);
}
}
return 0;
}
int findint(char *s,int *a)
{
int cunt = 0; // 用来记录用来里面有多少个整数
char* str; // 用来装一个数字
int flag = 0; // 用来标记首字母已经被锁定
int *temp = a;
int numCount = 0; // 数字的字数
while(*s != '\0')
{
if('0' <= *s && *s <= '9')
{
str = s;
int index = 0;
// 统计数字出现的长度
while( *s != '\0' && ( *(s + 1) >= '0' && *(s + 1) <= '9'))
{
index++;
s++;
}
int res = 0;
int i;
for(i = 0; i <= index; i++)
{
res = (*(str + i) - '0') + res * 10;
}
//printf("%d",res);
*temp = res;
temp++;
numCount++;
}
s++;
}
return numCount;
}
字符串排序,就象单词的字典排序。'a'<'b'等等。
编写函数,实现字符串的排序(从小到大),不区分大小写。函数原型为:
void sortstring(char **r,int n);
其中r表示字符串首地址数组的首地址,n表示字符串个数。字符串的首地址放在字符指针数组中,r是这个指针数组的首地址。
编写主函数,输入n和n个单词,调用函数拍序,在主函数中输出排序的单词,每个一行。每个单词的长度不超过20个字符。
【输入输出样例】
输入:
5
study
student
sting
STRING
STRAY
输出:
sting
STRAY
STRING
student
study
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void sortstring(char **r,int n);
int main()
{
int n;
scanf("%d",&n);
char** r;
r = (char**) malloc(n * sizeof(char *));
int i;
for(i = 0; i < n; i++)
{
r[i] = (char *) malloc(21 * sizeof(char));
scanf("%s",r[i]);
}
sortstring(r,n);
for(i = 0; i < n; i++)
{
printf("%s\n",r[i]);
}
for(i = 0; i < n; i++)
{
free(r[i]);
}
free(r);
return 0;
}
// 这里就要调用前面作业中写的一个比较两个字符串的函数了
// 或者也可以调用库函数,偷个懒,调用库函数
void sortstring(char **r,int n)
{
int i;
int j;
char* temp;
for(i = 0; i < n - 1; i++)
{
for(j = 0; j < n - i - 1; j++)
{
if(strcasecmp(r[j],r[j+1]) > 0)
{
temp = r[j];
r[j] = r[j + 1];
r[j + 1] = temp;
}
}
}
}
编写程序,输入正整数n和n个学生的学号和三门课程成绩,计算每个人的平均分,按平均分从小到大排序,输出排序结果。学号的长度不超过10位;三门课程成绩为整数;平均成绩为实数,输出平均成绩保留两位小数;学生人数不超过50人。
提示:请用多个函数实现。
【输入输出样例】
输入:
5
001 80 80 80
002 60 70 80
003 80 90 93
004 50 60 70
005 60 70 83
输出:
004 50 60 70 60.00
002 60 70 80 70.00
005 60 70 83 71.00
001 80 80 80 80.00
003 80 90 93 87.67
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
char id[11];
int score[3]; // 三门分数
double vgrade; // 平均成绩
}Student;
// 计算所有学生的平均成绩
void caclAvg(Student *stu,int n)
{
int i, j;
for(i = 0; i < n; i++)
{
double sum = 0;
for(j = 0; j < 3; j++)
{
sum += stu[i].score[j];
}
stu[i].vgrade = sum / 3.0;
}
}
void sortByAvg(Student *stu, int n)
{
int i, j;
for(i = 0; i < n; i++)
for(j = 0; j < n - i -1 ; j++)
{
if(stu[j].vgrade > stu[j + 1].vgrade)
{
Student temp = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = temp;
}
}
}
int main()
{
int n;
scanf("%d",&n);
Student *stu = (Student*) malloc(n * sizeof(Student));
int i;
for(i = 0; i < n; i++)
{
scanf("%s%d%d%d",stu[i].id,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
}
caclAvg(stu,n);
sortByAvg(stu,n);
for(i = 0; i < n; i++)
{
printf("%s %d %d %d %.2f\n", stu[i].id, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].vgrade);
}
free(stu);
return 0;
}
//