C语言博客作业02--循环结构
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业00--我的第一篇博客 |
| 这个作业的目标 | 学习循环结构内容,包括for循环、while循环、循环嵌套 |
| 姓名 | 曹卉潼 |
0.展示PTA总分
1.本章学习总结
1.1for循环语法
for(表达式1;表达式2;表达式3)//分别为循环初始条件;循环控制条件;循环转化条件
{
语句1
语句2
}
1.2while、do while循环语法
- while语句
while(条件表达式)
{
循环体
}//每次执行循环体前都要对条件表达式进行判断。
- do-while语句
do
{
循环体;
}while(条件表达式);//每执行完一次循环体,do…while结构都要判断一下条件表达式。
1.3跳出循环相关语句break\continue
在循环语句中,可以用break语句跳出循环,用continue语句结束本次循环。
- 语句作用
1.break语句的作用
(1)在分支结构程序设计中用break语句可以使流程跳出switch结构,继续执行switch语句下面的一个语句;
(2)break语句可以用来从循环体内中途跳出循环体,即提前结束循环操作,接着执行循环下面的语句。
2.continue语句的作用
continue语句是跳过循环体中剩余的语句而强制执行下一次循环操作。其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。
- 注意事项
(1)在循环语句中,break语句一般都是与if语句一起使用;
(2)break语句不能用于循环语句和switch语句之外的任何其它语句中;
(3)continue语句只能用在循环语句中。一般都是与if语句一起使用。
- 区别
(1)continue语句只结束本次循环,而不是终止整个循环的执行;
(2)break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
1.4循环嵌套
感觉循环嵌套比单循环更难,写代码过程中遇到了不少困难,重要的是理清思路,弄清楚内外循环分别对应的功能。这部分的练习需要加强。
- 打印九九口诀表
#include <stdio.h>
int main()
{
int n;
int i, j;//每列第一个数j,每列第二个数i
int result;
scanf("%d", &n);
for (i = 1; i <= n; i++)//随行数增1,每一列的第二个数i增1
{
for (j = 1; j <= i; j++)//每一列第一个数相同,随列数增1,j增1
{
result = j * i;//result存放乘积结果
printf("%d*%d=%-4d", j, i, result);
}
printf("\n");
}
return 0;
}
效果:
- 求n以内最大的k个素数以及它们的和
#include <stdio.h>
#include <math.h>
int isprime(int x);//函数声明
int main()
{
int n;
int k;
int sum = 0;
scanf("%d %d", &n, &k);
for (int i = n; i >=2; i--)
{
if (isprime(i))
{
sum += i;
if (k == 1)
{
printf("%d=", i);
break;
}
if (i == 2)
{
printf("%d=", i);
}
else
{
printf("%d+", i);
}
k--;
}
}
printf("%d", sum);
return 0;
}
int isprime(int x)//用于判断x是否是素数
{
int flag = 1;
for (int j = 2; j <= x / 2; j ++ )
{
if (x % j == 0 && x != 2)
{
flag = 0;
break;
}
}
return flag;
}
效果:
2.编程技巧总结
- 各类数列求和
(1)交错序列前N项和:通过引入flag=1来控制符号 ,再通过for循环实现正负号的交替。
#include<stdio.h>
int main()
{
int N;
double sum=0,i,item;
int flag=1;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
item=1.0*flag/(3*i-2);
sum=sum+item;
flag=-flag;
}
printf("sum = %.3lf\n",sum);
return 0;
}
(2)求奇数分之一序列前N项和:找出分母与序列i的递推关系(i+=2)
#include<stdio.h>
int main(void)
{
int N,M;
double sum=0,i=1;
scanf("%d",&N);
for(M=1;M<=N;M++,i+=2)
{ sum+=1/i;}
printf("sum = %.6lf\n",sum);
return 0;
}
(3)求阶乘序列前N项和:用嵌套循环连用两条for语句来实现
#include<stdio.h>
int main(void)
{
int n,i,j;
double sum=0,item;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
item=1;
for(j=1;j<=i;j++)
item*=j;
sum+=item;
}
printf("%.0lf\n",sum);
return 0;
}
-
字符转数字、数字逆序问题
(1)字符转数字:a=a-'0'
(2)大写字母转换为小写
ch=ch-'A'+'a'
(3)小写字母转换为大写
ch=ch-'a'+'A'
(4)数字逆序:
#include<stdio.h>
int main()
{
int x;
scanf("%d", &x);
while (x != 0)
{
printf("%d", x % 10);
x = x / 10;
}
return 0;
}
效果:
- 图形打印问题
利用嵌套循环:用外循环控制行数,两个并列内循环控制空格数和字符数。
example:打印等腰三角形
#include <stdio.h>
int main()
{
int i, k, j;
for (i = 1; i <= 4; i++)
{
for (k = 1; k <= 4 - i; k++)
printf(" ");
for (j = 1; j <= 2 * i - 1; j++)
printf("*");
printf("\n");
}
return 0;
}
效果:
- 打印空心菱形
#include<stdio.h>
int main()
{
int n, i, j, m, k;
char ch;
k = 1;
scanf("%c %d", &ch, &n);
getchar();
//printf("%c %d",ch,n);
m = (n + 1) / 2;
for (i = 0; i < m; i++)//i控制行数
{
for (j = 0; j < m - i - 1; j++) //控制每行第一个字符前的空格数
{
printf(" ");
}
printf("%c", ch);
if (i == 0)
{
ch++;
printf("\n");
continue;
}
for (j = 0; j < 2 * i - 1; j++)//控制每行两个字符之间的空格数
{
printf(" ");
}
printf("%c", ch++);
printf("\n");
}
ch = ch - 2;
for (i = n - m; i > 0; i--)
{
for (j = 0; j < k; j++)
{
printf(" ");
}
k++;
printf("%c", ch);
for (j = 0; j < 2 * i - 3; j++)
{
printf(" ");
}
if (i == 1)
{
printf("\n");
break;
}
printf("%c\n", ch--);
}
return 0;
}
效果:
- 简单计算器四则运算
效果:
3.PTA实验作业
3.1数列求和问题
3.1.1流程图或伪代码介绍思路
#include<stdio.h>
int main()
{
项数i;
符号控制flag=1;
for(条件)
{
每一项的值;
每一项的累加值;
符号交替flag=-flag;
}
输出前N项总和;
return 0;
}
3.1.2代码截图
3.1.3PTA提交列表及说明
这道题使用一个for循环即可实现,其中需要正确找到每一项item与项数i的递推关系并且引入flag作为运算符标志实现正负号交替。(注意乘以1.0)
3.2图形打印问题
3.2.1数据处理
三个整型变量:行数(i),空格数(k),*个数(j)
3.2.2代码截图
效果:
3.2.3PTA提交列表及说明
之前的几次提交由于没有严格按照题目要求地书写出现了一些格式错误,有几次答案错误是因为没有找出上、下半个菱形的空格数与行数之间的递推关系,自己做的时候没有想到引入绝对值去寻找变量间关系,然后观看了超星视频中老师的讲解,启发了新思路,然后经过列举数据,最终找到正确的递推关系,从而得到了正确答案。