编程训练实例
1.
你玩过牌吗?把13张牌反过来(背面朝上)按一定的顺序排列,先把你已经排好的牌第一张取出放在这叠牌的最底层,拿出第二张放在桌面上,然后将第三张取出又放在最底层,取出第四张放在桌子上……直到游戏结束,你依次取出放在桌子上的牌刚好为K,Q,J,10,9,8,7,6,5,4,3,2,A。问你一开始时这13张牌的顺序是怎样的?请你用MATLAB编程解决这个问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
?请把程序附上。
%调用格式为chengxu
function chengxu
a={1,13};k=2;j=1;
b={'K','Q','J','10','9','8','7','6','5','4','3','2','A'};
%for c=1:4
for i=1:13
if mod(i,2)~=0
a{i}=b{j};
j=j+1;
end
end
for i=2:2:13
if mod(i,4)~=0
a{i}=b{j};
j=j+1;
end
end
for i=4:4:13
if mod(i,8)~=0
a{i}=b{j};
j=j+1;
end
end
a{8}=b{13};
a
或
function f=card()
a=1:13;
i=1;
for j=1:13
n=numel(a); %目前的片数;numle为元数的个数。
a(n+1)=a(1); %在多少张里面取第一张。
a(1)=[]; %将上面取出的第一张牌所在空格剪掉。
b(i)=a(1); %翻出来时桌面上亮出来的牌。
i=i+1;
a(1)=[];%随着i自增,取出现的空格为空。(即删除)。
end
c={'K','Q','J','10','9','8','7','6','5','4','3','2','A'};%因为10占两位,故用单元
d=cell(1,13);%由BC对应的数,将C中字符型的牌放入由B决定对应的D中。
for k=1:13
r=b(k);
d{r}=c{k};
end
f=d;
如果把第一张牌放在最底层,第二张放在最底层,取出第三张放在桌子上,依此类推,你最后把所有的牌取出刚好依次是A,2,3,4,5,6,7,8,9,10,J,Q,K.
%调用格式为card2
function f=card2()
a=1:13;
i=1;
for j=1:13
n=numel(a);
a(n+1)=a(1);
a(n+2)=a(2);
a(1)=[];
a(1)=[];
b(i)=a(1)
i=i+1;
a(1)=[];。
end
c={'A','2','3','4','5','6','7','8','9','10','J','Q','K'};
d=cell(1,13);
for k=1:13
r=b(k);
d{r}=c{k};
end
f=d;
课外拓展
按照取出第一张放到最后,然后抽出第二张放在桌子上,依次类推,并且桌子上的牌可以从键盘输入,依次类推,求原来牌的排列。
%调用格式为chengxu
function y=chengxu
a=input('请输入摆在桌子上的牌','s');
b=numel(a);
c=cell(1,b);
for i=1:b
c{i}=a(i);
end
e=[];
f=1:b;
i=1;
for j=1:b
n=numel(f); %目前的片数;numle为元数的个数。
f(n+1)=f(1); %在多少张里面取第一张。
f(1)=[]; %将上面取出的第一张牌所在空格剪掉。
e(i)=f(1); %翻出来时桌面上亮出来的牌。
i=i+1;
f(1)=[];%随着i自增,取出现的空格为空。(即删除)。
end
g=cell(1,b);%由BC对应的数,将C中字符型的牌放入由B决定对应的D中。
for k=1:b
r=e(k);
g{r}=c{k};
end
y=g;
2. 学校要举行篮球循环赛,共有十个队参加比赛,请你安排一下比赛场次,使每队每次打完比赛后至少能隔一场不比赛,以便得到休息保持体力,请你用MATLAB解决这个问题,并给出至少一个比赛日程表。(每队休息的场次越多越好,但每队都应得到的休息大体相同,不能出现某队刚打完比赛,马上和另一个已经休息了若干场的球队比赛,这是不公平的)。
1.编写一个程序,要求输入五个整数,然后由小到大排序再输出.
1.1
%调用形式为:chengxu2([a b c d e f])
function f=chengxu1(x)
for i=1:4
for j=(i+1):5
if x(i)>x(j)
a=x(i);
x(i)=x(j);
x(j)=a;
end
end
end
f=(x);
1.2
%编写一个程序,要求输入五个整数,然后由小到大排序再输出
function h=chao1()
a=cell(1,5);
a=input('Please input five number:','s');
b=str2num(a)
fprintf('从小到大排序为:')
g=sort(b,'ascend');
disp(g)
1.3
%编写一个程序,要求输入五个整数,然后由小到大排序再输出
function chen1()
a=input('Please input Num1:');
b=input('Please input Num2:');
c=input('Please input Num3:');
d=input('Please input Num4:');
e=input('Please input Num5:');
f=[a b c d e];
fprintf('从小到大排序为:')
2. 将一个整型数组的元素按逆序重新存放(如原序为:8,6,5,4改为:4,5,6,8)。
2.1
% 将一个整型数组的元素按逆序重新存放
%调用形式为:chengxu2([a b c d……n])
function f=chengxu2(x)
a=numel(x);
b=fix(a/2);
for i=1:b;
j=a-i+1;
t=x(i);
x(i)=x(j);
x(j)=t;
end
disp(x)
2.2
%将一个整型数组的元素按逆序重新存放
function chao2()
a=input('请输入一个数组:');
rot90(a,2)
3. 输入一个字符,如果是大写字母,则将其转换成小写并输出;若是小写则直接输出;若是非字母字符则打印:“Dataerror!”。
3.1
%输入形式为chengxu3('x')其中x为从键盘输入的数字或字母。
function chengxu3(x)
if x<=57&x>=48
fprintf('“Dataerror!”\n')
elseif x<=90&x>=65
fprintf('%c\n',x+32)
elseif x<=122&x>=97
x
end
3.2
function f=chao3
m=input('请输入一个字符:','s');
i=isletter(m);
if i==0
fprintf('“Dataerror!”\n')
else n=lower(m);
disp(n)
end
4. 输入一个整数,写一程序输出它是几位数。
%输入形式为chengxu4(x),x为数字。
function f=chengxu4(x)
i=0;
for j=1:10000 %此处表示可以容纳10000位数字的位数求解
x=x/10;
a=fix(x);
if a>0
i=i+1;
end
if a==0
i=i+1;
break
end
end
fprintf('你输入的是%d位数字\n',i); %或写成 i
5. 写一程序求1!+2!+…+10!
%调用形式为chengxu5
function chengxu5()
j=1;sum=0;
for i=1:10
j=i*j;
sum=sum+j;
end
fprintf('10以内的阶乘为 %d\n',sum)
%最后一条语句也可为 sum
6. 从键盘上输入a与n的值,计算sum=a+aa+aaa+aaaa+…(共n项)的和。例a=2,n=4,则sum=2+22+222+2222.
%调用形式为chengxu6(x,y),其中x y均为数字
function chengxu6(x,y)
sum=x;t=x;
for i=1:(y-1)
t=t+10^i*x;
sum=sum+t;
end
sum
7. 编程求数列1,1/2,1/3 ,1/4 ,1/5 ,……的所有大于等于0.000001的数据项之和并输出结果
%d调用格式为chengxu7
function chengxu7()
sum=0;
for i=1:10^6
a=1/i;
sum=sum+a;
end
fprintf('所求大于等于0.000001的数据项之和为%d\n',sum);
8. 求3*3矩阵的主对角线元素之和。
%调用形式为必须chengxu8([x1,x2,x3;x4,x5,x6;x7,x8,x9])
function chengxu8(x)
sum=0;
for i=1:3;
j=i;
sum=sum+x(i,j);
end
sum
9. 从键盘输入的10个整数中,找出第一个能被7整除的数。若找到,打印此数后退出循环;若未找到,打印“not exist”。
%调用形式为chengxu9([x1,x2,x3……x10])
function chengxu9(x)
for i=1:10
a=x(i)/7;
b=fix(a);
if a-b==0
disp(x(i))
break
end
if i==10
fprintf('not exist\n');
end
end
10. 设计一个用于计算个人所有税的程序。假设个人所得税的缴纳标准为:月收入少于等于800元者不纳税;超出800元的部分,纳税5%;超出2000元的部分,纳税10%;超出5000元的部分,纳税20%;超出10000元的部分,纳税30%;超出100000元的部分,纳税40%。
%调用形式为chengxu10(x)
function chengxu10(x)
if x<=800
g=0;
elseif x<=2000
g=(x-800)*0.05;
elseif x<=5000
g=1200*0.05+(x-2000)*0.10;
elseif x<=10000
g=1200*0.05+3000*0.10+(x-5000)*0.20;
elseif x<=100000
g=1200*0.05+3000*0.10+5000*0.20+(x-10000)*0.30;
elseif x>100000
g=1200*0.05+3000*0.10+5000*0.20+90000*0.30+(x-10^5)*0.4;
end
fprintf('您应该纳税:%d\n',g);
11.编写一个程序,用循环结构输出以下图形。
&&&&&&&&&
&&&&&&&
&&&&&
&&&
&
%调用形式为chengxu11
function chengxu11()
for i=9:-2:1
for j=1:i
fprintf('&')
end
fprintf('\n');
end
12.编写一个程序求出1000以内的所有素数。
%调用格式为chengxu12
function chengxu12()
for i=1:1000
t=1;j=0;
for j=2:i-1
a=mod(i,j);
if a==0
t=0;
break
end
end
if t>0
fprintf('%d \n',i);
end
end
或
%调用格式为chengxu12
function chengxu12()
a=0;b=0;l=[];k=1;
for i=1:1000
for j=2:i-1
a=i/j;
b=fix(a);
if b-a==0
break
end
end
if a-b>0
k=1+k;
l(k)=i;
end
end
l(1)=1;
l
13. 输入两个整型变量a,b的值,输出a+b,a-b,a*b,a/b,的结果,要求连同算式一起输出,每个算式占一行。
例:a等于10,b等于5,a+b的结果输成
10+5=15
%调用格式为chengxu13('x')其中x为字符
function chengxu13(x)
a=x-1;
b=x+1;
fprintf('%c %d,%c %d,%c %d \n',a,a,x,x,b,b);
14. 求前驱字符和后继字符。输入一个字符,找出它的前驱字符和后继字符,并按ASCII码值,按从大到小的顺序输出这三个字符及其对应的ASCII码值。
%调用格式为chengxu14('x')其中x为字母
function chengxu14(x)
if x=='a'|x=='A'
a=x+25;
else a=x-1;
end
if a=='z'|a=='Z'
b=a-25;
else b=x+1;
end
fprintf('%c %d,%c %d,%c %d \n',a,a,x,x,b,b);
15. 输入三角形的边长,写一求三角形面积的函数。
(面积=sqrt(s(s-a)(s-b)(s-c)), s=(a+b+c)/2)
%输入格式为chengxu15(a,b,c)
function chengxu15(a,b,c)
s=(a+b+c)/2;
mianji=sqrt(s*(s-a)*(s-b)*(s-c))
16. 输入某个点A的平面坐标(x,y),判断(输出)A点是在圆内、圆外还是在圆周上,其中圆心坐标为(2,2),半径为1 。
%调用格式为chengxu16(x,y)
function chengxu16(x,y)
a=(x-2)^2;
b=(y-2)^2;
d=sqrt(a+b);
if d==1
fprintf('A点在圆上\n')
end
if d>1
fprintf('A点在圆外\n')
end
if d<1
fprintf('A点在圆内\n')
end
17. 求爱因斯坦数学题。有一条长阶,若每步跨2阶,则最后剩余1阶;若每步跨3阶,则最后剩2阶;若每步跨5阶,则最后剩4阶;若每步跨6阶,则最后剩5阶;若每步跨7步,最后正好一阶不剩。
%调用格式为chengxu17
function chengxu17()
for i=7:1000
if mod(i,2)==1
if mod(i,3)==2
if mod(i,5)==4
if mod(i,6)==5
if mod(i,7)==0
fprintf('%d \n',i);
end
end
end
end
end
end
或
%调用格式为chengxu17
function chengxu17()
i=7;
while 1
if mod(i,2)==1&mod(i,3)==2&mod(i,5)==4&mod(i,6)==5
i
break
end
i=i+7;
end
18.输入一串字符,直到输入一个星号(*)为止,统计(输出)其中的字母个数和数字字符个数。(要求可输入任意字符)
%输入的格式为chengxu18('x')其中x为任意的字符但必须含有“*”
function chengxu18(x)
a=numel(x);
j=0;k=0;
for i=1:a
if x(i)=='*';
break
elseif x(i)>= 'a'&x(i)<='z'| x(i)>= 'A'&x(i)<='Z'
j=j+1;
elseif x(i)>= '0'&x(i)<='9'
k=k+1;
end
end
fprintf('字母个数为%d\n数字字符个数为%d\n',j,k);
或
%输入一串字符,直到输入一个星号(*)为止,统计(输出)其中的字母个数和数字字符个数。(要求可输入任意字符)
function chengxu18_2
i=1;b=[];m=0;n=0;
while 1
a=input('请输入一串字符:\n','s');
if a=='*'
break
else
b=strcat(b,a);
end
end
i=length(b);
for i=1:i
if b(i)<='z'&b(i)>='a'|b(i)<='Z'&b(i)>='A';
m=m+1;
else b(i)<='9'&b(i)>='0'
n=n+1;
end
end
fprintf('字母字符个数为%d\n数字字符个数为%d\n',m,n);
19. 从键盘输入一个正整数n,编程判断这个数是否同时含有奇数字和偶数字。
%调用格式为chengxu19(x)其中x为正整数
function chengxu19(x)
a=num2str(x);
b=numel(a);
g=0;k=0;
for i=1:b
c=mod(a(i),2);
if c==0
k=1;
break
end
end
for i=1:b
c=mod(a(i),2);
if c>0
g=1;
break
end
end
if g==1&k==1
fprintf(' Yes!\n');
end
if g==0|k==0
fprintf(' No!\n');
end
20. 设某县2000年工业总产值为200亿元,如果该县预计平均年工业总产值增长率为4.5%,那么多少年后该县年工业总产值将超500亿元?
%调用格式为chengxu20
function chengxu20()
sum=200;a=0;j=0;
for i=1:1000
a=sum*0.045;
sum=sum+a;
j=j+1;
if sum-200>=300
break
end
end
fprintf(' %d年后该县年工业总产值将超过500亿元\n',i);
21. (1)输入一个三位数,判断是否是一个“水仙花数”。水仙花数是指三位数的各位数字的立方和等于这个三位数本身。例如: 153=1*1*1+5*5*5+3*3*3
%调用格式为chengxu21_1(x)其中x必须是三位数
function chengxu21_1(x)
y=x;
a=mod(x,10);
x=x/10;
b=fix(mod(x,10));
x=x/10;
c=fix(x);
if y==a*a*a+b*b*b+c*c*c
fprintf(' %d是水仙花数\n',y);
else fprintf(' %d不是水仙花数\n',y);
end
(2)一个整数等于该数所有因子之和,则称该数是一个完数。例如:6和28都是完数。因为:6=1+2+3,28=1+2+4+7+14. 输出三位数中所有完数。
%调用格式为chengxu21_(x)其中x为数字
function chengxu21_2(x)
sum=0;
for i=1:x
if mod(x,i)==0
sum=sum+i;
end
end
if sum==2*x
fprintf(' %d是一个完数\n',x);
end
22. 输入10个数,将10个整数按生序排列输出,并且奇数在前,偶数在后。如果输入的10个数是:10 9 8 7 6 5 4 3 2 1 ,则输出:1 3 5 7 9 2 4 6 8 10。
%输入格式为chengxu22([x1 x2 x3 …… x10])
function chengxu22(x)
y=[];d=[];k=1;a=0;
for i=1:10
if mod(x(i),2)~=0
d(k)=x(i);
k=k+1;
end
end
chengxu(d)
k=1;
for i=1:10
if mod(x(i),2)==0
d(k)=x(i);
k=k+1;
end
end
chengxu(d)
function chengxu(d)
ii=numel(d);
for i=1:ii
y(i)=d(i);
end
for j=1:ii
for r=1:ii-1
if y(r)>y(r+1)
t=y(r);
y(r)=y(r+1);
y(r+1)=t;
end
end
end
fprintf('%d ',y);
23. 将数组a[n]中的每一个元素依次循环向后移动一位。
%调用格式为chengxu23
function chengxu23
x=0;
x=input('请输入一个数组a[],输入格式为[a1 a2 a3 ……]\n','s');
x=str2num(x);
if x~=0
chengxu(x)
end
function f=chengxu(x)
a=[];
b=numel(x);
for i=1:b-1
a(i+1)=x(i);
end
for j=1:b-1
fprintf(' a(%d)=%d \n',j+1,a(j+1));
end
24. 将一个正整数n输出成“千分位”形式,即从个位数起,每三位之间加一个逗号,例如,将7654321输出成7,654,321.
%调用格式为chengxu24
function chengxu24
x=input('请输入一个整数\n','s');
a=numel(x);
x=str2num(x);
b=ceil(a/3);
for i=1:b
a(i)=mod(x,1000)
x=fix(x/1000);
end
for j=b:-1:2
fprintf('%d,',a(j))
end
fprintf('%d',a(1));
fprintf('\n');
25. 求出矩阵a中每行元素的平均值和平均最大的行号。
%调用格式为chengxu25
function chengxu25
m=[];n=[];max=0;k=0;p=[];
a=input('请输入一个矩阵');
c=numel(a);
m=a(1,:);
b=numel(m);
d=c/b;
for i=1:d
n(i)=sum(a(i,:));
end
for i=1:d
p(i)=n(i)/b;
if n(i)>max
max=n(i);
k=i;
end
end
fprintf('每行元素的平均值为:\n');
for i=1:d
%fprintf('%d ',p(i));
end
fprintf('\n');
fprintf('平均值最大的行号为: %d\n',k);
26. 编写一个函数,找出矩阵A中最大元素和最小元素所在的行列号.
%调用格式为chengxu26
function chengxu26
e=1;f=1;
g=1;k=1;
a=input('请输入一个矩阵');
c=numel(a);
m=a(1,:);
b=numel(m);
d=c/b;
min1=a(1,1);
max1=a(1,1);
for i=1:d
for j=1:b
if max1<=a(i,j)
max1=a(i,j);
e=i;
f=j;
end
if min1>=a(i,j)
min1=a(i,j);
g=i;
k=j;
end
end
end
fprintf('最大元素所在的行列号为%d %d\n',e,f);
fprintf('最小元素所在的行列号为%d %d\n',g,k);
27. 给出年、月、日,计算该日是该年的第几天?
%输入的格式为[年 月 日]
function chengxu27(x)
a=0;
if mod(x(1),4)==0&mod(x(1),100)~=0&mod(x(1),400)==0
a=1;
end
% for i=1:x(2)-1
tian=30*(x(2)-1)+x(3);
if x(2)==2|x(2)==4|x(2)==6|x(2)==8
tian=tian+1;
elseif x(2)==9|x(2)==10
tian=tian+2;
elseif x(2)==11
tian=tian+3;
end
if x(2)~=1&x(2)~=2
if a==0
tian=tian-1;
end
end
tian
28. 输入数组a,b的元素,用数组a和b构造数组c,使得:
c(i)=a(i)-b(i) 当a(i)>b(i)时;
c(i)= a(i)+b(i) 当a(i)<=b(i)时;
%调用格式为chengxu28
function chengxu28
a=input('请输入数组a输入格式为[x1 x2 ……]\n');
b=input('请输入数组b,b与a的大小相同\n');
d=numel(a);c=[];
for i=1:d
if a(i)>b(i)
c(i)=a(i)-b(i);
elseif a(i)<=b(i)
c(i)=a(i)+b(i);
end
end
c
*29.写一程序输出四个人的各种排序方式.
%调用格式为chengxu29
function chengxu29
a=cell(1,4);
for i=1:4
fprintf('请输入第%d',i);
a{i}=input('个人的名字以字母形式输入','s');
end
i=1;j=1;k=1;l=1;s=0;
for i=1:4
for j=1:4
if i~=j
for k=1:4
if k~=i&k~=j
for l=1:4
if l~=i&l~=j&l~=k
s=1+s;
fprintf(' %2d %-15s %-15s %-15s %-15s\n',s,a{i},a{j},a{k},a{l});
end
end
end
end
end
end
end
*30.编写程序求所有各位数字的立方和等于420的三位数.
%调用格式为chengxu30
function chengxu30
u=0;
for k=100:999
i=k;a=zeros(1,3);
for j=1:3
a(j)=mod(i,10);
i=fix(i/10);
end
if a(1)^3+a(2)^3+a(3)^3==420
disp(k)
u=1;
end
end
if u==0
fprintf('No this number!!!\n');
end
*31.学校要举行篮球循环赛,共有十个队参加比赛,请你安排一下比赛场次,使每队每次打完比赛后至少能隔一场不比赛,以便得到休息从而保持体力,请用matlab解决这个问题,并给出至少一个比赛日程表(每队休息的场次越多越好,但每队得到的休息应大体相同,不能出现某队刚打完比赛,马上和另一个已经休息了诺干场的球队比赛,这是不公平的)。
注:本程序考虑了在一个比赛场地下的单循环问题,只给出了最优解。即让每个队休息最长时间并使休息时间大致相同。如果有一个以上的球场供给比赛,则只需按顺序进行比赛即可。
%调用格式为chengxu31
function chengxu31
a=[1:5];
b=[10:-1:6];
p=0;
fprintf('场次 球队 vs 球队\n');
for k=1:9
for i=1:5
p=p+1;
fprintf(' %2d %2d %2d\n',p,a(i),b(i));
end
for j=5:-1:1
a(j+1)=a(j);
end
a(2)=b(1);
b(1)=[];
b(5)=a(6);
a(6)=[];
end
第一轮
第二轮
第三轮
第四轮
第五轮
第六轮
第七轮
第八轮
第九轮
1---10
1--- 9
1--- 8
1--- 7
1--- 6
1--- 5
1--- 4
1--- 3
1--- 2
2--- 9
10--- 8
9--- 7
8--- 6
7--- 5
6--- 4
5--- 3
4--- 2
3---10
3--- 8
2--- 7
10--- 6
9--- 5
8--- 4
7--- 3
6--- 2
5---10
4--- 9
4--- 7
3--- 6
2--- 5
10--- 4
9--- 3
8--- 2
7---10
6--- 9
5--- 8
5--- 6
4--- 5
3--- 4
2--- 3
10--- 2
9---10
8--- 9
7--- 8
6--- 7