前言
记录本周编程组作业的解题思路和题解,以及做题的总结。
题目
1.打印九九口诀表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
结果:用循环方式,格式如上
本题要求对任意给定的一位正整数N,输出从1*1到N*N的部分口诀表。
解题思路:先确定行数,再找每一行的式子与行数直接的关系。
代码实现:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
//确定有多少行
for(int j=1;j<=i;j++){
printf("%d*%d=%-4d",j,i,i*j);
//保证左对齐占4个空格
}
printf("\n");//实现输出一行后换行输出
}
return 0;
}
2.两个数的简单计算器
对2个整数进行加、减、乘、除或求余运算,要求:保证除法和求余的分母非零。
输入样例1:
-2 / 2
输出样例1:
-1
输入样例2:
3 …… 6
输出样例2:
ERROR
解题思路:考查分支,出现多路分支时,控制结构有两种选择。
方法一:级联if - else if - else语句
代码实现:
#include<stdio.h>
int main(){
int a,b;
char c;
scanf("%d %c %d",&a,&c,&b);
if(c=='+'){
printf("%d",a+b);
}else if(c=='-'){
printf("%d",a-b);
}else if(c=='*'){
printf("%d",a*b);
}else if(c=='/'){
if(b!=0){
printf("%d",a/b);
//避免出现除0错误
}
else{
printf("ERROR");
}
}else if(c=='%'){
if(b!=0){
printf("%d",a%b);
//避免出现除0错误
}
else{
printf("ERROR");
}
}else{
printf("ERROR");
}//除五种运算符号之外的情况
return 0;
}
方法二:利用switch case语句
代码实现:
#include<stdio.h>
int main()
{
int a,b;
char c;
scanf("%d %c %d",&a,&c,&b);
switch(c){
case '+':printf("%d",a+b);break;
case '-':printf("%d",a-b);break;
case '*':printf("%d",a*b);break;
case '/':printf("%d",a/b);break;
case '%':printf("%d",a%b);break;
default:printf("ERROR");
//default的作用就是switch语句里所有的case都不成立时所要执行的语句
}
}
3.求整数段和
给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输出格式:首先顺序输出从A到B的所有整数,每5个数字占一行。
最后在一行中按Sum = X的格式输出全部数字的和X。
解题思路:使用count来记录打印i的次数,从而实现一行5个数。
重点:当b为最后一行的最后一个数字时,如何控制不再换行。
代码实现:
#include<stdio.h>
int main(){
int a,b,sum=0,count=0;
scanf("%d %d",&a,&b);
for(int i=a;i<=b;i++){
printf("%5d",i);
count+=1;
sum+=i;
//count用于实现五个数一行
if(count%5==0&&i!=b){
//&&i!b很重要保证保证最后一个数在一行的末尾时不会再进行换行
printf("\n");
}
}
printf("\n");
printf("Sum = %d",sum);
return 0;
}
4.个位数统计
输入一个N(100000>N>10000),统计每个数出现的次数,要求:用数组
输入样例:
100311
输出样例:
0:2
1:3
3:1
代表0的个数为2,1的个数为3,3的个数为1;
解题思路:遍历每一位上的数,分别记录每一个数字出现的次数。
代码实现:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[10]={0};
while(n>0){
int x=n%10;
a[x]+=1;//数组a用于记录每个数出现的次数
n=n/10;
}//循环结束的条件设置为n>0,直到n的每一位数都被遍历
for(int i=0;i<10;i++){
if(a[i]>0){
printf("%d:%d\n",i,a[i]);
}
}
return 0;
}
总结
数组元素的值是随机分配的,当初始化参数时,推荐使用 int array[10] = {0};
只能在循环体内和switch语句体内使用break,当break出现在循环体中的switch语句体内时,起作用只是跳出该switch语句体,并不能终止循环体的执行。若想强行终止循环体的执行,可以在循环体中,但并不在switch语句中设置break语句,满足某种条件则跳出本层循环体。