程序设计第八周

编写一个函数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;
}
//

猜你喜欢

转载自blog.csdn.net/weixin_68798281/article/details/130138844
今日推荐