【成都信息工程大学】2021-807C语言程序设计

一、阐述程序设计思想,画出程序流程图,不需要给出代码

1.设计一个函数fun,其作用为使数组中最大元素项与第一位互换,数组中最小元素项与最后一位以为互换。(使用指针实现)

注:循环处(p++)改为(i++)
请添加图片描述

2.现有两个递增有序链表L1与L2,P1、P2指向两链表头节点。利用两个链表的空间节点及指针P1、P2,构造出两列表合并后的有序递减序列L3。

请添加图片描述

二、阐述程序设计思想,画出主要流程,并给出代码。

1.选择合适的数据结构保存十个工人信息(包括编号、姓名、工龄和工资)。使用冒泡算法将工人按照工龄从大到小排序,并输出排序后的结果。

程序设计思想:建立结构体数组保存工人信息,通过Input()、Sort()、Print()三个函数分别实现输入、排序(由冒泡排序法,对工人的工龄从大到小进行排序)、输出三个功能。

#include <stdio.h>
#define N 4

struct worker
{
	char num[7];
	char name[11];
	int year;
	int salary;
};

void Input(struct worker *p);
void Sort(struct worker *p, int n);
void Print(struct worker *p);

int main(void)
{
	struct worker work[N];
	int i;

	Input(work);
	Sort(work,N);
	Print(work);
	return 0;
}

void Input(struct worker *p)
{
	for ( int i = 0; i < N; i++ )
	{
		printf("请输入第%d个工人信息:", i+1);
		scanf("%s%s%d%d", p[i].num, p[i].name, &p[i].year, &p[i].salary);
	}
}

void Print(struct worker *p)
{
	printf("\n依大到小输出工人的信息:\n");
	for ( int i = 0; i < N; i++ )
	{
		printf("编号:%s,姓名:%s,工龄:%d,工资:%d\n",
		(p+i)->num, (p+i)->name, (p+i)->year, (p+i)->salary);
	}
}

void Sort(struct worker *p, int n)
{
	int i, j;
	struct worker temp;
	for ( i = 0; i < n-1; i++ )
	{
		for ( j = 0; j < n-i-1; j++ )
		{
			if ( p[j].year < p[j+1].year )
			{
				temp = p[j];
				p[j] = p[j+1];
				p[j+1] = temp;
			}
		}
	}
}

流程图
请添加图片描述

2.有一个长度为10的字符串,输入一个字串,调用Find函数找出字符串中含有输入子串的个数,并在主函数输出结果。

设计思想:遍历str字符串,在通过比对其中与s1字串是否有相同的子串,有则count加1,循环遍历一次即可获得相同字串的个数。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10

int Find(char *str, char *s1);

int main(void)
{
	char str[N] = "abacabacac",s1[N];
	int count = 0;
	printf("请输入一个子串:");
	gets(s1);	//s1表示子串
	
	count = Find(str,s1);
	printf("\n子串个数为:%d", count);

	return 0;
}

int Find(char *str, char *s1)
{
	int i = 0, j = 0, k = 0;
	int count = 0;
	while ( str[i] != '\0' )
	{
		if ( str[i] == s1[0] )
		{
			while ( s1[j] != 0 ){
				if ( str[i+j] == s1[j] )
					k++;
				j++;
			}
			if ( k == strlen(s1) )	//判断s1在str中是否有相同子串
				count++;
			j = 0;
			k = 0;
		}
		i++;
	}
	return count;
}

流程图
请添加图片描述

3.现有ABC三个顺序表,要求在顺序表A中删除BC含有的元素后构建新的顺序表后输出。(结构体中的数据为Int类型)

设计思想:设计两个函数,一个用于初始化和创建顺序表A,B,C;另一个通过嵌套for循环,并比较元素,从而删除A中与B,C相同元素,最后输出A表

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10

typedef struct List 
{
	int data[MaxSize];
	int length;
} List;

void Create_List(List *L);
void Delete(List *A, List *B, List *C) ;

int main(void) 
{
	List A,B,C;			//声明表
	
	Create_List(&A);
	Create_List(&B);
	Create_List(&C);
	Delete(&A,&B,&C);	//删除后输出

	return 0;
}

void Create_List(List *L) 
{
	int i, value;
	for( i = 0; i < MaxSize; i++ )
		L->data[i] = 0;        //扫除内存,初始为0
	L->length = 0;             //初始表长为0
	
	printf("请输入表元素:\n");
	for( i=0;; i++ ) 
	{
		scanf("%d", &value);
		if( value == 9999 )     //输入int型数据(9999作为结束,不包含9999)
        	break;
		L->data[i] = value;
		L->length++;
	}

}


//删除A表中含有BC中的元素
void Delete(List *A, List *B, List *C) 
{
	int i, j, k;
	for ( i = 0; i < A->length; i++ )	//外层一次循环,让B的所有数据和A.data[i];比较
	{
		for ( j = 0; j < B->length; j++ ) 
		{
			if ( B->data[j] == A->data[i] ) //如果B中数据有和A的数据相同,则...
			{
				for ( k = i; k < A->length; k++ )
					A->data[k] = A->data[k+1];
				A->length--;
			}
		}
	}

	for ( i = 0; i < A->length; i++) //让C和A中数据比较,和上面一样
	{
		for ( j = 0; j < C->length; j++ ) 
		{
			if ( C->data[j] == A->data[i] )
			{
				for ( k = i; k < A->length; k++ )
					A->data[k] = A->data[k+1];
				A->length--;
			}
		}
	}
	
	printf("输出结果\n");
	for ( i = 0; i < A->length; i++ )
	{
		printf("%3d", A->data[i]);    //输出表A的内容
	}
}

流程图
请添加图片描述


版权声明:本文为XING_Gou原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。