min=c;
printf("最小值为%f\n",min);
}
5、思路:
让输入的数除以10求余得到最后一位数字,然后判断这位数字是否比当前最大的要大,如果比当前最大的要大,则更新maxnum;求得最后一位数之后,让这个数除以10则去掉它的最后一位。
依次循环直到这个数变为0。
#include
voidmain()
{
shorta;
intmaxnum=0;/*假设最大的数开始为0*/
scanf("%d",&a);
while(a!
=0)/*只要a不等于0,表示还没有求完数中每一位的值*/
{
if(a%10>maxnum)/*判断目前这个数的最后一位是否大于最大的*/
maxnum=a%10;
a=a/10;/*去掉这个数的最后1位*/
}
printf("最大的数字为%d\n",maxnum);
}
6、思路:
根据题意这个数为3位的数,则本题的循环初值是100,终值是999。
在循环题中,对每个i都求出它的个位、十位和百位,然后对这三个数字求他们的立方和,如果等于1099,就输出它。
当循环完毕之后就能把100-999中所有满足条件的数字输出。
#include
voidmain()
{
intx,a,b,c,i;
for(i=100;i<1000;i++)
{
x=i;/*将i复给x,下列语句中求出x的个、十、百位就等于是求i的个、十、百位*/
a=x%10;/*求x的个位*/
x=x/10;b=x%10;/*求x的十位*/
x=x/10;c=x%10;/*求x的百位*/
if(a*a*a+b*b*b+c*c*c==1099)/*如果个、十、百位的立方和等于1099则输出这个数*/
printf("%d",i);
}
}
7、思路:
设置3个变量分别保存每一类数的个数,开始时这三个变量的初值均为0。
然后在循环体中依次输入10个数(每次循环输入一个),输入一个数之后,判断这个数的类型并使对应类的变量加1。
#include
voidmain()
{
intnum,zheng,fu,ling,i;
zheng=0;/*保存整数的个数*/
fu=0;/*保存负数的个数*/
ling=0;/*保存0的个数*/
for(i=1;i<=10;i++)
/*在循环体中,每输入一个数,判断这个数的类型并给对应的变量增加1*/
{
scanf("%d",&num);
if(num>0)/*如果为正数*/
zheng++;
elseif(num<0)/*如果为负数*/
fu++;
else/*为零*/
ling++;
}
printf("正数%d个,负数%d个,零%d个\n",zheng,fu,ling);
}
8、题目中的
应该修改为
思路:
这是一种累加运算,n从1开始,每次累加
,直到
小于10-6。
#include
voidmain()
{
inti=2;
floate,s,n;/*e表示和,n表示每次被加数的分子,s表示每次的被加数*/
e=1;/*第1个被加数1没有规律,所以初值为1*/
n=1;/*第1个被加数的分子为1*/
s=1;/*第1个被加数为1*/
while(s>1e-6)
{
e=e+s;/*将被加数累加到e中*/
/*下列步骤为计算好下一个被加数*/
n=n*i;
s=1/n;
i++;
}
printf("e的值为%f\n",e);
}
9、思路:
这是一种累加运算,n从1开始,每次累加
,直到
小于10-6。
#include
voidmain()
{
intn=1;
floaty,s;/*y保存累加的和,s表示每次被加的数*/
y=0;
s=1.0/(n*n+1);/*计算第1个被加数*/
while(s>1e-6)
{
y=y+s;/*将被加数累加到y中*/
/*下列步骤为计算好下一个被加数*/
n++;
s=1.0/(n*n+1);
}
printf("y=%f\n",y);
}
10、思路:
在循环体中,依次把0x30至0x5f的值用%d以及%c输出即可。
#include
voidmain()
{
intx;
for(x=0x30;x<=0x5f;x++)
printf("ASCII码为%d的数值对应字符为%c\n",x,x);
}
11、
方法1:
#include
voidmain()
{
inti;
for(i=1;i<=100;i++)
printf("%d的平方为%d\n",i,i*i);
}
方法2:
#include
voidmain()
{
inti;
i=1;
while(i<=100)
{
printf("%d的平方为%d\n",i,i*i);
i++;
}
}
方法3:
#include
voidmain()
{
inti;
i=1;
do
{
printf("%d的平方为%d\n",i,i*i);
i++;
}while(i<=100);
}
第5章
一、单项选择题
1-5DCBDA6-10CDDAC11-15ACDCA
二、填空题
1、0、6
2、0、0
3、floats[2][3]={{70.5,85.0,69.5},{92.5,89.5,78.0}};
4、s[3][0],s[0][2],s[3][2]
5、10说明:
n个数用冒泡法需要比较n-1趟,第1趟需要比较n-1个数,第2趟需要比较n-2个数,依次类推。
所以本体需要比较4趟,从第1趟到第4趟的比较次数分别为4、3、2、1,所以共比较了10次。
6、全部、所有行的前若干个
7、#include、#include
8、x1小于x2、x1等于x2、x1大于x2
9、4、s[0]、'\0'
三、阅读程序题
1、12
2、22
3、18
10
4、说明:
下列的□表示空格
*****
□*****
□□*****
□□□*****
□□□□*****
5、efabcd
6、abcAB
7、先输入9个数保存到3行3列的数组a中(程序第4、5行),然后将数组a转置的结果保存到数组b中(程序第6、7行),最后将数组b的所有元素输出(程序第8、9、10、11行)。
8、先输入9个数保存到3行3列的数组a中(程序第4、5行),再输入9个数保存的3行3列的数组b中(程序第6、7行),然后将数组a和b中对应下标的元素相加并将相加的结果保存到3行3列的数组c中(程序第8、9行),最后将数组c的所有元素输出(程序第10、11、12、13行)。
四、程序填空题
1、k=p
2、n=strlen(s1)
3、s[i]+=32;、i++;
4、n%base、[d]
5、max_i=min_i=0、max_i=i
五、程序设计题
1、思路:
输入10个数保存到数组a中,然后计算数组a中10个元素之和,最后让这个和除以10就得到平均值。
#include
voidmain()
{
floata[10],sum,avg;
inti;
for(i=0;i<10;i++)/*输入10个单精度型数据保存到数组a中*/
scanf("%f",&a[i]);
sum=0;
for(i=0;i<10;i++)/*计算这10个元素之和*/
sum=sum+a[i];
avg=sum/10;/*让10个元素之和除以10即可得到平均值*/
printf("所有元素的平均值为:
%f\n",avg);
}
2、思路:
先输入10个数保存到数组a中;然后通过一个循环将第一个元素与最后一个元素交换,第2个元素与倒数第2个元素交换,交换到中间即可完成逆序存放;最后输出数组a的元素即可。
#include
voidmain()
{
inta[10],i,temp;/*temp用来做交换两个元素的临时变量*/
for(i=0;i<10;i++)/*输入10个整数保存到a中*/
scanf("%d",&a[i]);
for(i=0;i<=4;i++)/*通过循环交换元素*/
{
temp=a[i];
a[i]=a[9-i];
a[9-i]=temp;
}
for(i=0;i<10;i++)/*输出交换后a的内容*/
printf("%d",a[i]);
}
3、思路:
输入两个字符串保存到str1和str2数组之后,然后将第2个字符串str2连接到第1个字符串str1的后面。
难点是如何确定把str2添加到str1的哪个元素之后以及为连接后的字符串加结束标志;可以通过统计str1的长度,将str2的每个元素加在str1数组长度位置之后,最后记得给连接后总的字符串添加上'\0'作为字符串的结束标志。
#include
#include
voidmain()
{
charstr1[100],str2[100];
inti,k,len1,len2;
gets(str1);/*输入第一串字符保存到str1*/
gets(str2);/*输入第二串字符保存到str1*/
len1=strlen(str1);
len2=strlen(str2);
k=len1;
/*将str2连接到str1之后,那么在str1后的第k个位置开始放str2的字符*/
for(i=0;str2[i]!
='\0';i++)/*依次将str2的内容连接到str1之后*/
{
str1[k]=str2[i];
k++;
}
str1[len1+len2]='\0';/*给连接后的字符串添加结束标志*/
puts(str1);
}
4、思路:
先输入n,接着根据n输入n个数保存到数组x中。
然后计算出这n个数的平均值,最后按照公式计算这n个数与平均值的平方和。
#include
#include
voidmain()
{
floatx[100],x0=0,s=0;
inti,n;
printf("请输入n的值:
");
scanf("%d",&n);/*输入n的值*/
printf("请输入%d个数据:
",n);
for(i=0;iscanf("%f",&x[i]);
for(i=0;ix0=x0+x[i];
x0=x0/n;/*计算这n个数的平均值*/
for(i=0;is=s+(x[i]-x0)*(x[i]-x0);
printf("s=%f\n",s);
}
5、思路:
通过一个双重循环输入数据保存到数组a中,然后假设a[0][0]既是最大(max)的又是最小(min)的,同时将最大和和最小的行、列坐标均设置为0;接着使用双重循环依次遍历数组a的每一个元素,如果比max大就更新max(同时也更新max对应的行和列坐标),如果比min小则更新min(同时更新min对应的行和列坐标);最后输出数据时要将行和列坐标的值均加1,因为在数组中下标从0开始而实际生活中的下标是从1开始。
#include
voidmain()
{
inta[3][5],i,j,max,min,max_i,max_j,min_i,min_j;
/*max保存最大的值,min保存最小的值,max_i保存最大值的行号,min_j保存最大值的列号,min_i保存最小值的行号,min_j保存最小值的列号*/
for(i=0;i<3;i++)/*通过这个双重循环输入3行5列的整数到数组a中*/
for(j=0;j<5;j++)
scanf("%d",&a[i][j]);
max=min=a[0][0];/*假设数组的第1个元素是最大的、最小的*/
max_i=max_j=min_i=min_j=0;/*设置最大、最小的行和列值为0*/
for(i=0;i<3;i++)/*通过这个双重循环依次遍历数组a的每个元素,并求出最大、最小值*/
for(j=0;j<5;j++)
{
if(a[i][j]>max)/*如果当前元素的值比max还大,则要记录下来*/
{
max=a[i][j];
max_i=i;
max_j=j;
}
else/*不是最大的,有可能是最小的*/
if(a[i][j]{
min=a[i][j];
min_i=i;
min_j=j;
}
}
printf("最大值为%d,行为%d,列为%d\n",max,max_i+1,max_j+1);
printf("最小值为%d,行为%d,列为%d\n",min,min_i+1,min_j+1);
}
6、思路:
通过一个循环输入数据保存在50行3列的数组a中(每列放一科的成绩),然后通过一个循环计算每科的平均值,最后输出这3个平均值。
#include
voidmain()
{
intstu[50][3],i;
floatsum1,sum2,sum3;/*sum1保留第1科的和,sum2保留第2科的和,sum3保留第3科的和,最后让sum1、sum2、sum3除以50即可得到平均分*/
sum1=sum2=sum3=0;
for(i=0;i<50;i++)/*输入成绩*/
scanf("%d%d%d",&stu[i][0],&stu[i][1],&stu[i][2]);
for(i=0;i<50;i++)/*计算每科的总分*/
{
sum1=sum1+stu[i][0];
sum2=sum2+stu[i][1];
sum3=sum3+stu[i][2];
}
printf("%f,%f,%f\n",sum1/5,sum2/5,sum3/5);
/*输出平均分*/
}
7、输入一个数保存到num中,然后将num的每一位数值逆序存储到数组a中。
求num每一位数值的方法:
让num除以10求余数则得到这个数的最后1位数值,让num除以10则将最后一位去掉,如此重复直到num为0。
最后逆序输出数组a中保存有数值的元素即可。
#include
voidmain()
{
intnum,a[5],i;
scanf("%d",&num);/*输入这个数*/
i=0;
while(num>0)
{
a[i]=num%10;/*将当前数的最后1位保存在a[i]中*/
num=num/10;/*去到当前这个数的最后一位*/
i++;/*更新i,方便存下一个数*/
}
/*由于刚才存放时,是将这个数的每1位逆序存放到数组a中,所以在下面的输出时要从最后一个存放数值的元素开始输出*/
i--;/*由于在前一个循环中,i增加到没有存放数的地方*/
while(i>=0)
{
printf("%d",a[i]);
if(i>0)/*由于最后一个数值之后不输出逗号,所以在最后一个数值之前都输出逗号*/
printf(",");
i--;
}
}
8、思路:
通过gets函数将输入字符串保存到数组中;然后通过循环依次读取每个字符,判断处理每个字符,处理方法为:
通过if判断如果是大写字母让其加3,是小写字母让其减3;最后输出处理之后的字符。
#include
#include
voidmain()
{chara[100];
inti;
gets(a);/*输入字符串*/
for(i=0;i{
if(a[i]>='A'&&a[i]<='Z')/*判断是否是大写字母*/
a[i]=a[i]+3;
elseif(a[i]>='a'&&a[i]<='z')/*判断是否是小写字母*/
a[i]=a[i]-3;
}
puts(a);/*输出字符串*/
}
9、思路:
与上一题一致,只是输入数据后,通过循环读取每个字符的处理方法不同,如果值是大于等于'A'+3且小于等于'Z'+3则让其减3(这个地方处理的是由原来大写字母加密所得的),如果值是大于等于'a'-3且小于等于'z'-3则让其加3(这个地方处理的是由原来小写字母加密所得的)。
#include
#include
voidmain()
{chara[100];
inti;
gets(a);/*输入字符串*/
for(i=0;i