版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2.7函数与预处理
1.【习题解答】
一、单项选择题:
LB2.B3.C4.A5.A6.A7.A8.B9.B10.Dll.C12.C
二、填空题
1.include<math.h>
pow(x,n)
i<=n
2.n>()
n%2==0
return(y);(或returny)
3.n[10]
!=’\n'
n[ch,O']++
三、程序改错题
1.gets(str);
for(i=0;c[i]!='\0,;i++)
if((c[i]>'a,&&c[i]<=,z')||(c[i]>='A'&&c[i]<='Z'))
2.printf("Thenewstringis%s\n",str);
str[i+j]=str2fj];
str[i+j]='\0"
3.voidpalin(intn)
if(n<=l)
palin(n-l)
4.i=p-l;
del(s,p,n);
5.t=a[i];
return0;
nReturn=fun(a,10);
6.max=0;
returnmax;
max=getMaxFromArray[a,10];
四、阅读程序题
1.16
2.p=2,q=3
3.(1)4,1
(2)1
(3)5,6
(4)4,6
4.1010
5.1
216
6.123
五、程序设计题
1.写一个函数,求3个数的最大值。
#include<stdio.h>
intmax(intx,inty)
(
returnx>y?x:y;}
intmax3(intx,inty,intz)
{
intt;
t=max(x,y);
returnz>t?z:t;}
voidmain()
(
inta,b,c,t;
printf("inputthreenumbers:");
scanf(u%d%d%d,,,&a,&b,&c);
t=max3(a,b,c);
printf(uThemaxnumberis
)
2.写一个函数,对数列s=l*2*3+3*4*5+...+n(n+l)[n+2)求和。
#include<stdio.h>
intsum(intn)
I
inti,s;
s=();
for(i=l;i<=n;i+=2)
s=s+i*(i+l)*(i+2);
returns;
voidmain()
intn;
printf(Hinputn:");
scanf(M%dM,&n);
printf(u1*2*3+3*4*54-...4-%d*(%d)*(%d)=%dM,n,n+l,n+2,sum(n));
}
3.古希腊数学家欧儿里得发明了一种计算两个整数最大公约数的方法,如下:
(a)如果A/B的余数为0,B为最大公约数
(b)如果不是0,B赋给A,A/B的余数赋给B
(c)回到步骤a,重复比过程
请按上述方法编写一个求最大公约数的函数。
#includeHstdio.h"
longgys(longnum1,longnum2)
{longresult,temp;
while(l)
{if((temp=numI%num2)==0)
{result=num2;
break;}
else
{numl=num2;
num2=temp;}
)
returnresult;
}
voidmain()
{longn,m;
scanf("%ld,%ld';&n,&m);
if(n<m)
printf("Theresultis%ld\n",gys(m,n));
else
printf("Theresultis%ld\nM,gys(n,m));
}
4.写一个函数,当输入整数n,输出高度为n的等边三角形,当n=5时的等边三角形
如下:
*
***
q、rj».卜
*******
*********
#include<stdio.h>
voidtriangle(intn)
(
inti,j;
for(i=0;i<n;i++)
(
for(j=0;j<=n-i;j++)
putchar(*');
for(j=0;j<=2*i:j++)
putchar('*');
putcharCXn1);
)
)
voidmain()
{
intn;
printf(uentern:H);
scanf("%d",&n);
printf(H\nw);
triangle(n);
)
5.递归法求解l+2+3+...+no
#include<stdio.h>
#defincN100
intsum(inta[],intn)
(
ints;
if(n==l)
s=a[n-l];
else
s=sum(a,n-l)+a[n-l];
returns;
voidniain()
inta[N],n,i,k;
scanf(M%dM,&n);
for(i=0;i<n;i++)
a[i]=i+l;
k=sum(a,n);
printf(u%d\nM,k);
)
6.写一函数,输入4个数字字符,要求输出这4个数字字符时每两个数字间空一个空
格。例如:输入2012,应输入“2012”。
#include"stdio.h"
#include"string.h"
voidinput(charb[10]);
voidmain()
(
chara[101:
inti;
for(i=0;i<4;i++)
scanf("%cn,&a[i]);
input(a);
for(i=0;i<7;i++)
printf("%c",a[i]);
)
voidinput(charb[10])
(
inti,j;
for(i=0;i<6;i+=2)
(
j=i;
while(b[j]!=W)
j++;
while(j>i+l)
(
bU]=b[j-l];
j-;
)
b[jl='';
1
7.编写一个函数,计算c(〃2")=———0
#include<stdio.h>
longfact(intx);
voidmain()
(
intm,n;
longcmn;
printf(KInputm,n:");
scanf(H%d,%dM,&m.&n);
cmn=fact(m)/(fact(n)*fact(m-n));
printf(uThecombinationis%ld\nM,cmn);
)
longfact(intx)
(
longy;
for(y=l;x>0;-x)
y*=x;
retum(y);
)
8.成本分析是工程中的一个重要部分。实践中,你需要编写一个程序来计算最小的花
费来作为一个工程的决策工具。
为了修建一个有跑道的机场,我们需要填充一块区域,承包商有两辆工程车,一辆车
最多可以运8吨,另一辆最多可以运12吨。8吨和12吨的卡车每次的运输成本分别为400
元和550元。为保证安全,每辆工程车的载重不能超出其运输量的80%。
写一个程序计算运送给定吨数所需要的最小成本。提示用户输入给定的吨数,输出每
辆卡车需要的运输次数和花费以作为建议的方案。使用模块化来设计本程序。
#includc"stdio.h"
#dcfineMINNUM65535
voidcost(intweight)
{inti,j,cost,flag;
intmin_carl=0,min_car2=0,min_cost=MINNUM;
for(i=1;i<=weight/8;i++)
{Aag=l;
for(j=l;j<=weight/l2&&flag;j++)
if((i*8*0.8+j*12*0.8)>=weight)
{flag=0;
cost=i*400+j*550;
printf("Thetimesofcarlis%d,Thetimesofthecar2is%d,
Thecostis%d\n'\i,j,cost);
if(min_cost>cost){min_cost=cost;min_car1=i;min_car2=j;}
)
)
printf("Thesuggestionis:\n");
printf("Thetimesofcar1is%d;Thetimesofthecar2is%d;Themincostis%d\n'\
min_car1,min_car2,min_cost);
}
voidmain()
{intweight;
prinlf(nPleaseinputtheweightofthegoods:0);
scanf("%d",&weight);
cost(weight);
2.【实验解答】
实验名称函数程序设计
l.n*f(n-l)x=f(i)
2.power*=im<=nsum+=fl(m,k)
3.
(1)运行结果:xl=8/*此处x为全局变量*/
x2=5/*此处x为局部变量初
(2)运行结果:xl=8/*此处x为全局变量*/
x2=5/*此处x为局部变量叼
x3=8/*此处x为引用外部变量*/
(3)此程序中x均为静态变量,但两个变量x所处的域不同
运行结果:
i=lx=8y=5
i=18x=20
i=lx=8y=5
4.
(1)此程序功能是将数组中元素按从大到小排序,本题运行结果是
10753-7o
(2)此程序考查的是带参数的宏展开,代入宏,展开得a/=k+m*k+m/k+m*k+m。代入
值得程序运行结果是3。
5.编程并上机调试运行
(1)写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息。
#include<stdio.h>
intprime(intn)
(
inti;
for(i=2;i<n;i++)
if(n%i==())break;
if(i>=n)
return1;
else
return0;
voidmain()
{intn;
printf(uInputainteger:M);
scanf("%d",&n);
if(prime(n))
printf(u%disaprime\nM,n);
else
printf(u%disnotaprime\n",n);
(2)输入一个整数,将它逆序输出。要求定义并调用函数reverse(number),它的功能
是返回number的逆序数。例如reverse(12345)的返回值是54321。
#include"stdio.h"
longreverse(longnumber)
(
longsum=(),s,flag;
if(number>=0)
flag=l;
else
flag=-l;
number=flag*number;
while(number!=0)
{s=number%10;
sum=sum*104-s;
number=number/l0;
)
returnflag*sum;
)
voidmain()
{longn,m;
scanf("%ld",&n);
m=reverse(n);
printf("%ldM,m);
)
(3)用递归法求n阶勒让德多项式的值,递归公式为:
1(n=0)
Pn(x)="x(n=1)
((2n-1)•x-pn_,(x)-(n-1)-pn_2(x))/n(n2)
#include<stdio.h>
doublep(intn,doublex)
(
if(n=0)
return1;
else
if(n==l)
returnx;
else
return((2*n-1)*x-p(n-1,x)-(n-1)*p(n-2,x))/n;
)
voidmain()
{
intn;
doublex;
printf(HInputnandx:\n");
scanf(H%d,%lf,&n,&x);
printf(u%f,p(n,x));
}
(4)编写一函数,由实参传递一个字符串,统计此字符串中字母、数字、空格和其他
字符的个数,在主函数中输入字符串以及输出上述结果。
#include<stdio.h>
#include<string.h>
intIctter=0,digit=0,spacc=0,othcr=0;
voidcount(chars[J)
{
inti=();
while(s[i]!=,\0,)
(
if(s[i]>=,A,&&s[i]<=<Z>||s[i]>=a,&&s[i]<=iz,)
letter++;
else
if(s[i]>=,0,&&s[i]<=9,)
digit++;
else
if(s[i]==*)
space++;
elseother++;
i++;
)
}
voidmain()
(
chars[20J;
printf(uPlcseinputastring:*');
gets(s);
count(s);
printf(ulcttcr=%d,digit=%d,spacc=%d,other=%d\nn,letter,digit,space,other);
I
(5)定义一个带参数的宏,使两个参数的值互换,并写出程序,输入两个数作为使用
宏时的实参。输出己交换后的两个值。
#include<stdio.h>
#defineswap(a,b)t=a;a=b;b=t;
voidmain()
(
inta,b,t;
scanf(H%d%dn,&a,&b);
swap(a,b);
printf(H%d,%d",a,b);
(6)编写函数,实现两个字符串连接,在主函数中输入两个字符串以及输出连接后的
结果(不要用库函数是strcat)
#include<stdio.h>
#include<string.h>
voidmain()
(
voidconnect(charsl[],chars21]);
charsl[20],s2[20J;
printf(uPleaseinputstring1:”);
gcts(sl);
printf(uPlcascinputstring2:n);
gets(s2);
connectsl,s2);
printf(uTheconnectedstringis:");
puts(sl);
)
voidconnect(charsif],chars2[l)
{
intlength
length1=strlen(sl);
for(i=length1,j=O;s2[j]!=<\O,;i++,j++)
sl[i]=s2[j];
sl[i]=\0\
(7)请编写函数fun,它的功能是:求出1到1000之内能被7或11整除、但不能同时
被7或11整除的所有整数并将它们放在a所指的数组中,通过n返回这些数的个数。在主
函数中输出这些整数,并给出统计的总数。
#include<stdio.h>
intfun(inta[J)
{inti,n=0;
for(i=l;i<=1000;i++)
if(((i%7==0)||(i%11==0))&&(i%77!=0))
{a[n]=i;
n++;
)
return(n);
1
voidmain()
{inta[500],m,k;
m=fun(a);
for(k=();k<m;k++)
{if(k%5==0)printf(,'\nn);
printf(H%5d';a[k]);
}
printf(H\nThenumberis%d\n",m-l);
}
(8)设有未完成的函数:
charGetChar(charc)
{chars[尸'9038571426'”
1
字符串s中无序的存储了10个数字字符,没有重复。函数的功能是:
如果字符c不是数字字符,函数原样返回该字符;
在s中查找字符c并返回其在s中的前一个字符。如果该字符位于s的最前面(字符,9'),
则返回最后一个字符'6'。
例如;
GetChar(4)得到字符T,GetChar(T)得到字符T
请完成该函数并在主函数中调用。
#include<stdio.h>
charGetChar(charc)
{chars[]=n90385714260;
inti;
chartemp;
if(c>='0'&&c<='9')
{for(i=0;i<10;i++)
if(c==s[i])
if(i!=0)temp=(s[i-l]);
elsetemp=s[9];
returntemp;
)
else
returnc;
1
voidmain()
charc;
c=getchar();
printf(M%c",GetChar(c));
)
3【思考题】
(1)请分析不返回值的函数定义与有返回值的函数定义有什么不同?思考这两类函数
在实际编程中的作用。
答:不返回值的函数在定义时需在函数名前加void,在函数体中不能再使用return返
回函数值。不同于有返回值的函数,不返回值的函数通常用来完成一个不需要返回函数值
的功能或任务。
(2)请观察本次实验中使用的函数都有几个返回值,当一个函数需要有多个返回值时,
应该如何处理?
答:一个函数只能使用return返回一个函数值,如果需要返回多个值需要使用具有传
地址功能的指针变量作为形参,不建议使用全局变量。
(3)数组作为函数参数有哪几种方式?这些方式中有没有能解决之前“函数多值返回问
题'’的方法。
答:数值作为函数有数组元素作函数参数,数组名作函数参数。用数组名作为函数的
参数实现的是地址传递,能使得形参和实参占用数组首地址开始的同一段地址空间,此时
形参的变化将影响到实参,从而实现函数的多值返回。
(4)请分析下面程序的作用。
/*format.h*/
#defineDIGIT(d)printf("整数输出:%d\n",d)
#defmeFLOAT(f)printf("实数输出:%l().2f\n",f)
#defineSTRING(s)printf("字符串输出:%s\n",s)
,"user'sprogram*/
#include<stdio.h>
#include<format.h>
intmain()
intd,num;
floatf;
chars[80];
printf("请选择输入格式:1.整数,2-实数,3.字符串:”);
scanf("%d”,&num);
switch(num)
{case1:printf("请输入一个整数:");
scanf(n%dn,&d);
DIGIT(d);
break;
case2:printf("请输入一个实数:");
scanf(”%F,&f);
FLOAT(t);
break;
case3:printf("请输入一个字符串:”);
scanf("%su,s);
STRING(s);
break;
default:printf("输入有错误!”);
}
return0;
1
答:此段程序通过使用带参数的宏定义实现了对打印方式的灵活控制。首先定义了一
个头部文件format.h,在此头文件中用宏定义设计了3种输出格式。用户文件用#include语
句将这个头文件的内容包含进来。
2.8指针
1.【习题解答】
一、选择题
1.A2.D3.B4.B5.B
6.C7.A8.A9.B10.C
11.B12.A13.C14.B15.B
二、程序填空题
1.0,!(s[i]>=,0,&&s[i]<=,9,),'\0'
2.x[i][i],j<=i,x[i-l]rj-l]+X[i-l][j]
3.i=0,
4.\0,*string
5.&arrayf01[0],&row,*(*(pointer+row)+col)
6.array_strl,anay_str2
三、程序改错题
1.pa=a、i=l改为i=0、*(pa+i)
2.二二改为!二、++p2>=pl++>*p2
3str、-p>=str、木p
4.(*p)改为*p、&ch[i]改为ch[i]、“0"改为a
5.&name改为name、strcmp(name[k],name[j])eftslrcmp(*name[k],*name[j])、name
改为*name
四、阅读程序题
1.abedeedeba
2.1113151719(数字前均输出一个空格)
3.9,9
7.11
4.63
5.6385
五、程序设计题
1.将10个整数存入一维数组中,编程实现逆序存放并输出。
#include<stdio.h>
voidmain()
inta[10],*p/:head,*end,temp;
printf("pleaseinput1()numbers:\n");
for(p=a;p<=a+9;p++)
scanf("%d",p);
printf("Theoriginalarray:\n");
for(p=a;p<=a+9;p++)
printf(M%d
head=a;end=a+9;
while(head<end)
(
temp=*head;
*head=*end;
*end=temp;
head++;
cud—;
)
printf("Thearrayhasbeeninverted:\n");
for(p=a;p<=a+9;p++)
printf("%d”/p);
I
2.将3行3列的二维矩阵转置输出。
#include<stdio.h>
voidmain()
(
inta[3][3]={{l,2,3),[4,5,6},{7,8,9});
intb[3][3],i,j,*p=a;
printff“arraya:\nM);
for(i=0;i<=1;i++)
(
for(j=0;j<=2;j十十)
(
printfT%5d”,*p);
b|j][i]=a[i][j];
}
printfT'n");
)
printfl[uarrayb:\n");
for(i=0;i<=2;i++)
(
for(j=0;j<=2;j++)
printf("%5d”,*p);
printfC'n");
)
)
3.对输入的6个字符串按从小到大的顺序排序,用指针方法输出己排好序的字符串。
#includc<stdio.h>
voidmain()
{char*alpha[6]={"a"Jbc”Jdcf\TJ23",“qq”
inti;p=alpha;
for(i=0;i<6;i++,p+4-)
printf("%s”,*p);
printff44\f,);p=p-3;
for(i=0;i<6;i++,p++)
printf(%c\t,**p);
printW);}
4.编程实现两个字符串的比较,不用系统函数strcmp。
#include<stdio.h>
voidmain()
(
intstrcmp(char*p1,char*p2);
inti;
charstrl[10],str2[10];
puis(”请输入两个字符串:");
puts("字符串1:");
gets(strl);
puts("字符串2:”);
gets(str2);
printf("比较结果为:%d\n",strcmp(strl⑼⑵);
)
intstrcmp(char*pl,char*p2)
(
inti=0;
while(*(p1+i)==*(p2+i)&&*(pl+i)!=0)i++;
return(*(pl+i)-*(p2+i));
)
5.编程实现对两个字符串进行交叉连接。例如:有两个字符串“abed"、“1234”,交叉连
接后结果为“alb2c3d4
#include<stdio.h>
voidmystrcat(char*s,char*ct)
(
while(*(s++));
while(*ct)
*(s++)=*(ct++);
*s='\0';
}
intmain()
(
charna[100],nb[100];
gets(na);
gets(nb);
mystrcat(na,nb);
printf(,,%s\n",na);
return0;
)
2.【实验解答】
1.⑴①a或a[0]②j=k③a[j][k]=l
(2)①处填*②处填ps+10③处填ps
(3)①&a②&b
2.(1)sum=0>p=&a[N-l]>sum+=*p;
(2)voidsw叩(ini*pl,int*p2)、intt;、swap(&x,&y);
3.(1)程序功能:输出26(指针操作)
(2)程序功能:判断输入字符串中是否有字符k
4.
(1)使用变量的指针作函数调用的实参,降序输出3个整数。
voidexchange(int*pointerl,int*pointer2)
{inttemp;
temp=*pointerl,*pointerl=*pointer2,*pointer2=temp;
/*主函数main()*/
voidmain()
{intnum1,num2,num3;
/*从键盘上输入3个整数*/
printf("Inputthefirstnumber:");scanf("%d",&numl);
printf("Inputthesecondnumber:");scanf("%dn,&num2);
printfC'Inputthethirdnumber:");scanf("%d",&num3);
printf("num1=%d,nnm2=%d,ni]m3=%d\nu,nurnl,num?,num3);
/*输出3个变量的初值*/
/*排序*/
if(numl<num2)/*numl<num2*Z
exchange(&numl,&num2);/*指针作实参调用函数exchange(),互换
numl和num2的值*/
if(numl<num3)exchange(&numl,&num3);
if(num2<num3)exchange(&num2,&num3);
/*输出排序结果*/
printf("排序结果:%d,%d,%d\n",num1,num2,num3);
)
<2)将数组a中的n个整数按相反顺序存放。
voidinv(inl*x,intn)/*形参x为指针变量*/
(
int*p,temp,*i,*j,m=(n-1)/2;
i=x;j=xin-1;p=xim;
for(;i<=p;i++,j--)
{temp=*i;*i=s*j;*j=temp;)
return;
)
voidmain()
{inti,a[10]={3,7,9』1,0,6,75,4,2};
printf("Theoriginalarray:\n");
fbr(i=();i<10;i++)
printf("%d,';a[i]);
printf("\n");
inv(a,10);
printf("Thearrayhasbenninverted:\n");
fbr(i=0;i<10;i++)
printf(H%d,",a[i]);
printf(n\n");
(3)从7个数中找出其中最大值和最小值(用指针实现)
intmax,min;
voidmax_min_value(intarray[],intn)
(
int*p,*array_end;
array_end=array+n;
max=min=*array;
for(p=array+1;p<array_end;p++)
if(*p>max)max=*p;
elseif(*p<min)min=*p;
)
voidmain()
{
inti.number[7];
printf(uenter7data\n");
for(i=0;i<7;i++)
scanf("%d”,&number[i]);
max_min_value(number,7);
printf("\nmax=%d,min=%d\n”,max,min);
)
(4)编写函数实现在字符数组w中插入字符x。函数原型是:voidfun(char*w,char*x,int
*n);o说明:
1)假设w数组中的数已按由小到大顺序存放;
2)n指向存储单元中数组元素的个数;
3)插入后数组中的数仍有序。
voidfun(char*w,charx,int*n)
{inti,p;
P=0;
w[*n]=x;
while(x>w[p])p++;
for(i=*n;i>p;i--)
w[i]=*(w+i-l);
wfp]=x;
++*n;
(5)编写函数实现求其字符串的长度,运行时输入字符串。
#include<stdio.h>
intlen(char*str)
inii=0;
while(*str++)
i++;
returni;
}
voidmain()
(
chars[8OJ;intnum;
gets(s);
num=len(s);
printf("%d”,num);
I
(6)用函数调用方式,实现字符串的复制。
voidstring_copy(char*str_from,char*str_to)
{inti=0;
for(;(*(str_to+i)=*(str_from+i))!='\0';i++);/*循环体为空语句*/
)
voidmain()
{staticchararray_strl[20]="Iamateacher/*;
chararray_str2[20];
string_copy(array_strl,array_str2);/*数组名作实参*/
printf(narray_str2=%s\n",array_str2);
)
/*string_copy()函数:复制一个字符串*/
/*形参:字符指针stjfrom接收源串,字符指针str」o存储目标串*/
(7)编写函数将字符串s中的子字符串si全部替换为子字符串s2.用指针、函数实现.
#include<stdio.h>
#include<string.h>
#defineMAXLENGTH100
voidreplace(char*s,char*sl,char*s2)
(
intlenl=strlen(s),Ien2=strlen(sl),len3=strlen(s2);
charbuf[MAXLENGTH];
inti,j,k,1;
for(i=(),k=0;i<ien1-lcn2+1)
(
for(j=();j<len2;j++)
I
if(*(s+i+j)!=*(sl+j))break;
)
if(j==len2)
(
1=0;
while(I<len3)*(buf+k++)=*(s2+l++);
i+=len2;
continue;
}
else
(
*(buf+k++)=*(s+i++);
}
1
while(i<lenl)*(buf+k++)=*(s+i++);
东(buf+k)='\0';
strcpy(s,but);
)
voidmain()
(
charstr[MAXLENGTH]={NULL};
charstr1[MAXLENGTH]={NULL};
charstr2[MAXLENGTH]={NULL);
printf("请输入字符串s:\n");
gets(str);
fflush(stdin);
printf("请输入字符串sl:\n");
gets(strl);
fflush(stdin);
printf(”请输入字符串s2:\n");
gets(str2);
replace(str,strl,str2);
printf("替换后的字符串:%s\n”,str);
return0;
)
(8)将输入的字符串逆序输出。
#include<stdio.h>
#include<string.h>
intfun(char*);
intmain()
(
chara[256];
printfC请输入字符串:");
gets(a);
fun(a);
prindT逆序转换后的字符串是:\n");
puts(a);
)
intfun(char*s)
{
intn,i;charc;
n=strlen(s);
printf(n%d",n);
for(i=0;i<=(n/2-l);i++)
(
c=*(s+i);*(s+i)=*(s+n-1-i);*(s+n-l-i)=c;
)
return0;
I
(9)将一个指针所指向字符串中的大写字母复制到另一个指针所指向的字符数组中。
#include<stdio.h>
#defineN100
voidfun(char*strA,char*strB);
voidmain(void)
{
charstrA[N];
charstrB[N];
printf("请输入字符串:\n");
gets(strA);
fun(strA,strB);
printf("复制后的字符串:\n");
puts(strB);
I
voidfun(char*strA,char*strB)
(
inti;
intk=0;
for(i=0;strA[i]!='\0\i++)
{
if((strA[i]>='A')&&(strA[i]<=Z))
(
strB[k++]=strA[i];
)
1
strB[k]='O';
)
(10)输入5个国名并按字母顺序排列后输出
#include"string.h"
voidmain()
(
voidsort(char*name[],intn);
voidprint(char*name[],intn);
staticchar*name[]={,,CH1NA,,.UAMERICA".,,AUSTRALIA".
“FRANCE”,"GERMANY");
intn=5;
sort(namc,n);
print(name,n);
I
voidsort(ch<ir*name[],intn)
(
char*pt;
intij,k;
tbr(i=O;i<n-l;i++)
(
k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0)k=j;
if(k!=i)
pt=name[i];
name[i]=name[k];
naine[k]=pt;
)
)
)
voidprint(char*name[],infn)
{
inti;
for(i=0;i<n;i++)printf("%s\nn,name[i]);
2.9结构体和共用体
1.【习题解答】
一、选择题
LB2.B3.C4.A5.A6.D7.C8.D9.B10.D
二、程序填空题
1.structnode,p=person
2.sum+pst->math+pst->English+pst->computerst
3.daysum+=data.day;data.month>2
三、程序改错题
1.b->c='y'f(&a)printf("%d,%c\n”,a.x,a.c)
2.structstudent*pp<stu+3p->num(或是(*p).num)
四、阅读程序题
1.33412.03.3()1,1(X),114.4E5S
五、编程题
1.定义描述日期(年、月、日)的结构体类型。编写函数,以参数方式带入某日期,
计算相应日起在相应年是第几天,并以函数值形式带回。
#include<stdio.h>
structdat
(
intyear,month,day;
);
voidcalculate(structdat*);
voidmain()
(
intn;
structdatdate;
printf(upleaseinputyear:");
scanf(a%dM,date.year);
prinl「("pleaseinputyear:");
scanf(M%dM,date.month);
printf(uplcaseinputyear:");
scanf(M%dM,date.day);
calculate(&date);
)
voidcalculate(structdat*date)
(
inta,b,c,i;
intsum=();
a=date->year;
b=date->month;
c=date->day;
if((a%4==0)&&(a%100!=0)||(a%400==0))
(
for(i=0;i<b;i++)
(
if(i=1&&i==3&&i==5&&i==7&&i==8&&i==10)
sum+=31;
else
(
if(i=2)
sum+=29;
else
sum+=30;
}
sum+=c;
I
if((a%4!=0)||(a%100==0)&&(a%400!=0))
(
for(i=();i<b;i++)
(
if(i==1&&i==3&&i==5&&i==7&&i==8&&i==10)
sum+=31;
else
(
if(i==2)
sum+=28;
else
sum+=30;
1
sum=sum+c;
}
)
printf(M%d\nM,sum);
)
}
2.建立简单的同学通讯录,输入并存放10个同学的通讯信息,通讯录信息包括姓名、
目话号码、电子邮箱。
#include<stdio.h>
#dcfineNUM20
structmem
{
charname[20];
charphoneflO];
charaddrflOO];
};
voidmain()
(
structmemman[NUM]
inti;
for(i=0;i<NUM;i++)
(
printf(uinputnamc:\n");
gets(man[i].name);
printf(uinputphone:\nM);
gets(man[i].phone);
printf(uinputaddrcss:\n");
gets(man[i].addr);
I
printf(,,name\t\tphone\n\nw);
for(i=0;i<NUM;i++)
printf(M%s\t\t%s\t\t%s\nM,man[i].name,man[i].phone,man[i].addr);
I
3.有10个选举人,3个候选人,每人只能投一个侯选人的票,统计每个候选人的总票
数。
#include<stdio.h>
#include<string.h>
structperson
charname[10];
intcount;
)leader[3]={"zhang",(),"wang”,(),;
voidmain()
(
inti,j;
charleader_name[10];
for(i=l;i<=10;i++)
{
scanf(,,%s,,,lead_name);
for(j=0;j<3;j++)
if(strcmp(lead_namedeader[j].name)==O)
leader[j].count4-4-;
)
for(j=0;j<3;j++)
printf("%8s:%d\nnJeader|j].name,leader[j].count);
}
4.利用共用体的特点,分别取出int变量中高字节和低字节中两个数据。
#include<stdio.h>
unionword
(
charch[2];
intn;
};
voidmain()
{
unionwordw;
w.n=0x1234;
printfV'thelowis=%x\n,',w.ch[0]);
printf("thehighis=%x\nn,w.ch[l]);
w.ch[0]=*a*;
printf(Hthenumberis%x\nH,w.n);
)
5.动态分配一块内存区域,输入并存放一个学生的数据,学生数据包括学号、姓名、
性别和一门课的成绩。
#includc<malloc.h>
voidmain()
{
structstu
(
intnum;
char*name;
charsex;
floatscore;
}*ps;
ps=(structstu*)malloc(sizeof(structstu));
ps->num=101;
ps->naine=uzhangmingM;
ps->sex=*M,;
ps->score=85.5;
printf(<<Number=%d\nName=%s\nSex=%c\nScore=%.lf\n,",ps->num,ps->name,
ps->sex,ps->score);
free(ps);
}
6.编写一个程序测试上述函数的功能,要求用户能够任意输入N与m;程序输入最后剩
下人的编号。
#includc<stdio.h>
#includc<malloc.h>
#defineLENsizeof(structstu)
structstu
(
intnum;
structstu*next;
};
structstu*create(intn);
intselect(structstu*head,intn,intm);
voidmain()
(
structstu*head;
intm,n,last;
printf("请输入N的值:");
scanf(H%d",&n);
printf("请输入m的值:");
scanf("%d",&m);
head=create(n);
last=select(head,n,m);
printf("最后剩下同学的编号是%d号\n\n”,last);
}
structstu*create(intn)
(
structstu*p1,*p2;
structstu*head=NULL;
p2=pl=(structstu*)malloc(LEN);
for(inti=l;i<=n;i++)
(
if(i==1)
head=pl;
else
p2->uexl-pl;
pl->num=i;
P2二pl;
pl=(structstu*)malloc(LEN);
}
p2->next=head;
returnhead;
}
intselect(structstu*head,intn,intm)
(
structstu*pl=head.*p2=pl;
if(n==1||m==1)
returnn;
for(inti=l;i<n;i++)
(
for(intj=2;j<m;j++)
pl=pl->next;
p2=pl;
pl=pl->next;
pl=pl->next;
p2->next=pl;
}
returnpl->num;
1
2.【实验解答】
实验名称结构体与共用体一
1.运行结果是:
100003,“sun”,95,
100005,"wangn,94
2.i=0if(stud[i].score<60)n++
3.unionun
4.编程并上机调试运行
1)有5个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入每个学
生的数据,要求打印出3门课总平均成绩,以及最高分的学生数据(包括学号、姓名、
3门课的成绩、平均分数),在主函数中输出结果。
要求:分别用avc()函数求总平均分,max。函数求出最高分学生数据。
#include<stdio.h>
structstudent(longnum;
charnamc[20J;
floatChinese;
floatmath;
floatenglish;
};
voidmain()
{voidave(structstudentstu[],floata[]);
structstudentstu[5];
floata[3],b[5];
intnum,i;
for(i=0;i<5;i++)
scanf(M%ld,%s,%f,%f,%f,&stu[i].num,stufi].name,&stu[il.Chinese,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 记者职业发展规划模板
- 雾化吸入指导
- 2026事业单位工勤技能-江苏-江苏药剂员一级(高级技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-江苏-江苏放射技术员二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-新疆-新疆水生产处理工四级(中级工)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-新疆-新疆垃圾清扫与处理工三级(高级工)历年参考题库含答案详解3套试卷
- 微服务架构研究生就业
- 骨性关节炎健康护理
- 2026年秋季开学大学一年级新生军训分列式活动课件
- 2026届湖北省武汉市新洲区中考数学最后一模试卷含解析
- 2025年70岁老年人三力测试能力考试题库附答案
- 2026年菏泽市定陶区区直事业单位引进高层次急需紧缺人才(33人)笔试参考题库及答案详解
- GB/T 48012.2-2026光伏发电系统用功率转换设备安全性第2部分:逆变器的特定要求
- 中国圆锥角膜早期筛查诊断专家共识(2026年)
- 护理服务质控的护理人力资源管理
- 2022电力建设施工技术规范 第1部分:土建结构工程
- 《传感器与检测技术》课件 第一章 概述
- 国高血压防治指南2025版全文
- 城市照明节能改造项目绩效评价报告
- 《中小学幼儿园安全指南》解读专题培训
- 辉瑞制药质量手册
评论
0/150
提交评论