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项之和。

#includeint main()

{

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); //移动

for (p=a; p

printf("%3d",*p);

return 0;

}

标题

描述

输入数据

输出数据

输入示例

输出示例

9.4 字符串复制

有一个字符串,包含若干个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串(不能调用库函数strcpy)

先输入m,再输入一个字符串

一个字符串

3

abcdefgh

cdefgh

#include

char s1[20]={'0'},s2[20];

char *strcopy(char *s,char *t,int m)

{

int i=m-1;

while( (*(s+i-m+1)=*(t+i))!='0')//先赋值再判断

i++;

return s;

}

int main()

{

int t;

gets(s2);

scanf("%d",&t);

strcopy(s1,s2,t);

puts(s1);

return 0;

}

标题

描述

输入数据

输出数据

输入示例

输出示例

9.5 判断子串

判断一个字符串是否是另一个串的子串

两个字符串

一个字符串是否是另一个串的子串输出YES,否则输出NO

cde

aabbcdefghbcd

YES

#include

#include

char *strcopy(char *s,char *t,int m)//从t[]中取长度为m的子串放s[]中

{

int i=0;

while( i

{*(s+i)=*(t+i);

i++;

}

*(s+i)='0';

return s;

}

int substring(char *s1,char *s2)

{ int len1,len2,i;

char s[80];

len1=strlen(s1);

len2=strlen(s2);

for(i=0; i<=len2-len1;i++)

{ strcopy(s,s2+i,len1); //取子串

if(strcmp(s,s1)==0) return 1; //判断是否相同

}

return 0;

}

int main()

{ char s1[80],s2[80];

gets(s1);

gets(s2);

if(substring(s1,s2))

printf("YES");

else printf("NO");

return 0;

}

标题

描述

输入数据

输出数据

9.6 位置调整

将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序从左到右,从上到下顺序依次从小到大存放),写一函数实现之。用main函数调用。

一个5*5的矩阵

一个5*5的矩阵(%3d)

6 7 18 9 14

5 24 2 9 10

22 8 5 1 8

4 12 5 7 2

13 33 8 7 9

1 7 18 9 2

5 24 14 9 10

22 8 33 6 8

9 12 5 7 13

2 5 8 7 4

输入示例

输出示例

#include

int* find(int *a,int *v)//返回最小值地址,*v存放最小值

{ int *r,*p;

r=p=a;

while(r

{ if(*r<*p) p=r;

r++;

}

*v=*p;

return p;

}

int main()

{ int a[5][5];

int *p,*r,(*t)[5];

int *s[4],v[4];

int i,j,c;

for(i=0;i<5; i++)

{t=a+i;

for(j=0; j<5; j++)

scanf("%d",*t+j);

}

for(p=*a,r=p; p<*a+25; p++)

if(*r<*p) r=p;

c=a[2][2]; a[2][2]=*r; *r=c;

s[0]=find(*a,v+0); //找最小值地址s[0]和最小值v[0]

*s[0]=a[0][0]; a[0][0]=999;

//把a[0][0]放最小值位置,为防止再次找到该值,置为一个不可能的大值999

s[1]=find(*a,v+1); //找第二小值地址s[1]和第二小值v[1]

*s[1]=a[0][4]; a[0][4]= 999; //把a[0][4]放第二小值位置

s[2]=find(*a,v+2); //找第三小值地址s[0]和第三小值v[2]

*s[2]=a[4][0]; a[4][0]=999; //把a[0][0]放第三小值位置

s[3]=find(*a,v+3); //找第四小值地址s[1]和第四小值v[3]

*s[3]=a[4][4]; a[4][4]=999; //把a[4][4]放第四小值位置

a[0][0]=v[0]; a[0][4]=v[1]; a[4][0]=v[2]; a[4][4]=v[3];

for(i=0;i<5; i++)

{t=a+i;

for(j=0; j<5; j++)

printf("%3d",*(*t+j));

printf("n");

}

return 0;

}

标题

描述

输入数据

输出数据

输入示例

9.7 字符串排序1

在主函数中输入10个字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。要求用行指针实现。

10个字符串

从小到大有序的10个字符串

qwe

asd

zxc

hg

up

cctv

are

not

goto

head

are

asd

cctv

goto

head

hg

not

qwe

up

zxc

输出示例

#include

#include "string.h"

#define N 8

sort(char (*p)[20]) //利用行指针对10个字符串进行排序

{int i,j; char k[20];

for (i=0; i

for (j=i+1; j

if (strcmp(*(p+i),*(p+j))>0) //*(p+i)表示第i个串

{ strcpy(k,*(p+i));

strcpy(*(p+i),*(p+j));

strcpy(*(p+j),k);

}

}

int main()

{char ch[N][20]; int i,j;

char *t[N];

for (i=0; i

gets(ch[i]);

sort(ch); //利用行指针排序

for(i=0; i

puts(ch[i]);

return 0;

}

标题

描述

输入数据

输出数据

9.8 字符串排序2

在主函数中输入10个字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。要求用指针数组实现。

10个字符串

从大到小有序的10个字符串

qwe

asd

zxc

hg

up

cctv

are

not

goto

head

zxc

up

qwe

not

hg

head

goto

cctv

asd

are

输入示例

输出示例

#include

#include "string.h"

#define N 10

sort(char *p[N]) //利用指针数组对N个字符串进行排序

{int i,j; char k[20];

for (i=0; i

for (j=i+1; j

if (strcmp(*(p+i),*(p+j))>0) //*(p+i)表示第i个串

{ strcpy(k,*(p+i));

strcpy(*(p+i),*(p+j));

strcpy(*(p+j),k);

}

}

int main()

{char ch[N][20]; int i,j;

char *t[N]; //定义指针数组

for (i=0; i

{ gets(ch[i]);

t[i]=ch[i]; //建立联系

}

sort(t); //利用指针数组排序

for(i=0; i

puts(ch[i]);

return 0;

}

标题

描述

输入数据

输出数据

9.9 字符串排序3

在主函数中输入8个字符串。用另一函数对它们排序。然后在主函数输出这8个已排好序的字符串。要求用指向指针的指针实现。

8个字符串

从小到大有序的8个字符串

qwe

asd

zxc

up

cctv

not

goto

head

asd

cctv

goto

head

not

qwe

up

zxc

输入示例

输出示例

#include

#include "string.h"

#define N 8

sort(char **p) //利用指针数组对N个字符串进行排序

{int i,j; char k[20];

for (i=0; i

for (j=i+1; j

if (strcmp(*(p+i),*(p+j))>0) //*(p+i)表示第i个串

{ strcpy(k,*(p+i));

strcpy(*(p+i),*(p+j));

strcpy(*(p+j),k);

}

}

int main()

{char ch[N][20]; int i,j;

char *t[N]; //定义指针数组

for (i=0; i

{ gets(ch[i]);

t[i]=ch[i]; //建立联系

}

sort(t); //利用指针数组排序

for(i=0; i

puts(ch[i]);

return 0;

}

标题 9.10 成绩计算

有一个班4个学生,5门课程。①求第一门课程的平均分;②找出有2门(含)以上课程不及格的学生,输出他们的学号(1-4)和全部课程成绩及平均成绩;③找出平均成绩在90分以上或全部课程成绩在85分以上的学生。分别编3个函数实现以上3个要求。

表示4个学生,5门课程成绩的整数

第一行输出第一门课程的平均分

接下来输出有2门以上课程不及格的学生,每个学生占3行

接下来输出平均成绩在90分以上或全部课程成绩在85分以上的学生,每个学生占3行(整数用%4d,实数用%.2f,粗体部分)

96 82 88 99 97

78 89 96 76 65

67 55 87 34 44

87 88 89 87 93

average of score 1 is 82.00

number 3 failed with 3

his score is 67 55 87 34 44

average score is 57.40

number 1 is very good

his score is 96 82 88 99 97

average score is 92.40

number 4 is very good

his score is 87 88 89 87 93

average score is 88.80

用两种指针

描述

输入数据

输出数据

输入示例

输出示例

要求

#include

void average1(int (*p)[5],int n) //计算第一门课的平均分

{int i,aver=0;

for (i=0; i

aver+=**(p+i);

printf("average of score 1 is %.2fn",aver*1.0/n);

}

void average2(int (*p)[5], int *a) //计算每个学生的平均分放在数组a[]中

{int i,j,sum;

for(i=0; i<4; i++)

{sum=0;

for(j=0; j<5; j++)

sum+=*(*(p+i)+j);

*(a+i)=sum/5.0;

}

}

void find1(int (*p)[5],int *a) //输出有两门以上不及格的学生

{int i,j,k,sum;

for (i=0; i<4; i++)

{k=0;sum=0;

for (j=0; j<5; j++) //统计每个学生不及格的门数k

{if (*(*(p+i)+j)<60) k++;

sum+=*(*(p+i)+j);

}

if (k>=2)

{printf("number %d failed with %dn",i+1,k);

printf("his score is");

for (j=0; j<5; j++)

printf("%4d",*(*(p+i)+j));

printf("naverage score is %.2fn",sum/5.0);

}

}

}

void find2(int (*p)[5],int *a) //输出平均分在90分以上或每门课85分以上的学生

{int i,j,k,sum;

for (i=0; i<4; i++)

{k=0;sum=0;

for (j=0; j<5; j++) //统计每个学生85分以上门数k

{ if (*(*(p+i)+j)>=85) k++;

sum+=*(*(p+i)+j);

}

if (k==5||*(a+i)>=90)

{printf("number %d is very goodn",i+1);

printf("his score is");

for (j=0; j<5; j++)

printf("%4d",*(*(p+i)+j));

printf("naverage score is %.2fn",sum/5.0);

}

}

}

int main()

{int score[4][5]={{96,82,88,99,97},{78,89,96,76,65},

{67,55,87,34,44},{87,88,89,87,93}};

int i,j;

float aver[4];

for (i=0; i<4; i++) //输入4个学生5门课的成绩

for (j=0; j<5; j++)

scanf("%d",*(score+i)+j);

average1(score,4); //计算第一门课的平均分

average2(score,aver); //计算每个学生的平均分放在数组aver中

find1(score,aver); //输出有两门以上不及格的学生

find2(score,aver); //输出平均分在90分以上或每门课85分以上的学生

return 0;

}

标题

描述

输入数据

输出数据

输入示例

输出示例

9.11 整数排序

用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数中输出。

整数n和n个整数

n个整数(最后一个数后面还有一个空格)

12

5 4 3 6 7 9 12 19 32 13 29 10

3 4 5 6 7 9 10 12 13 19 29 32

#include "stdio.h"

void sort1(int **p,int N)//利用指向指针的指针排序

{int i,j,k,*t;

for (i=0; i

{k=i;

for (j=i+1; j

if (*(*(p+k))>*(*(p+j))) k=j;

if (k!=i)

{ t=*(p+i); *(p+i)=*(p+k); *(p+k)=t; }

}

}

int main()

{int i,j;

int N,**k;

scanf("%d",&N);

k=(int **)malloc(N*sizeof(int *));

for (i=0; i

{ k[i]=(int*)malloc(sizeof(int));

scanf("%d",k[i]); //输入N个整数

}

sort1(k,N); //利用指向指针的指针排序

for(i=0; i

printf("n");

for(i=0; i

free(k[i]);

free(k);

return 0;

}

书面作业:

1.写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

#include //方法一

int length(char *str) //计算字符串的长度{int len=0;

while(*str++!='0') len++;

return len; //返回串长}//方法二

int length(char *str) //计算字符串的长度{int char *p=str; while(*str!='0') str++;}main()

return str-p; //返回串长{char str[80];

printf("input a string:n"); gets(str); //输入串

printf("the length of string is %dn",length(str)); //输出串长

}

2.将n个数按输入时顺序的逆序排列,用函数实现。3.输入一个字符串,内有数字和非数字字符,例如:a123x456 17960? 302tab5897

将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123放在a [0],456放在a[1]„„统计共有多少个整数,并输出这些数。

#include

int main( )

{ int i, word=0;

char string[81]="5hgf hgh765 htfjh89myt 76"; int a[20],k=-1;

gets(string);

for(i=0; string[i]!='0'; i++)

if (string[i]<'0'||string[i]>'9') word=0; else if(word==0)

{ word=1; k++;

a[k]=string[i]-'0';

}

else a[k]=a[k]*10+string[i]-'0';

for(i=0; i<=k;i++)

printf("%d ",a[i]);

return 0;

}

4.写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为

int strcmp(char *p1,char *p2);

设p1指向字符串s1,p2指向字符串s2。要求当s1=s2时,返回值为0;若s1≠s2,返回它们二者第一个不同字符的ASCII码差值(如”BOY”与“BAD”,第二个字母不同,”O”与“A”之差为79-65=14)。如果S1>S2,则输出正值;如果S1

5.编写一个函数alloc(n),用来在内存区新开辟一个连续的空间(n个字节)。此函数的返回值是一个指针,指向新开辟的连续空间的起始地址。再写一个函数free(p),将地址p开始的各单元释放(不能再被程序使用,除非再度开辟)。

提示:先在内存区确定出一片相当大的连续空间(例如1000个字节)。然后开辟与释放都在此空间内进行。假设指针变量p原已指向未用空间的开头,调用alloc(n)后,开辟了n个字节可供程序使用(例如,可以赋值到这些单元中)。现在需要使p的值变成p+n,表示空白未用区从p+n地址开始,同时要将新开辟

区的起始位置(p)作为函数值返回,以表示可以利用从此点开始的单元。如果要新开辟的区太大(n大),超过了预设的空间---1000字符,则alloc(n)函数返回指针NULL,表示开辟失败。

alloc(n)应返回一个指向字符型数据的指针(因为开辟的区间是以字节为单位被利用的)

6.写一个函数,将一个m*n的整型矩阵转置(用2种指针)

#define M 5#define N 6main()

{int b[M][N],t[N][M]; int i,j,(*p)[N]; //定义行指针 p=b;

turn1(p,t[0]); //利用行指针进行转置 for (i=0; i

for (j=0; j

printf(j==0?"n%3d":"%3d",*(*(p+i)+j)); //输出转置后的数组

return 0;}

void turn1(int (*x)[N],int *y) //利用两种指针进行转置{int i,j,t; for (i=0; i

for (j=0; j

7.写一个用矩形法求定积分的通用函数,分别求,,

8.编一程序,输入月份号,输出该月的英文月名。例如,输入“3”,则输出“March”,要求用指针数组处理。

9.在主函数中输入10个字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。要求用元素指针(列指针)实现。

结构体与共用体上机作业:标题

描述

10.1 日子计算

定义一个结构体变量(包括年、月、日)。注意闰年问题。

写一个函数days, 用结构体变量(包括年、月、日)做参数,计


本文标签: 输出 输入 函数