计算机考研自命题(5)

1、C语言–求和

1、展开式求和。输入一个实数x,计算并输出下式的和,直到最后一项的绝对值小于0.00001.计算结果保留2位小数,试编程。

S = x + x²/2!+ x³/3!+ …

/*
算法思想:定义一个求阶乘的函数fact(),
头文件调用math.h函数库:pow()函数求次幂,fabs()函数取绝对值
直到最后一项的绝对值小于0.00001,则输出求和结果,结果保留两位小数
*/
#include<stdio.h>
#include<math.h>


// 求阶乘 
int fact(int n){
    int i,sum=1;
    for(i=1;i<=n;i++){
        sum=sum*i;
    }
    return sum;
}

int main(){
    int a,n,i;
    double x,result,s=0;
    scanf("%lf",&x);
    for(i=1;(pow(fabs(x),i)/fact(i))>=0.00001;i++){
        result=pow(x,i)/fact(i);
        s+=result;
    }
    printf("s=%.2lf",s);
    return 0;
}

2、C语言–元素移动

2、有n个整数,使前面各数顺序向后移动m个位置,移出的数再从头移入,编得一个函数实现以上功能,在主函数中输入n个整数

并输出调整后的n个数。

# include<stdio.h>

/*
解题思路:
定义一个数组t存放传入的数组A,然后跟据移动的情况从t中取出元素从新放回A中
remove(*A,5,3)假设有5个元素,向后移动3位
A={1,2,3,4,5}  ==>  A={3,4,5,1,2}
首先就是将t中下标为 5-3 = 2 的元素一次存放到A中,
然后将剩余的元素放入A中 
*/

// 元素移动的方法
void remove(int *A,int n,int m) { // n表示元素个数,m表示移动几位
	int t[100];   // 用于存储A[]中的元素 
	int i;
	for(i=0; i<n; i++) { // 将A中的元素全部存储到t中 
		t[i] = A[i];
	}
	for(i = 0 ; i<m; i++) { // 将t 中 下标>=n-m的元素存放到A中 
		A[i] = t[n-m+i];
	}
	for(i = m; i<n; i++) { // 将剩余的元素存放到A中 
		A[i] = t[i-m];
	}
	for(i = 0; i<n; i++) { // 遍历 
		printf("%d ",A[i]);
	}
}

int main() {
	int i,x,num;
	scanf("%d",&num);
	int A[num];
	for(i = 0; i<num; i++) {
		printf("请输入第%d个元素",i+1);
		scanf("%d",&x);
		A[i] = x;
	}
	printf("移动后的元素序列");
	remove(A,num,3);
	return 0;
}

3、C语言-文件操作

3、将C盘根目录下文件from.txt的内容复制到to.txt文件中,to.txt与from.txt在同一目录。

/*
解题思路:首先以只读的方式打开文件from.txt,然后以写的方式打开文件to.txt,
使用fgetc()函数将文件from.txt里面的字符一个一个读取出来,然后用fputc()函数将读取出的文件写入to.txt中
*/


# include <stdio.h>
int main()
{
	// 文件复制
	FILE *fp1,*fp2;
	char ch;
	// 打开文件 
	fp1 = fopen("from.txt","r");
	if(fp1 == NULL){
		printf("文件打开失败!\n"); 
	} 
	fp2 = fopen("to.txt","w");
	if(fp2 == NULL){
		printf("文件打开失败:\n"); 
	}
	// 将读取出来的文件写入 to.txt 中 
	while((ch = fgetc(fp1)) != EOF){
		fputc(ch,fp2);
	}
	// 文件关闭 
	fclose(fp1);
	fclose(fp2); 
	return 0; 
 } 

4、C语言–复数计算

4、要求设计函数完成两个复数相乘的算法。在主函数中输入两个复数,计算后输出乘积结果

/*
解题思路:
复数的运算   i*i = -1
(a+bi)* (c+di) = a*c + a*di- b*d +b*ci
*/
//复数的结构体定义如下:
struct Complex{
	float real;
	float imag;
}Complex;
//要求设计函数完成两个复数相乘的算法。在主函数中输入两个复数,计算后输出乘积结果。

Complex Mul(Complex c1,Complex c2){
    Complex product;
    product.real = c1.real*c2.real - c1.imag*c2.imag;  // 乘积以后的虚部   i*i = -1
    product.imag = c1.imag*c2.real + c1.real*c2.iamg;  // 虚部
    return product;
}

5、数据结构

5、下面程序段的功能是建立二叉树的算法,请在下划线处填上正确的内容。

typedef struct node{
int data;
struct node *lchild;
____struct node *rchild____;
}bitree; 
void createbitree(bitree *&bt) {
scanf(%c”,&ch); 
if(ch=='#')
____bt->data = ch_______;
else { 
bt=(bitree*)malloc(sizeof(bitree)); 
bt->data=ch; 
___createbitree(bt->lchild)_____;
createbitree(bt->rchild);
}
}

6、数据结构

6、建立链表

typedef struct node {
int data; 
struct node *next;
} lklist; 
void lklistcreate(_____lklist___ *&head ) { 
for (i=1;i<=n;i++) { 
p=(lklist *)malloc(sizeof(lklist));
scanf(%d”,&(p ->data));
p->next=0;
 	if(i==1)
head=q=p;
else {
q->next=p;
______q = p______;
} 
}
}

7、数据结构–链表合并

7、实现链式结构上合并排序的算法

# include<stdio.h>

//单链表的定义
typedef struct LNode {
	ELemType data;
	LNode *next;
} LNode,*LinkList;

/*
将两个递增有序的链表A,B合并成一个递增有序的链表C

解题思路:假设A,B带有头指针,定义pa,pb指针分别指向A,B的下一个结点,
运用尾插法,先将A,B中较小的元素插入C中,实现整体按元素值递增有序;
因为A,B链表中的结点个数不一样,
所以当A中的结点数更少时 ,将B中的元素依次加入C中
反之,则将A中的元素依次加入C中 
*/
void Merge(LNode A,LNode B,LNode &C) {
	LNode *pa = A->next;
	LNode *pb = B->next;  
	LNode *pc = C;

	while(pa&&pb) {  
		if(pa->data <= pb->data) { // 运用尾插法将小的元素率先加入C链表中
			pc->next = pa;
            pc = pa;
            pa = pa->next;

		} else {
			pc->next = pb;
            pc = pb;
            pb = pb->next;
		}
	}

	while(pa) {
		pc->next = pa;
        pc = pa;
        pa = pa->next;
	}
	while(pb) {
		pc->next = pb;
        pc = pb;
        pb = pb->next;
	}
}

8、数据结构–二叉树查找

8、实现在二叉树中查找结点x的算法

# include<stdio.h>

/*
解题思路:跟据二叉树的先序遍历进行改造,传入该二叉树和要查找的值
先比较根节点是不是寻找的目标结点,如果是就返回结点,不是就寻找递归寻找左子树和右子树
直到二叉树全部查找完 
*/

// 二叉树的结构定义
typedef struct BiNode{
	ELemType data;
	struct BiNode *lchild;
	struct BiNode *rchild;
}BiNode,*BiTree; 

BiNode *find_x(BiTree Bt,ELemType x){
	while(Bt){
		if(Bt->data == x){
			return Bt;
		}
		*find_x(Bt->lchild,x);
		*find_x(Bt->lchild,x);
	}
}

9、数据结构–堆排序

9、关键字序列(k1,k2,k3,…,kn-1)是堆,写出将(k1,k2,k3,…,kn-1,x)调整为堆的算法

# include<stdio.h>
/*
解题思路:堆排序的思路
以大根堆为例:把关键字看成一颗完全二叉树,根节点(堆顶元素)就是整个序列的最大值,输出堆顶元素
堆结构被破坏,然后进行调整,将最大的元素交换到堆顶
从n/2开始依次交换 
*/ 
void adjustHeap(ELemType A[],int len,int k) {
	int i;
	A[0] = A[k];// A[0] 暂存子树的根节点
	for(i = 2*k; i<=len; i*=2) { // 沿K较大的子结点向下筛选
		if(i<len && A[i]<A[i+1]){
			i++;       			// 取K较大的子节点下标 
		}
		if(A[0]>=A[i]){			// 筛选结束 
			break;
		}
		else{
			A[k] = A[i];		// 将A[i] 调整到双亲结点上 
			k = i;				// 修改 k 值,以便继续向下筛选 
		} 
	}
	A[k] = A[0];				// 筛选结点放入最终位置 
}

10、数据结构–最小生成树

10、给一组数,画邻接矩阵和邻接表,写出prim和克鲁斯卡尔的最小生成树
请添加图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XUN~MLF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值