• 上机练习十三


    导航:复试上机历年真题,题目未搜集全
    十四:2003 十三:2004
    十二:2005 十一:2006
    十:2007 九:2008
    八:2009 七:2012
    六:2013 五:2014
    四:2015 三:2017
    二:2018 一:2019

    十三、2004

    1、发工资

    题目:
    输入几名职工工资金额,统计最少须领多少个 100 元,50 元,20 元,10 元,5 元,2 元,1 元,5 角,2 角,1 角,5 分,2 分,1 分才能实现顺利发放?
    假设职工数 n=5,工资分别为:786.98,1038.76,1053.72,1234.98,1653.33

    代码:

    #include<stdio.h>
    #include<string.h> 
    #include<algorithm>
    #include<math.h> 
    using namespace std;
    
    //输入几名职工工资金额,统计最少须领多少个 100 元,50 元,20 元,10 元,
    //5 元,2 元,1 元,5 角,2 角,1 角,5 分,2 分,1 分才能实现顺利发放?
    //假设职工数 n=5,工资分别为:786.98,1038.76,1053.72,1234.98,1653.33
    
    //要存储0.1实际上存储的是0.99999...造成计算出错 ,将输入的比123.44放大成12344再计算 
    
    
    const int a[13] = {
    	10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1,
    };//先放大方便计算 
    
    const double b[13] = {
    	100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01,
    };
    
    int p[13]={0};
    
    
    int main()
    {
    	int n, num, i;
    	double x;
    	fill(p, p+13, 0);
    
    	scanf("%d", &n);	
    	while(n--)
    	{
    		num = 0;
    		scanf("%lf", &x);
    		x = int(x*100);
    		while(x!=0)
    		{
    			i = x / a[num];//除数 
    			x -= i * a[num];//余数 
    			p[num] += i;
    			num++;
    		}
    //		printf("i=%f, x=%f, int(i)=%d, num=%d, p[%d]=%d
    ", i, x, int(i), num, num, p[num]);
    	}
    	
    	
    	for(int j=0;j<13;j++)
    	{
    		if(p[j]!=0) 
    			printf("需要%6.2f的%d张
    ", b[j], p[j]);
    	}
    	
    	return 0;
    }
    
    
    
    

    2、二叉排序树

    题目:
    建立二叉排序树(二叉链表方式),输出排序结构 H,A,X,F,T,B@(@作为结束)
    代码:

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    
    
    typedef struct BSTNode
    {
    	char data;
    	struct BSTNode *lchild, *rchild;
    }BSTNode, *BSTree;
    
    
    void insert(BSTree *bst, char ch)
    //逐个插入节点 
    {
    	if(*bst==NULL)
    	{
    		BSTNode *p = new BSTNode;
    		p->data = ch;
    		p->rchild = p->lchild = NULL;
    		*bst = p;
    	}
    	else if((*bst)->data > ch)
    		insert(&((*bst)->lchild), ch);
    	else if((*bst)->data < ch)
    		insert(&((*bst)->rchild), ch);
    }
    
    
    void creatBST(BSTree *bst, char str[])
    //创建二叉排序树 
    {
    	int len=strlen(str);
    	*bst = NULL;
    	for(int i=0;i<len-1;i++)
    		insert(bst, str[i]);
    }
    
    
    
    void inTravel(BSTree bst)
    //中序遍历 
    {
    	if(bst!=NULL)
    	{
    		inTravel(bst->lchild);
    		printf("%c", bst->data);
    		inTravel(bst->rchild);
    	}
    }
    
    
    int main()
    {
    	char str[20];
    	BSTree bst;
    	gets(str);
    	creatBST(&bst, str);
    	inTravel(bst);
    	
    	return 0;
     } 
    

    3、打印菱形

    题目:
    打印菱形

    // 输入n打印以下n边图形:
    //   A
    //  B*B
    //  C***C
    // D*****D
    //E*******E
    // D*****D
    //  C***C
    //   B*B
    //    A
    
    

    代码:

    #include<string.h>
    #include<stdio.h>
    
    
    int main()
    {
    	int i, j;
    	int n;
    	scanf("%d", &n);
    	for(i=1;i<=n;i++)//上三角 
    	{
    		for(j=n-i;j>=1;j--)
    			printf(" ");
    		
    		for(j=1;j<=2*i-1;j++) 
    		{
    			if(j==1||j==2*i-1)//只需在此做一次判断,输出是否为字母或者字符
    				printf("%c", i-1+'A');
    			else
    				printf("*");				
    		}
    		printf("
    ");
    	}
    	
    	int t, k;//k为总共需要打印几行 
    	t = n+1;
    	if(n%2==1)
    		k = n*2-1;
    	else
    		k = n*2;
    	
    	
    	for(i=t;i<=k;i++)//下三角 
    	{
    		for(j=1;j<=i-n;j++)
    			printf(" ");
    		
    		for(j=1;j<=(k-i+1)*2-1;j++)
    		{
    			if(j==1||j==(k-i+1)*2-1)//只需在此做一次判断,输出是否为字母或者字符
    				printf("%c", k-i+'A');
    			else
    				printf("*");	
    		}		
    		printf("
    ");	
    	}	
    	
    	
    	return 0;
     } 
     
    
     
    

    4、字符平台

    题目:
    求字符平台中的最大字符平台:
    一个字符串中的任意一个子序列,若子序列中个字符均相同则称字符平台,输入任意字符串 S 时,输出 S 中长度最大的所有字符平台的起始位置以及所含字符,注意字符平台有可能不止一个 AAZZZXYTTT

    代码:

    #include<stdio.h>
    #include<string.h>
    
    using namespace std;
    
    
    typedef struct plat{
    	char ch;
    	int pos;
    	int n;
    	plat()
    	{
    		pos=0;
    		n=0;
    	}
    }plat;
    
    
    plat p[100];
    int num=0;
    
    
    int main()
    {
    	char str[100];
    	int len;
    	gets(str);
    	len = strlen(str);
    	
    	for(int i=0;i<len;i++)
    	{
    		if(i==0)//第一个字符必当占一个字符平台 
    		{
    			p[num].ch = str[i];
    			p[num].pos = i;
    			p[num].n++;
    		}
    		else//要判断连续的字符是否相同, 
    		{
    			if(str[i]==str[i-1])//如果相同字符平台长度加1
    			{
    				p[num].n++;	
    			}	
    			else//不相同新增一个字符平台
    			{
    				num++;
    				p[num].ch = str[i];
    				p[num].pos = i;
    				p[num].n++;	
    			}
    		}
    	}
    	
    	int k=0;
    	for(int i=0;i<=num;i++)//找出最大的字符平台的长度 
    		if(p[i].n>k)
    			k=p[i].n;
    	
    	
    	for(int i=0;i<=num;i++)
    		if(p[i].n==k)
    			printf("%c %d %d
    ", p[i].ch, p[i].pos, p[i].n);
    	
    	return 0;
    }
    

    5、链式模式匹配

    题目:
    链式存储方式下模式匹配
    设主串 s,字串 t 分别以单链表存储,t 和 s 中每个字符均用以结点表示如下图:
    data-next
    实现在链式存储方式下的模式匹配,即求字串 t 在主串 s 中第一次出现的位置指针
    代码:

    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    
    
    typedef struct Node
    {
    	struct Node *next;
    	char data;
    }Node, *Strlink; 
    
    const int maxn = 20;
    
    
    Strlink creatStrlink(char str[])
    //尾插法创建 
    {
    	Strlink L;
    	Node *r, *q;
    	int len, i;
    	L = new Node;
    	L->next = NULL;
    	r = L;
    	len = strlen(str);
    	
    	for(i=0;i<len;i++)
    	{
    		q = new Node;
    		q->data = str[i];
    		q->next = NULL;
    		r->next = q;
    		r = q;
    	}
    	return L;
    }
    
    
    void travel(Strlink L)
    //遍历链表 
    {
    	Node *q;
    	q = L->next;
    	while(q!=NULL)
    	{
    		printf("%c", q->data);
    		q = q->next;
    	}
    	printf("
    ");
     } 
     
     
    Node* strLinkMatch(Strlink s, Strlink t)
    {
    	Node *q,*p, *m, *n;
    	p = s->next; m = p;
    	q = t->next; n = q;
    	
    	
    	if(q==NULL)//空串可以任意匹配 
    		return p;
    	
    	while(n!=NULL&&m!=NULL)
    	{
    		if(m->data==n->data)
    		{
    			m = m->next;
    			n = n->next;
    		}
    		else//匹配失败,模式串指针后移,重新匹配 
    		{
    			p = p->next;
    			m = p;
    			n = q;	
    		}
    	}
    	
    	if(n==NULL)//此时说明子串已经匹配完成
    		return p;
    	else
    		return NULL;
    }
    
    
    int main()
    {
    	Strlink S, T;
    	Node *k=NULL; 
    	char s[maxn], t[maxn];
    
    	gets(s);
    	gets(t);
    	
    	S = creatStrlink(s);
    	T = creatStrlink(t);
    	
    	k = strLinkMatch(S, T);
    	if(k!=NULL)
    		printf("匹配完成
    ");
    	else 
    		printf("匹配失败
    ");
    	
    	
    	return 0;
    }
    
  • 相关阅读:
    DataGrid 的鼠标点击
    Menu菜单
    密码问题
    Combobox代码
    EndpointContracts
    the Differences between abstract class & interface in C#接口和抽象类的区别
    How to get MetaData on client side in WCF?如何在客户端获取WCF service的元数据
    Endpoint
    Assembly Essence 程序集深入探讨:程序集结构及部署
    EndpointBinding
  • 原文地址:https://www.cnblogs.com/welan/p/12727503.html
Copyright © 2020-2023  润新知