XJTU大计基第十二周编程作业

1.
结构体和排序【选做】

________________________________________
定义包含学号、姓名和成绩的学生信息结构类型,完成以下功能:
(1)键盘输入n个学生信息数据(n从键盘输入);
(2)使用“冒泡法”对学生成绩由高到低排序;
(3)输出排序后学生信息。
输入输出样例如下,数据间以空格分隔。
输入样例:
3
100001 wang-li 91
100002 chen-da-wei 95
100003 guo-tao 93
输出样例:
100002 chen-da-wei 95
100003 guo-tao 93
100001 wang-li 91

________________________________________
样例输入:
2
111111 wang 78
222222 liu 100
样例输出:
222222 liu 100
111111 wang 78

2.
最大值排在中间,最小值排在最左,中值排在最右的排序

________________________________________
从键盘输入奇数个整型数(大于3),对该整数序列按如下规则排序:最大值排在中间,最小值排在最左,中值排在最右,其它值清为0。
输以空格隔开
定义排序函数原型为:void booble(int *array,int n);
运行样例如下所示:
输入
5
1 2 3 4 5
输出
1 0 5 0 3

________________________________________
样例输入:
7
10 1 1 100 0 0 5
样例输出:
0 0 0 100 0 0 1

#include<stdio.h>
void buble(int* array, int len)//先声明并解释冒泡排序函数;
{
	for (int i = 0; i < len; i++)//此处为冒泡排序,从开始进行len次;
	{
		for (int j = 1; j <len; j++)//j从1开始,和j-1进行比较,比较len-2次;
		{
			if (array[j] > array[j - 1])//这里的顺序是:由大到小;
			{
				int temp = array[j];//临时储存值,方便达成交换;
				array[j] = array[j - 1];
				array[j - 1] = temp;
			}
		}
	}
	
}
int main()//主函数中调用bubble函数进行排序,再通过一定方式输出满足要求;
{
	int len;
	scanf_s("%d", &len);
	int a[20] = {0};//可以在此先给a一个足够大的内存
	for (int i = 0; i < len; i++)
	{
		scanf_s("%d", &a[i]);//通过scanf接受输入的数组;
	}
	buble(a, len);//调用函数进行排序,这里是对a数组进行处理,函数中处理的是具体地址,会直接改变数组的内容;
	printf("%d ", a[len - 1]);//按顺序输出,先输出最小值;
	for (int i = 0; i < (len - 3) / 2; i++)//在输出(n-3)/2个0;
		printf("0 ");
	printf("%d ", a[0]);//输出最大值;
	for (int i = 0; i < (len-3)/2; i++)//在输出(n-3)/2个0;
			printf("0 ");
	printf("%d", a[(len - 1) / 2]);//输出中间值;要注意这里空格的输出情况!
	return 0;
}

3.
折半查找

________________________________________
编写折半查找函数,函数原型:int Binserach(int *a,int n,int key);
功能:在n个元素的数组a中寻找key,若找到则返回key在数组中的下标,否则返回-1。
已知有排好序的整数数组:
int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
在main函数中,使用折半查找函数,输入一个整数,查找是否在数组中,如在给出下标,否则-1
输入样例:
9
输出样例:
8

________________________________________
样例输入:
9
样例输出:
8

#include<stdio.h>
int Binsearch(int* a, int n, int key)//a为在主函数给定的数组,n为数组的元素总数,key为要输入的找的数字;并且函数的返回值为int型,下标或者-1;
{
	int low = 0, high = n - 1;//mid写在循环当中,不必在循环之外初始化。
	while (low <= high)//折半排序,最后一次是low和high相同,终止点是low比high大。
	{
		int mid = (low + high) / 2;//此时low为0,如果high=3,那么mid=1,符合;high=4,那么mid=2,也是符合的,与奇偶无关;
		if (key == a[mid])
			return mid;//返回下标;
		else if (key < a[mid])//如果key比中间的小,那么就要在前半部分找;
			high = mid - 1;
		else low = mid + 1;//如果key比中间的大,那么就要在后半部分找;
	}
	return -1;
}
int main()
{
	int a[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
	int n = 15,key;
	scanf_s("%d", &key);
	int b=Binsearch(a, n, key);
	printf("%d", b); //需要拿一个值来接受函数返回值,打印出来;也可以写作:printf("%d", Binsearch(a, n, key))
	return 0;
}

4.
冒泡排序和选择排序
________________________________________

编写冒泡排序函数,函数原型:void BubbleSort(int a[],int n);对n个整数升序排序。
编写选择排序函数,函数原型:void SelectionSort(int a[],int n);对n个整数降序排序。
编写main函数,输入10个整数,利用函数将其按升序和降序分别输出排序结果。(输入输出数据间用一个空格分隔)
输入样例:
5 2 8 9 10 1 3 4 7 6
输出样例:
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1

________________________________________
样例输入:
5 2 8 9 10 1 3 4 7 6
样例输出:
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1

#include<stdio.h>
void BubbleSort(int a[], int n)//第一个函数:冒泡排序
{
    for (int i = 0; i < n; i++)//第一层循环,进行n次;
    {
        for (int j = 1; j < n; j++)//第二层循环,从a[1]开始,与前一项比较
        {
            if (a[j] < a[j -1])//如果前一项大,就替换位置:顺序排序;
            {
                int temp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = temp;
            }
        }
    }
}
void SelectionSort(int a[], int n)//第二个函数:选择排序;
{
    int big;//逆向排序:找出最大的,放在前面;
    for (int i = 0; i < n - 2; i++)//进行n-1次排序,从a[0]开始,到a[n-3](右边还有2项)就行了;
    {
        big = i;
        for (int j = i + 1; j < n;j++)//在a[i]右边的与a[i]进行比较,找最大值;
        {
            if(a[j]>a[big])
            big = j;
        }
        int temp = a[big];
        a[big] = a[i];
        a[i] = temp;
    }
}
int main()
{
    int a[9], n = 9;//题给n;
    for(int i=0;i<9;i++)
    scanf_s("%d",&a[i]);
    BubbleSort(a, n);
    for (int i = 0; i < n-1; i++)
    {
        printf("%d ", a[i]);//这里打印时要有一个空格,但结尾处没有,因此单独打印结尾(也可以单独打印开头);
    }
    printf("%d\n", a[n - 1]);
    SelectionSort(a, n);
    for (int i = 0; i < n-1; i++)
    {
        printf("%d ", a[i]);
    }
    printf("%d", a[n - 1]);
    return 0;
}

5.
分割排序

________________________________________
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
输入格式:每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
输出格式:对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
输入样例:
0051231232050775
输出样例:
0 77 12312320

________________________________________
样例输入:
0051231232050775
样例输出:
0 77 12312320

#include<stdio.h>
#include<string.h>
int a[120]; //记录分离的数据;
char b[1000];//记录总数据;
void fun1();
void fun2();
void fun1(int* p, int m)
{
    int i, j, k;
    for (i = 0; i < m; i++)
   {
       for (j = 0; j < m; j++)
        {
            if (a[i] < a[j])
            {
               k = a[i];
               a[i] = a[j];
                a[j] = k;
            }
        }
    }
    for (i = 0; i < m; i++)
    {
        printf("%d", a[i]);
       if (i != m - 1)
            printf(" ");
    }
    printf("\n");
}
//split ()//分离函数;
void fun2(char* b)
{
    unsigned int i, j = 0;
    int sum = 0;
    for (i = 0; i < strlen(b); i++)
    {
        if (b[i] != '5')
        {
            sum = sum * 10 + (b[i] - '0');
        }
        else
        {
            if (b[i - 1] != '5' && i != 0)
           {
                a[j] = sum;
                j++;
                sum = 0;
            }
        }
    }
    if (b[i - 1] == '5')
        fun1(a, j);
    else
    {
        a[j] = sum;
        fun1(a, j + 1);
    }
}
int main()
{
    while (gets(b) != NULL)
    {
        fun2(b);
        memset(a, 0, sizeof(a));
    }

    return 0;
}

6.
改进冒泡排序程序
________________________________________

改进冒泡排序程序,使其当数据已经有序时,直接结束排序过程。函数原型:
void Bubble(int *a,int n);//对n个整数从小到大排序
在主函数中调用Bubble对键盘输入的m个整数进行排序并输出。其中m个元素的整型数组p可以动态申请,
如 int *p=(int *)calloc(m,sizeof(int));
测试样例如下:
输入样例:
10
87 66 92 85 62 77 95 100 89 73
输出样例:
62 66 73 77 85 87 89 92 95 100
________________________________________
样例输入:
6
9 8 7 6 5 4
样例输出:
4 5 6 7 8 9

#include"stdio.h"
#include"string.h"
#include"stdlib.h"//是不是vs开时间久了就会抽风找不到文件?还是我的电脑太烂了?
void Bubble(int* a, int n)//改良的冒泡排序,只是多了识别是否已经完成,提前停止的功能;
{
	for (int i = 0; i < n; i++)
	{
		int k = 0;//在第二次循环中插入一个变量k=0;
		for (int j = 1; j < n; j++)
		{
			if (a[j] < a[j - 1])
			{
				int temp = a[j];
				a[j] = a[j - 1];
				a[j - 1] = temp;
				k = -1;//如果在第i次循环中发生了交换,那么k就改变;如果没有,那么k保持为0;
			}
		}
		if (k == 0)//保持为0,说明完全没有交换,已经排好了;
			break;
	}
}
int main()
{
	int n;
	scanf_s("%d", &n);
	int* p = (int*)calloc(n, sizeof(int));//申请动态数组,<类型说明符*>calloc(n,sizeof(int)),其中n就是元素个数;
	for (int i = 0; i < n; i++)
		scanf_s("%d", &p[i]);
	Bubble(p, n);
	for (int i = 0; i < n-1; i++)
		printf("%d ", p[i]);
	printf("%d", p[n - 1]);//输出时要注意空格问题;
	return 0;
}

7.
排序后插入新的数
________________________________________

输入数组a( 长度为n, n<10),对元素按由小到大顺序排列,然后再输入一个数b插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列。
输入(第一行数组大小n,第二行为输入的数组,第三行为插入的整数):
5
5 2 3 4 8
7
输出:
2 3 4 5 7 8
________________________________________
样例输入:
5
5 2 3 4 8
7
样例输出:
2 3 4 5 7 8

#include<stdio.h>
#include<stdlib.h>//下面用到了动态存储分配;
void SortandInsert(int* a, int* p ,int n, int b)//a为输入数组,p为接受数组,n为a中个数,b为插入的数;
{
	for (int i = 0; i < n; i++)
		p[i] = a[i];
	p[n] = b;//将a和b的值全部赋给p数组;
	for (int i = 0; i < n + 1; i++)//进行冒泡排序;
	{
		for (int j = 1; j < n + 1; j++)
		{
			if (p[j] < p[j - 1])
			{
				int temp = p[j];
				p[j] = p[j - 1];
				p[j - 1] = temp;
			}
		}
	}
}
int main()
{
	int n,b;
	int a[100];
	scanf_s("%d", &n);
	for (int i = 0; i < n; i++)
		scanf_s("%d", &a[i]);
	scanf_s("%d", &b);
	int* p = (int*)calloc(n + 1, sizeof(int));
	SortandInsert(a,p, n, b);
	for (int i = 0; i < n ; i++)
		printf("%d ",p[i]);
	printf("%d", p[n]);//同样要注意输出的空格问题;
}

。。。。。。
久远的记忆,第一题就算老师讲了也还是没写出来。。。

猜你喜欢

转载自blog.csdn.net/Jefferymeng/article/details/106343647