admin 管理员组文章数量: 887031
2023年12月19日发(作者:java类的设计)
C语言及实验作业参考做法
分支程序设计上机作业:标题
描述
输入数据
输出数据
输入示例
输出示例
4.3三角形判断
输入三条边的长,输出这三条边是否构成等边三角形、等腰三角形、直角三角形、普通三角形,还是不能构成三角形
整数a,b,c的值
等边三角形、等腰三角形、直角三角形、普通三角形,或不能构成三角形
5 5 5
等边三角形
#include
int main( ) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==b&&b==c) printf("1");
else if(a+b>c&&a+c>b&&b+c>a)
if(a==b||b==c||a==c) printf("2");
else if(a*a+b*b==c*c||b*b+c*c==a*a||a*a+c*c==b*b)
printf("3");
else printf("4");
else printf("5");
return 0;
}
标题
描述
4.5计算函数的值
当x<1时,y=x
当1≤x<10时,y=2x-1
当x≥10时,y=3x-11
输入数据 整数x的值
输出数据 一个整数表示函数的值
输入示例 5
输出示例 y=9
#include
int main()
{ int x,y;
scanf("%d",&x);
if(x<1) y=x;
else if(x<10) y=2*x-1;
else y=3*x-11;
printf("%d",y);
return 0;
}
标题 4.6 数的分离
给一个不多于3位的正整数
(1)计算它是几位数
(2)分别打印出每一位数字
(3)逆序打印出各位数字
描述
输入数据 一个不多于3位的正整数
位数
输出数据 从高位到低位的各位数字
从低位到高位的各位数字
输入示例 456
3
输出示例 4 5 6
6 5 4
123/100=?
23/10=?
123%10=?
测试数据1: 678 3 6 7 8 8 7 6
测试数据2: 45 2 4 5 5 4
测试数据3: 8 1 8 8
提示
#include
int main( )
{int p,t,s; int i,bit;
//printf("input a number(0-999):");
scanf("%d",&p);
gewei=p%10; //个位
shiwei=p/10%10; //十位
baiwei=p/100; //百位
if(baiwei) //如果是3位数
{printf("%dn",3); printf("%d %d %dn",baiwei,shiwei,gewei);
printf("%d %d %dn",gewei,shiwei,baiwei);
}
else if(shiwei) //如果是2位数
{printf("%dn",2);printf("%d %dn",shiwei,gewei);
printf("%d %dn",gewei,shiwei);
}
else printf(" %dn%dn%dn",1,gewei,gewei); //是1位数
return 0;
}
标题 4.7输出等级分(用if语言实现)
输入一个百分制成绩,输出对应的等级分
90-100 为 A
80-89 为 B
70-79 为 C
60-69 为 D
0-59 为 E
描述
输入数据 一个整数
输出数据 一个大写字符
输入示例 95
输出示例 A
标题
描述
4.8 计算建筑高度
有4个圆塔,圆心分别为(2,2),(-2,2),(-2,-2),(2,-2),圆半径为1。这4个塔的高度为10m,塔以外无建筑物。
输入任一点的坐标,求该点的建筑高度(塔外高度为0)。
输入数据 以(x,y)形式作为点的坐标输入
输出数据 输出高度
输入示例 (3,1)
输出示例 10
注意输入坐标的格式,括号为半角符号
输入: (0.5,0.7) 输出:0
输入: (2.1,2.3) 输出:10
输入: (-2,-1) 输出:10
输入: (-3,2) 输出:10
提示
#include
main( )
{int x1=2,y1=2;
float x,y;
printf("input the position x & y:"); scanf("(%f,%f)",&x,&y);
x=fabs(x); y=fabs(y);
if((x-x1)*(x-x1)+(y-y1)*(y-y1)<=1)
printf("%dn",10);
else printf("0n");
return 0;
}
标题 4.9输出等级分(用switch语言实现)
输入一个百分制成绩,输出对应的等级分
90-100 为 A
80-89 为 B
70-79 为 C
60-69 为 D
0-59 为 E
描述
输入数据 一个整数
输出数据 一个大写字符
输入示例 86
输出示例 B
#include
int main( )
{int score; char grade;
printf("input a score:"); scanf("%d",&score);
switch(score/10)
{case 10:
case 9: grade='A'; break;
case 8: grade='B'; break;
case 7: grade='C'; break;
case 6: grade='D'; break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0: grade='E'; break;
}
printf("his score class is %cn",grade);
return 0;
}
笔头作业:
1.输入4个整数,按从小到大的顺序输出
2.根据月份判断季节。输入月份,输出春/夏/秋/冬。要求用switch语言实现
3.学生学习两门课:必修课成绩为course1,选修课成绩为course2,若两门都及格,打印pass,必修课不及格,打印fail
4.从键盘输入一个年份,判该年是否是闰年,是闰年就输出yes,否则输出no
5.从键盘输入一个字符,判断该字符是数字字符、大写字母、小写字母、空格还
是其他字符。
6.商店卖西瓜,10斤以上每斤0.8元, 8斤以上每斤0.6元, 6斤以上每斤0.4元,4斤以上每斤0.3元, 4斤以下每斤0.15元,输入西瓜重量和所付的钱数,输出应付的货款和应找的钱数
循环程序设计上机作业:标题
描述
5.2 统计一行字符中各类字符的个数
输入一行字符,统计其中英文字母、空格、数字和其他字符的个数
输入数据 一行以回车结束的字符
输出数据 四个分别表示英文字母、空格、数字和其他字符的个数的整数
输入示例 123 abcd****ABCD
输出示例 8 2 3 4
#include "stdio.h"
main()
{int num0=0,numa=0,num=0,other=0;char ch;
//num0:0-9; numa:alpha; num:space;
scanf("%c",&ch);
while (ch!='n')
{ if (ch>='0'&&ch<='9') num0++;
else if (ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') numa++;
else if (ch==' ') num++;
else other++;
scanf("%c",&ch);
}
printf("%d %d %d %d",numa,num,num0,other);
return 0;
}
标题
描述
5.3 计算aaaaa
计算S(n)=a+aa+aaa+...... 其中a是一个数字
输入数据 两个分别表示a和n的整数
输出数据 一个表示S(n)的整数
输入示例 3 5
输出示例 37035
提示 2*10+2=? 22*10+2=?
#include
int main()
{int a,n,i; long all=0,t;
scanf("%d %d",&a,&n);
t=a;
for (i=1; i<=n; i++)
{all=all+t;
t=t*10+a;
}
printf("%d",all);
return 0;
}
标题
描述
5.6 找出1000以内的所有完数
一个数等于它的所有因子之和,这个数就称为"完数".找出1000以内的所有完数
输入数据 无
输出数据 完数及它的所有因子(用逗号格开)
输入示例 无
6 its factor are 1,2,3
输出示例 28 its factor are 1,2,4,7,14
496 its factor are 1,2,4,8,16,31,62,124,248
#include "stdio.h"
main()
{int a,b,k,s;
for (k=2; k<1000; k++)
{//判断k是否是完数
s=0;
for (a=1; a<=k/2; a++)
if (k%a==0) s+=a; //计算k的因子之和
if (s==k) //k是完数
{printf("%d its factors are 1",k);
for (a=2; a<=k/2; a++)
if (k%a==0) printf(",%d",a); //输出所有因子
printf("n");
}
}
}
标题 5.8 猴子吃桃问题
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一半零一个.到第十天早上想再吃时,就只剩下一个桃子了.问第一天共摘了多少桃子.
描述
输入数据 无
输出数据 表示第一天桃子个数的整数
#include
main( )
{int day,all;
all=1;
for(day=9; day>0; day--)
all=2*(all+1);
printf("the first number is %dn",all);
}
标题
描述
5.10 输出菱形图案
输出图案
输入数据 无
输出数据 菱形图案
输入示例 无
*
***
*****
输出示例 *******
*****
***
*
提示
标题
描述
5.11 输出菱形图案2 选做*
输入一个整数n和一个字符c,输出菱形图案.菱形图案由字符c构成,图案总共2n+1行
找规律上下部分规律不同
输入数据 一个整数和一个字符
输出数据 菱形图案
输入示例 3*
*
***
*****
输出示例 *******
*****
***
*
提示 上下n行对称
#include
int main()
{int k,i,j,n;
char c;
scanf("%d%c",&n,&c);
for(i=1; i<=n+1; i++)
{ for (j=1; j<=n+1-i; j++) putchar(' ');
for (j=1; j<=2*i-1; j++) putchar(c);
printf("n");
}
for (i=1; i<=n; i++)
{ for (j=1; j<=i; j++) putchar(' ');
for (j=1; j<=(n+1-i)*2-1; j++) putchar(c);
putchar('n');
}
return 0;
}
标题
描述
5.13 与 7 无关数的平方和
一个正整数 , 如果它能被 7 整除 , 或者它的十进制表示法中某个位数上的数字为 7, 则称其为与 7 相关的数 . 现求所有小于等于 n(n<100) 的与 7 无关的正整数的平方和 .
输入为一正整数 n,(n<100)
输出小于等于 n 的与 7 无关的正整数的平方和
21
输入数据
输出数据
输入示例
输出示例
2336
#include
int main()
{
int n;
int sum=0;
int i,ge,shi;
scanf("%d",&n);
for(i=1; i<=n; i++)
{ge=i%10;
shi=i/10;
if(ge==7||shi==7||i%7==0)
continue;
sum+=i*i;
}
printf("%d",sum);
return 0;
}
书面作业:
1.从键盘上输入10个整数,计算这些整数的和
2.水仙花数。一个3位数,若其各位数字之和等于它本身,这个数就称为水仙花数.输出所有的水仙花数。(如153)
#include
int main()//方法一
{ int num,bai,shi,ge;
for(num=100; num<1000; num++)
{bai=num/100;
shi=num/10%10;
ge=num%10;
if(num==bai*bai*bai+shi*shi*shi+ge*ge*ge)
printf("%dn",num);
}
return 0;
}
//方法二
int main()
{
int i,j,k;
for(i=1; i<10; i++)
for(j=0; j<10; j++)
for(k=0; k<10; k++)
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
printf("%dn",100*i+j*10+k);
return 0;
}
3.计算分数序列2/1,3/2,5/3,8/5,13/8,21/13,.....前20项之和。
#include
{
float sum,fenzi,fenmu,a; int i;
fenzi=2;fenmu=1;sum=0; for(i=1; i<=20; i++) {
sum+=fenzi/fenmu; a=fenmu; fenmu=fenzi;fenzi+=a; }
printf("%.3f",sum);
return 0;
}
4.迭代法求平方根。利用公式x(n+1)=1/2*(x(n)+a/x(n)) 计算a的平方根.要求|x(n+1)-x(n)|<1e-5
#include
#include
main()
{float x0,x1,a;
printf("input a="); scanf("%f",&a);
x1=a/2;
do
{ x0=x1;
x1=(x0+a/x0)/2;
}while(fabs(x1-x0)>1e-5);
printf("the sqrt of %f is %fn",a,x1);
}
5.百钱买百鸡:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
6.某人摘下一些桃子,第一天卖掉一半,又吃了一个,第二天卖掉剩下的一半,又吃了一个,以后每天都是如此处理,到第n天发现只剩下一只桃子。输入n,输出一共摘了多少桃子。
7.一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你来设计。
输入
输入文件包括几行,每一行代表一个订单。每个订单里的一行包括六个整数,中间用空格隔开,分别为1*1至6*6这六种产品的数量。输入文件将以6个0组成的一行结尾。
输出
除了输入的最后一行6个0以外,输入文件里每一行对应着输出文件的一行,每一行输出一个整数代表对应的订单所需的最小包裹数。
样例输入
0 0 4 0 0 1
7 5 1 0 0 0
0 0 0 0 0 0
样例输出
2
1
数组上机作业:标题
描述
6.2选择排序
用选择法对10个字符排序
输入数据 10个字符
输出数据 排好序的10个字符
输入示例 fgthyjpdsa
输出示例 adfghjpsty
#include
int main()
{char a[10];int i,j,k,t;
for(i=0;i<=9;i++)
scanf("%c",&a[i]);
for(j=0;j<=8;j++)
{
k=j;
for(i=j+1;i<=9;i++)
{
if(a[i] {t=a[j];a[j]=a[k];a[k]=t;} } } for(i=0;i<=9;i++) printf("%c",a[i]); return 0; } 标题 描述 输入数据 输出数据 6.3 字符串排序 10个字符串 从小到大有序的10个字符串 qwe asd zxc hg up cctv are not goto head 输入10个字符串,按从小到大的顺序排序后输出 输入示例 输出示例 are asd cctv goto head hg not qwe up zxc 要求用冒泡排序方法 提示 #define N 10 int main( ) { int i, j, k; char a[N][20],t[20]; printf(“input 10 characters:”); for(i=0; i for(i=0; i for(j=0; j if(strcmp(a[j],a[j+1])>0) //前面的大,后面的小就交换 {strcpy(t,a[j]); strcpy(a[j],a[j+1]); strcpy(a[j+1], t);} } //printf(“the sorted strings:n”); for(i=0 i return 0; } 标题 描述 输入数据 输出数据 输入示例 输出示例 6.4 有序插入 选做题* 输入一个有9个元素的有序数组,再输入一个数,把这个数插入到数组中,插入后仍然有序 10个整数,前9个数从小到大有序 10个有序整数(用%3d输出) 2 4 6 8 10 12 14 16 18 7 2 4 6 7 8 10 12 14 16 18 注意数组大小 试验以下3组输入: 2 4 6 8 10 12 14 16 18 7 2 4 6 8 10 12 14 16 18 1 2 4 6 8 10 12 14 16 18 27 提示 #include int main() { int a[10]; int i,j,t; for(i=0; i<9; i++) scanf("%d",a+i);//输入9个数 scanf("%d",&t); //输入要插入的数 for(i=8;i>=0; i--) //从后往前找插入位置,并把大的数往后挪 if(a[i] else a[i+1]=a[i]; a[i+1]=t; //插入 for(i=0;i<10; i++) //输出插入后且有序的数 printf("%3d",a[i]); return 0; } 标题 描述 输入数据 输出数据 输入示例 6.5麦森数 选做题* p形如2-1的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果P是个素数。2p-1不一定也是素数。输入P p(1000 一个整数(1000到3100000之间) 一个表示为数的整数和500位数字 1279 386 00 00 46643993640855 386753360298012 输出示2394442424832346 例 49773293892296 66962 5960 466622483354887 329587361869557 //方法一 #include int main() { long p,i,j; int weishu,jinwei,temp; int a[501]={1}; int b[10]={1,2,4,8,16,32,64,128,256,512}; scanf("%d",&p); weishu=(int)(p*log10(2))+1; printf("%dn",weishu); for(i=p;i>0; i--) {jinwei=0; for(j=0; j<501; j++) {temp=a[j]*2+jinwei; a[j]=temp%10; jinwei=temp/10; } } a[0]=a[0]-1; for(i=499;i>=0; i--) { printf("%d",a[i]); if(i%50==0)printf("n"); } return 0; } //方法二 #include int main() { long p,i,j; int weishu,jinwei,temp,tempwei,maxwei; int a[501]={6,7,5,8,4,0,1};//pow(2,20) int b[20]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288}; scanf("%d",&p); weishu=(int)(p*0.301029996)+1; printf("%dn",weishu); tempwei=4; for(i=p-20;i>=20; i-=20) {jinwei=0; maxwei=tempwei+7; for(j=0; j {temp=a[j]*1048576+jinwei; a[j]=temp%10; jinwei=temp/10; } tempwei=maxwei; while(!a[tempwei]) tempwei--; tempwei++; } jinwei=0; for(j=0; j<501; j++) {temp=a[j]*b[i]+jinwei; a[j]=temp%10; jinwei=temp/10; } a[0]=a[0]-1; for(i=499;i>=0; i--) { printf("%d",a[i]); if(i%50==0)printf("n"); } return 0; } 标题 描述 输入数据 输出数据 输入示例 6.6 打印杨辉三角形 输出杨辉三角形(10行) 无 杨辉三角形(10行) 8行示例: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 注意输出10行 用%4d输出每个数 输出示例 提示 #include int main() {int a[10][10]={0}; int i,j; for(i=0;i<10;i++) a[i][0]=1,a[i][i]=1; for(i=2;i<10;i++) for(j=1;j a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<10; i++) {for(j=0;j<=i; j++) printf("%4d",a[i][j]); printf("n"); } return 0; } 标题 6.7大整数的因子 选做题* 已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负描述 整数c,求所有能整除c的k. 若干个非负整数c,c的位数<=30 输入数据 每行一个c,当c=-1时中止 (不要对-1进行计算!) 每一个c的结果占一行 1) 若存在满足 c%k == 0 的k,输出所有这样的k,中间用空格隔输出数据 开,最后一个k后面有空格。 2) 若没有这样的k则输出"none" 30 72 输入示例 13 -1 2 3 5 6 输出示例 2 3 4 6 8 9 none 提示 一个整型变量是放不下30位整数的 #include #define N 30+1 int getlargenumber(int A[N]) //读入一个大整数,放在数组A中 { char c,temp[N]; int i,j,k,start,len; for(i=0; i i=0; c=getchar(); if(c=='-') return 0; do{ temp[i++]=c; }while((c=getchar())!='n'); start=N-i; i--; for(j=N-1; j>=start; j--,i--) A[j]=temp[i]-'0'; return 1; } int is7bei(int A[N]) //判断是否能被7整除 //方法是每一位不断的减7,直到小于7为止 //如865,与165具有相同的特性(最高位-7),165与25具有相同的特性(1*10+6-7-7=2),25与4具有相同的特性(2*10+5-7-7-7) { int i,k; for(i=0; ;i++) if(A[i]) break; //找最高位 while(i { k=A[i-1]*10+A[i]; while(k>=7) k-=7; //这位数字只要超过7就不断的减7 A[i-1]=0; A[i]=k; i++; } i--; if(A[i]%7==0) return 1; return 0; } int main() { int a[N]; int bei[10]={0}; //存放大整数是否为7的倍数,如bei[7]=1表示能被7整除 int sum,i,t,yes; t=getlargenumber(a);//读取大整数 while(t) { memset(bei,0,sizeof(bei));//将bei的值都置为0 if(a[30]%2==0) bei[2]=1; //判断能否被2整除 sum=0; for(i=0; i sum+=a[i]; //计算各位数字之和 if(sum%3==0) bei[3]=1; //判断能否被3整除 if(sum%9==0) bei[9]=1; //判断能否被9整除 if((a[29]*10+a[30])%4==0) bei[4]=1; //判断能否被4整除 if((a[28]*100+a[29]*10+a[30])%8==0) bei[8]=1; //判断能否被8整除 if(a[30]==0||a[30]==5) bei[5]=1; //判断能否被5整除 bei[6]=bei[2]&&bei[3]; //判断能否被6整除 bei[7]=is7bei(a); //判断能否被7整除 yes=0; for(i=2; i<10; i++) if(bei[i]) { printf("%d ",i); yes=1;} if(yes==0) printf("nonen");else printf("n"); t=getlargenumber(a); } return 0; } 标题 6.8不吉利日期 选做题* 描述 在国外,每月的13号和每周的星期5都是不吉利的。特别是当13号那天恰好是星期5时,更不吉利。已知某年的一月一日是星期w,并且这一年一 定不是闰年,求出这一年所有13号那天是星期5的月份,按从小到大的顺序输出月份数字。(w=1..7) 输入数据 输入有一行,即一月一日星期几(w)。(1<=w<=7) 输出数据 输出有一到多行,每行一个月份,表示该月的13日是星期五。 输入示例 7 1 输出示例 10 #include int main() { int day[13]={0,12,31,28,31,30,31,30,31,31,30,31,30}; int w; int i; scanf("%d",&w); for(i=1; i<=12; i++) {w=(w+day[i])%7; if(w==5) printf("%dn",i); } return 0; } 标题 6.9计算n! 选做题* n大于12,小于300 描述 输入数据 输入一个大于12的整数 输出数据 输出有一到多行,每行输出n!的40位 输入示例 80 733723 输出示例 46573423657525778 842668944867280 int main( ) { int a[2800]={1,1}; int n,i,j,jinwei,chenji,weishu=1; scanf("%d",&n); for(i=2; i<=n; i++) {jinwei=0; for(j=1; j<=weishu+1||jinwei; j++) {chenji=a[j]*i+jinwei; a[j]=chenji%10; jinwei=chenji/10; } while(a[j]==0) j--; weishu=j; } for(i=weishu,j=0; i>0; i--) { printf("%d",a[i]); j++; if(j%40==0) printf("n"); } printf("n"); return 0; } 标题 6.10计算鞍点 选做题* 找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在描述 该列上最小。也可能没有鞍点。 输入数据 输入一个5行6列二维数组 二个表示鞍点位置的行、列号 输出数据 没有鞍点输出none 7 6 15 4 3 2 2 7 9 4 3 1 输入示例 6 8 13 7 1 17 5 9 10 6 5 3 4 7 11 2 7 9 输出示例 2 3 #include int main() { int a[5][6]; int i,j,k,hang,lie; int find=0; for(i=0; i<5; i++) for(j=0; j<6; j++) scanf("%d",&a[i][j]); for(i=0; i<5; i++) {k=0; for(j=0;j<6; j++) if(a[i][j]>a[i][k]) k=j; for(j=0;j<5;j++) if(a[j][k] if(j==5) {printf("%d %d",i+1,k+1); find=1;} } if(!find) printf("none"); return 0; } 标题 6.11找最长的单词 选做题* 描述 输入一行字符,其中包括若干个单词,单词之间用空格格开 输入数据 输入一行字符 输出数据 一个字符串(最长的单词) 输入示例 I HUDDD GH ASDFGHGF FG 8976 输出示例 ASDFGHGF #include int main( ) { int i, pos=0, word=0,start=0,maxlen=0; char string[81]; gets(string); for(i=0; string[i]!='0'; i++) if (string[i]==' ') { if(word==1&&i-start>maxlen) {pos=start; maxlen=i-start; } word=0; } else if(word==0) { word=1; start=i; } for(i=pos; string[i]!=' '&&string[i]!='0';i++) printf("%c",string[i]); return 0; } 标题 描述 输入数据 输出数据 输入示例 输出示例 6.12 字符串比较 输入两个字符串,比较这两个字符串的大小。比较时从头开始依次比较两个串的对应字符,如果都相同,输出0,否则输出不同处两个字符ASCII码的差。 两个字符串 一个整数 asdfg asghd -3 3组测试数据: br和bhj br和brg brg和br 提示 #include int main() { char s1[20],s2[20]; int i,cha=0; gets(s1); gets(s2); i=0; for(i=0;s1[i]&&s2[i]; i++) if(s1[i]!=s2[i]) break; cha=s1[i]-s2[i]; printf("%d",cha); return 0; } 书面作业: 1.输入10个整数,输出最小值及最小值的下标。 2.字符串复制。输入一个字符串,把它复制到一个字符数组中,并输出。 3.找出一个5*6的二维数组的鞍点。一个数组的鞍点是一个位置(行号,列号),该位置上的元素在该行值最大,在该列值最小.一个数组可能有一个鞍点,也可能没有鞍点。 4.字符分类统计。输入3行字符,分别统计其中英文大写字母、小写字母、数字、空格及其他字符的个数。 5.判断一个字符串是否是回文?如“abcba”(顺读和逆读相同) 6.折半查找。有15个数,按从小到大的顺序存放在一个数组中。输入一个数,查找该数是数组中的第几个数。如果该数不在数组中,则输出“找不到” 7.矩阵的乘法运算 8.用筛选法求素数。对于一个整数x,只要删去所有不超过sqrt(x)的素数p的所有倍数(不含p),剩下的就是不超过x的全部素数。 9.输入1000个0~50的整数,统计每个数出现的次数 10.公元元年元月元日(1年1月1日)是星期一,确定公元y年m月d日是星期几? 11.A,B,C,D,E合伙夜间捕鱼,凌晨时都睡了。A第1个醒来,将鱼平分成5份,多余1条扔掉,回家了。B第2个醒来,将鱼平分成5份,多余1条扔掉,回家了;C、D、E依次醒来,按同样的方法分鱼。问5人至少合作捕到多少条鱼?每人醒来后看到多少条鱼? 12.完美立方。 问题描述:a^3= b^3+ c^3+ d^3为完美立方等式。例如123= 6^3+ 8^3+ 10^3。编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a^3= b^3+ c^3+ d^3,其中1 输入:正整数N (N≤100) 输出:每行输出一个完美立方,按照a的值,从小到大依次输出。当两个完美立方等式中a的值相同,则依次按照b、c、d进行非降升序排列输出,即b值小的先输出、然后c值小的先输出、然后d值小的先输出。 #include int main() { int n;scanf("%d",&n); int i, cube[101]; for(i=0;i<=100;i++) cube[i]=i*i*i; int a,b,c,d; for(a=2;a<=n;a++) for(b=2;b for(c=b;c for(d=c;d if(cube[a] == cube[b]+cube[c]+cube[d]) printf("Cube = %d, Triple = (%d,%d,%d)n",a,b,c,d); return 0; } 13.给定一个整数序列,判断其中有多少个数,等于数列中其他两个数的和。比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。 14.猜字游戏。计算机生成一个随机数,用户来猜。猜对数字但是位置不对用nB来表示,位置正确用nA表示。 例如随机数:2468 一猜:0123 0A,1B 二猜:1234 0A,2B 三猜:2345 1A,1B 四猜:2346 1A,2B 五猜:8346 0A,3B 六猜:2846 1A,3B 七猜:2486 2A,2B 八猜:2468 4A 15.A,B,C是小学老师,各教两门课,互不重复。共有6门课:语文、算术、政治、地理、音乐和美术。已知: (1)政治老师和算术老师是邻居 (2)地理老师比语文老师年纪大 (3)B最年轻 (4)A经常对地理老师和算术老师讲他看过的文学作品 (5)B经常和音乐老师、语文老师一起游泳 16.过年了,村里要庆祝一下。村长对村里的128个村民说:做一个游戏,让每个人把出生年+月+日得到一个数。例如:1968年10月28日=1968+10+28=2006。然后把这个数报上来。村里有一笔钱要作为游戏的奖金,数额为M元。如果有人报上来的数字与M相同,就把这笔钱发给这些人。如果只有一个人得奖,奖金都归这个人。如果有多于一个人得奖,则他们平分这笔钱。现在让我们来写一段程序算算都有哪些人得到了奖金?得到多少? 函数上机作业:标题 描述 7.1 折半查找 输入10个从小到大的数,再输入一个数x,用折半方法查找x在10个数中的位置(0-9),输出-1表示找不到. 输入数据 10个从小到大的整数和一个整数 输出数据 一个表示位置的数(-1至9) 输入示例 1 2 3 4 5 6 7 8 9 10 1 输出示例 0 提示 标题 描述 输入数据 输出数据 输入示例 输出示例 提示 注意折半查找的方法 7.2找最大数 选作题* 利用函数找出9个数的最大值.请设计一个函数找出9个数的最大值,在主函数中调用这个函数,输出最大值. 9个整数 1个表示最大值的整数 3 4 7 2 99 2 4 6 1 99 必须使用函数 标题 描述 输入数据 输出数据 输入示例 输出示例 7.3判断素数函数 整数 YES或者NO 42 NO 7.4数组转置 无 输入一个4*4矩阵 无 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 使用%3d输出 7.5 百分制换算为等级分 写一个判素数的函数,在主函数输入一个整数,输出是否素数信息。 标题 描述 输入数据 输出数据 输入示例 输出示例 提示 标题 描述 选作题* 根据百分制得分给出等级分.设计一个函数根据百分制得分给出等级分,在主函数中调用这个函数 输入数据 输出数据 输入示例 输出示例 一个表示分数的整数 一个表示对应等级的字符 65 D 必须定义函数 95-100 A 81-94 B 70-80 C 60-69 D 59以下 E 提示 标题 描述 输入数据 输出数据 输入示例 输出示例 提示 7.8 字符分类统计 写一个函数,统计一个字符串中字母、数字、空格及其他字符的个数。在主函数中输入字符串和输出统计结果 一个字符串 四个整数,发表表示字母、数字、空格及其他字符的个数 g6g 7g**g**k 5 2 3 4 一个函数只能返回一个值 7.12 成绩统计 标题 描述 输入10个学生5门课的成绩,分别写3个函数完成: (1)每个学生的平均分 (2)每门课的平均分 (3)找出最高分学生的学号(1-10)和课程(1-5) 在主函数中调用这3个函数 输入数据 一个10行5列的数组 (1)10个整数,分别表示每个学生的平均分 (2)5个整数,分别表示每门课的平均分 输出数据 (3)2个整数,分别表示最高分学生的学号和课程 都用%3d输出 97 98 87 86 65 77 88 99 88 77 67 68 69 70 71 77 68 87 89 88 输入示例 77 88 78 89 77 86 67 66 65 64 63 62 61 99 100 76 78 79 77 89 65 65 65 65 65 98 98 98 98 98 86 85 69 81 81 69 77 79 65 98 输出示例 78 78 78 82 79 7 5 提示 标题 7.13 排序及查找 分别用3个函数完成: (1)输入10个职工的姓名和职工号 (2)按职工号从小到大排序,职工号也随之调整 (3)根据职工号,用折半查找的方法查找该职工的姓名 主函数调用这3个函数,并在主函数中输入(3)中的职工号,输出查询结果 10个职工的姓名和职工号(姓名是字符串,职工号是整数) 1个职工号 可以先初始化数组,程序正确后才改为键盘输入成绩。 描述 输入数据 排好序的职工号与姓名 输出数据 查找到的姓名,找不到输出NO zhangsan 10048 lisi 10027 wangwu 20046 zhangdan 10003 zhanghao 30056 输入示例 yaoming 20037 guoyue 10088 lindan 30002 she 20005 zhouhuajian 10002 20005 zhouhuajian 10002 zhangdan 10003 lisi 10027 zhangsan 10048 guoyue 10088 输出示例 she 20005 yaoming 20037 wangwu 20046 lindan 30002 zhanghao 30056 she 标题 描述 7.15计算日期 给出年月日,计算该日是该年的第几天 输入数据 年,月,日 输出数据 天数 输入示例 2008,3,2 输出示例 62 标题 描述 输入数据 输出数据 输入示例 输出示例 提示 7.14 十六进制数转换为十进制数 一个表示十六进制数的字符串 一个整数 1a6 422 十六进制数不能用%x以整数形式接收 输入一个十六进制数,转换为十进制数输出 #include int change(char a[],int n) { int t,len; if(n==0) return 0; t=a[n-1]>'9'?a[n-1]-'a'+10:a[n-1]-'0'; return change(a,n-1)*16+t; } int main() { char char16[8]; int int10; gets(char16); strlwr(char16); int10=change(char16,strlen(char16)); printf("%d",int10); return 0; } 标题 描述 输入数据 输出数据 7.16验证“歌德巴赫猜想” 验证“歌德巴赫猜想”,即:任意一个大于等于6的偶数均可表示成两个素数之和。 输入只有一个正整数x。(x<=2000) 如果x不是“大于等于6的偶数”,则输出一行: Error! 否则输出这个数的所有分解形式,形式为: x=y+z 其中x为待验证的数,y和z满足y+z=x,而且y<=z,y和z均是素数。 如果存在多组分解形式,则按照y的升序输出所有的分解,每行一个分解表达式。 注意输出不要有多余的空格。 输入示例 100 100=3+97 100=11+89 输出示例 100=17+83 100=29+71 100=41+59 100=47+53 #include #include /*判断num是否是素数,是则返回1, 否则返回0*/ int prime(int num) {int k,i; k=sqrt(num); for(i=2; i<=k; i++) if(num%i==0) return 0; return 1; } int main() { int n,i,j; scanf("%d",&n); if(n<6||n%2) printf("Error!"); else { for(j=3; j<=n/2; j+=2) if(prime(j)&&prime(n-j)) //寻找两个和为i的素数 printf("%d=%d+%dn",n,j,n-j); } return 0; } 标题 7.17八皇后问题 在国际象棋棋盘上:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。 描述 给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。 输入数据 输出数据 第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92) 输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。 2 1 92 15863724 84136275 输入示例 输出示例 //方法一 #include #include #define cc 8 int a[92][cc], chess[cc]; FILE *fp; int check(int x) { //判断第x+1个皇后是否可以放下,可以返回1, //否则返回0 int i; for (i = 0; i < x; i++) //做同列和同对角线检查 if (chess[x] == chess[i] || abs(x-i) == abs(chess[x]-chess[i])) return 0; return 1; } void f(int x) { int j, y; static int z=0; //解的序号 for(y=1;y <=cc; y++) //所有的列都试验 { chess[x] = y; //放下 if (check(x)) //如果可以放 { if(x==cc-1) //最后一个皇后放下了 { for (j = 0; j a[z][j] = chess[j]; z++; } else f(x + 1); //放下一个皇后 } } } int main() { int n, i, j, num; f(0); //找出所有的解 scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d", &num); for (j =0; j < cc; j++) printf("%d", a[num-1][j]); printf("n"); } return 0; } //方法二 #include int board[9][9]; int left[16],right[16],row[9]; int buju[92][8]; FILE *fp; void print_board(); void try_column(intcolumn); int compare(int a[8],int b[8]) { int i; for(i=0;i<8; i++) if(a[i] else if(a[i]>b[i]) return 1; return 0; } void change(int a[8],int b[8]) { int i; int t; for(i=0; i<8; i++) t=a[i],a[i]=b[i],b[i]=t; } void sort(int buju[92][8]) { int i,j,k; for(i=0; i<91; i++) { k=i; for(j=i+1; j<92; j++) if(compare(buju[k],buju[j])>0) k=j; change(buju[i],buju[k]); } } int main() { int i,j,n,p; for (i=1;i<=8;i++) row[i]=1; //初始化行状态 for (i=1;i<=15;i++) { left[i]=1; right[i]=1; } //初始化斜线状态 for (i=1;i<=8;i++) for(j=1;j<=8;j++) board[i][j]= 0; //初始化棋盘状态 try_column(1); sort(buju); scanf("%d",&n); for(i=0;i { scanf("%d",&p); for(j=0; j<8; j++) printf("%d",buju[p-1][j]); printf("n"); } return 0; } void try_column(int column) { int ro = 1; //从第1行开始试 while(ro<=8)//全部8行都要试 { if (row[ro]&&left[ro+column-1] &&right[8+ro-column]) {board[ro][column]=1; row[ro]=0; left[ro+column-1]=0; right[8+ro-column]=0; if (column<8) try_column(column+1);//没到最后一个棋子 else print_board();//到最后一个棋子成功,则输出 board[ro][column]=0; row[ro]=1; left[ro+column-1]=1; right[8+ro-column]=1; } ro++; } } void print_board( ) { int i,j,t; static int k=0; for (i=1;i<=8;i++) { for (j=1;j<=8;j++) if (board[i][j]==1) buju[k][i-1]=j; } k++; } 标题 描述 输入数据 输出数据 输入示例 输出示例 7.18 母牛 有一头母牛,当年年初生一头小母牛。每头小母牛出生第四年的年初(算当年,既三年后),也生一头小母牛,问n年后共有多少头母 一个年份的整数 一个整数 8 28 int niu(int n) { if (n <= 1) return 2; if (n == 2) return 3; if (n == 3) return 4; return (niu(n-1) + niu(n-3)); } int main() { int year; scanf("%d",&year); printf("%d",niu(year)); return 0; } 书面作业: 1.利用函数找出9个数的最大值.请设计一个函数找出9个数的最大值,在主函数中调用这个函数,输出最大值. 2.根据百分制得分给出等级分.设计一个函数根据百分制得分给出等级分,在主函数中调用这个函数 3.顺序查找。输入10个数,再输入一个数x,用从头到尾或从尾到头的方法查找x在10个数中的位置(1-10),输出0表示找不到. 4.写一个函数,将一个5行5列的数组转置。在主函数中输入和输出数组元素.不能使用全局变量。 5.写一个递归函数,将一个整数反序输出。 6.写一个递归函数,把一个数组的元素逆置。在主函数中输入和输出数组元素。 7.编写一个指数运算的函数,参数(double,int) 8.皇后可以走水平、垂直、斜线。在8×8棋盘上如何摆放8个皇后,使得每个皇后都没有被吃掉的危险。 9.从楼上走到楼下共有h个台阶,每一步有3种走法:走1个台阶;走2个台阶;走3个台阶。问可以有多少种方案?并将所有的方案输出。 10.某人摘下一些桃子,第一天卖掉一半,又吃了一个,第二天卖掉剩下的一半,又吃了一个,以后各天都是如此处理,到第n天发现只剩下一只桃子,编写递归函数,n是参数,返回值是一共摘的桃子数 int pear(int n) { if (n==1) return 1; else return ( 2 * ( pear( n-1 ) + 1)); } 11.7.验证“1+1=2”。对任何大于等于6的自然数n,n之内的所有大于等于6的偶数均可以表示为两个素数之和。请验证这个猜想。要求: (1)从键盘上输入一个大于6的自然数 (2)以C=A+B的形式验证,每个偶数只能给出一个验证式(1不是素数)。(3)一行只能输出一个“C=A+B”例如:输入16输出: 6=3+3 8=3+5 (4)写一个判断素数的函数并调用 10=3+7 12=5+7 14=7+7 16=5+11编译预处理上机作业: 标题 描述 输入数据 输出数据 输入示例 输出示例 8.1 带参数的宏练习1-交换 定义一个带参数的宏,使两个参数的值互换。在主函数中输入两个整数,并输出交换后的值 两个整数 交换后的两个整数 7 8 8 7 #include #define s(a,b) {int t; t=a; a=b; b=t;} int main() { int x,y; scanf("%d %d",&x,&y); s(x,y) printf("%d %d",x,y); return 0; } 标题 描述 8.3 带参数的宏练习2-计算机三角形的面积 定义两个带参数的宏,一个计算三角形三边之和的一半,另一个计算三角形的面积.在主函数中输入三角形的三条边,输出三角形的面积. 输入数据 三个整数分别表示三角形的三条边的边长 输出数据 1个表示三角形面积的实数 输入示例 6 6 6 输出示例 15.588457 #include #define s(a,b,c) (a+b+c)/2.0 #define area(a,b,c) sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c)) int main() { int x,y,z; float mianji; scanf("%d%d%d",&x,&y,&z); mianji=area(x,y,z); printf("%f",mianji); return 0; } 标题 8.4 带参数的宏练习3 –判断闰年 描述 输入数据 输出数据 输入示例 输出示例 定义一个宏,判断该年份是否是闰年 一个表示年份的证书 是闰年输出YES,否则输出NO 2100 NO #include #define leap(y) (y)%4==0&&(y)%100!=0|(y)%400==0 int main() { int year; scanf("%d",&year); if(leap(year)) puts("YES"); else puts("NO"); return 0; } 标题 8.5 文件包含练习 将7.13中的3个函数放在一个头文件中: (1)输入10个职工的姓名和职工号 (2)按职工号从小到大排序,职工号也随之调整 (3)根据职工号,用折半查找的方法查找该职工的姓名 主函数调用这3个函数,并在主函数中输入(3)中的职工号,输出查询结果 10个职工的姓名和职工号(姓名是字符串,职工号是整数) 1个职工号 排好序的职工号与姓名 查找到的姓名,找不到输出NO 描述 输入数据 输出数据 zhangsan 10048 lisi 10027 wangwu 20046 zhangdan 10003 zhanghao 30056 输入示例 yaoming 20037 guoyue 10088 lindan 30002 she 20005 zhouhuajian 10002 20005 zhouhuajian 10002 输出示例 zhangdan 10003 lisi 10027 zhangsan 10048 guoyue 10088 she 20005 yaoming 20037 wangwu 20046 lindan 30002 zhanghao 30056 she 书面作业: 分别用函数和带参数的宏,从3个数中找出最大数。并比较它们的差异。 指针 上机作业: 本章作业均要求用指针完成。 标题 描述 输入数据 输出数据 输入示例 输出示例 要求 9.1 整数有序输出 输入3个整数,按由小到大的顺序输出。 三个整数 三个有序整数 7 9 4 4 7 9 主函数中主要负责数据的输入/出 #include void swap(int *p1,int *p2) {int p; p=*p1; *p1=*p2; *p2=p; } void exchange(int *q1,int *q2,int *q3) { if (*q1>*q2) swap(q1,q2); if (*q1>*q3) swap(q1,q3); if (*q2>*q3) swap(q2,q3); } int main() { int a,b,c,*p1,*p2,*p3; scanf("%d%d%d",&a,&b,&c); p1=&a; p2=&b; p3=&c; exchange(p1,p2,p3); printf("%d %d %dn",a,b,c); return 0; } 标题 描述 输入数据 输出数据 输入示例 输出示例 提示 9.2 数据对换 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写3个函数:①输入10个数;②进行处理;③输出10个数 10个整数 10个整数 10 9 7 3 2 6 5 4 8 1 1 9 7 3 2 6 5 4 8 10 其他数据不要变化 void input(int *p) //输入10个整数 {int *t; for (t=p; p } void proc(int *p) //最小的数与第一个数交换,最大的数与最后一个数交换 {int *min,*max,k; min=max=p; //假设第1个既是最大又是最小 for (k=1; k<10; k++) //确定指向最小、最大数的指针 if (*min>*(p+k)) min=p+k; k=*min; *min=*p; *p=k; //最小的数与第一个数交换 for (k=1; k<10; k++) //确定指向最小、最大数的指针 if (*max<*(p+k)) max=p+k; k=*max; *max=*(p+9); *(p+9)=k; //最大的数与最后一个数交换 } void output(int *p) //输出10个整数 {int t; for (t=0; t<10; t++) printf("%3d",*(p+t)); printf("n"); } main() {int a[10]; input(a); //输入10个整数 proc(a); //调换 output(a); //输出 return 0; } 标题 9.3 移位 描述 输入数据 输出数据 输入示例 输出示例 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。 先输入n和m,再输入n个整数 n个整数(%3d) 10 3 1 2 3 4 5 6 7 8 9 10 8 9 10 1 2 3 4 5 6 7 #define N 100 void move(int *p,int n,int k) {int i,t,*r=p; for (i=1; i<=k; i++) //循环M次 {t=*(r+n-1); //记录最后1个数 for (r=p+n-1;r>p; r--) *r=*(r-1); //除最后一个数外所有数右移一个位置 *r=t; //原来最后的数放最前面 } } main() { int a[N]; int *p; int n,m; scanf("%d %d",&n,&m); for(p=a; p move(a,n,m); //移动
版权声明:本文标题:C语言及实验作业参考做法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1702947523h436991.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论