上机练习七

Posted welan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了上机练习七相关的知识,希望对你有一定的参考价值。

2012

1、打印菱形

题目:
打印菱形,中间以空格隔开
如 n=5 时输出如下图形:

    *
  * * *
* * * * *
  * * *
    *

代码:

#include<stdio.h>

int main()
{
	int N;
	scanf("%d", &N);

	for(int i=1;i<=N/2+1;i++)//三角带中间一行 
	{
		for(int j=1;j<=N/2+1-i;j++)
			printf("  ");
		for(int j=1;j<=2*i-1;j++)
			printf("* ");
		printf("
");		
	}	
	
	for(int i=N/2+2;i<=N;i++)//下半个倒三角 
	{
		for(int j=N/2+2;j<=i;j++)
			printf("  ");
		for(int j=1;j<=(N-i+1)*2-1;j++)
			printf("* ");
		printf("
");
	}
	
	
	return 0;
}

2、素数

题目:
打印 n 以内(包括 n)的所有素数,从小到大,中间用空格隔开

代码:

#include<stdio.h>


bool isprime(int x)
{
	for(int i=2;i<=x/2;i++)
		if(x%i==0)
			return false;
	return true;
}



int main()
{
	int N;
	scanf("%d", &N);
	for(int i=2;i<=N;i++)
	{
		if(isprime(i)==true)
			printf("%d ", i); 
	}
	
	
	return 0;	
 } 

3、递归多项式

题目:
函数P(n, x)满足如下关系

  • P(n, x)= 1, n=0时
  • P(n, x)= x, n=1时
  • P(n, x)= ((2n-1)x-P(n-1, x)-(n-1)*P(n-2, x)), n>1时

代码:

#include<stdio.h>


double p(int n, double x)
{
	if(n==0)
		return 1;
	else if(n==1)
		return x;
	else 
		return ((2*n-1)*x-p(n-1, x)-(n-1)*p(n-2, x));
	
}


int main()
{
	int n;
	double x;
	scanf("%d %lf", &n, &x);
	printf("变量为%5.2f的第%d阶多项式值为%5.2f
", x, n, p(n, x));
	
	return 0;
}

4、求满足条件的数

题目:
求出10-99之间所有每位数的乘积大于每位数之和的数,如98满足:9*8>9+8。

代码:

#include<stdio.h>



int main()
{
	int a[100];
	int num=0;
	
	int x,y;
	for(int i=10;i<=99;i++)
	{
		x = i/10;
		y = i%10;
		if(x*y>x+y)
			a[num++]=i;
	}
	
	int sums=0;
	for(int i=0;i<num;i++)
	{
		sums+=a[i];
	}
	
	printf("%d
", sums);
	
	return 0;
} 

5、学生链表

题目:
建立一个链表,其每个节点代表一位学生的信息。信息从文件 a.in 中读取(其格式为第一行为一个大于零的整数表示学生的数量,以后每行表示一位学生的信息)完成:(这里用输入代替从文件中读取)
1.求平均年龄。
2.以姓名为标准(字典序,从小到大,区分大小写)对链表进行排序,输出排序后的学号

对于名字字典相同的学生要比较其id,按照id排列
使用尾插法创建链表
使用选择排序对链表排序

代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>

using namespace std;


typedef struct Node{
	char id[100];
	char name[100];
	int age;
	struct Node *next;
}Node, *Linklist;


void creatLinklist(Linklist L, int n)//尾插法创建新链表, n个结点 
{
	L->next = NULL;
	Node *q, *r;
	r = L;
	for(int i=0;i<n;i++)
	{
		q = new Node;
		scanf("%s %s %d", q->id, q->name, &q->age);
		q->next = NULL;
		r->next = q;
		r = r->next;
	}
}


double calAverAge(Linklist L)//遍历链表求平均值 
{
	Node *r;
	r = L->next;
	int count;
	double res, sums;
	
	sums=0; count=0;
	while(r!=NULL)
	{
		count++;
		sums+=r->age;
		r = r->next;
	}
	res = sums/count;
	return res;
}


int cmp(Node *p, Node *q)
//对学生的名字按照字典序比较
//如果p->name<q->name,返回负数,如果p->name>q->name返回正数
//如果p->name==q->name,进一步比较学生id
//如果p->id<q->id,返回负数,如果p->id>q->id返回正数
//不可能存在两人名字相同并且学号相同 
{
	int res;
	res = strcmp(p->name, q->name);
	if(res!=0)
		return res;
	else//如果名字相同,则按照id比较
	{
		int idcmp = strcmp(p->id, q->id);
		return idcmp;
	} 
}


void selcetSort(Linklist L) 
//根据姓名对链表进行选择排序 
{
	Node *p, *q, *m;
	for(p=L->next;p->next!=NULL;p=p->next)
	{
		m = p;
		for(q=p->next;q!=NULL;q=q->next)
		{
			if(cmp(q, m)<0)
				m = q;
		}
		
		if(m!=p)
		{
			swap(p->age, m->age);
			swap(p->name, m->name);
			swap(p->id, m->id);
		}
			
	}
}



int main()
{
	Linklist L;
	L = new Node;
	int N;
	
	printf("请输入学生个数:"); 
	scanf("%d", &N); 
	
	creatLinklist(L, N);
	double aver = calAverAge(L);
	printf("平均年龄为:%.2f
", aver);
	
	Node *r;
	r = L->next;
	printf("学生链表为:
"); 
	while(r!=NULL)
	{
		printf("%s %s %d
", r->id, r->name, r->age);
		r = r->next;
	}
	
	selcetSort(L);
	r = L->next;
	printf("学生链表按照姓名从小到大排列为:
"); 
	while(r!=NULL)
	{
		printf("%s %s %d
", r->id, r->name, r->age);
		r = r->next;
	}
	
	return 0;
} 

以上是关于上机练习七的主要内容,如果未能解决你的问题,请参考以下文章

第十周上机练习

第四周上机练习

第十周上机练习

第十周上机练习

第十周上机练习

第十周上机练习