赞
踩
编写一个函数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;
- }
- //
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。