上机练习七
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;
}
以上是关于上机练习七的主要内容,如果未能解决你的问题,请参考以下文章