C语言博客作业02--循环结构

这个作业属于哪个班级 C语言--网络2011/2012
这个作业的地址 C博客作业00--循环结构
这个作业的目标 学习循环结构内容,包括for循环、while循环、循环嵌套
姓名 李兴果

0.展示PTA总分

1.本章学习总结


1.1 for循环语法

for(表达式1;表达式2;表达式3)
{
执行代码块
}

执行过程:
第一步:执行表达式1,变量做初始化;

第二步:判断表达式2,若值为真,则执行for循环体中执行代码块,然后向下执行;若其值为假,则结束循环;

第三步:执行表达式3;

第四步:执行for循环中执行代码块后执行第二步;

第五步:循环结束,继续向下执行。
注意:for中分号一定要写
代码展示:

/*体验一下for循环,实现一个10以内的数之和的小程序。
运行结果为: 10以内数的和为:55  */
#include <stdio.h>
int main()
{
    // 定义变量sum, num
    int sum, num;
    sum = 0;
    for (num = 0; num <= 10; num++) //for循环条件与num的变化值
    {
        sum += num; 
    }
    printf("1%d", sum);
    return 0;
}

1.2 while、do while循环语法

while(表达式)
{
代码块
}

注意:
1、while中表达式一般是关系表达或逻辑表达式,当表达式的值为假时不执行循环体,反之则循环体一直执行。

2、在循环体中要改变循环变量的值,否则会出现死循环。

3、循环体如果包括有一个以上的语句,则必须用{}括起来,组成复合语句。
代码展示:

/*用while循环实现100以内所有整数之和。
运行结果为: 100以内所有整数之和为:5050*/
#include <stdio.h>
int main()
{
    int i, sum = 0;
    i = 1;
    while (i <= 100)  
    {
        sum = sum + i++;
    }
    printf("%d\n", sum);
    return 0;
}

1.3 跳出循环相关语句break\continue

break:中断循环
注意:
1、break不能用在单独的if-else语句中,需要在循环中使用。

2、在多层循环中,一个break语句只跳出当前循环
代码展示:

/*找出0-50之间的所有素数,所谓素数就是只能被1和它本身整除的数字,比如:7,13,23等。*/
#include <stdio.h>
int main()
{
    int m, n;
    for(m=2; m<=50; m++)
    {
		for(n=2; n<m; n++)
        {
            if(m%n==0)
            break;
		}	
        if(m == n) 
            printf("%d  ", m);
	}
	return 0;    
}

countinue语句:

1.continue语句的作用是结束本次循环开始执行下一次循环。
1.break语句与continue语句的区别是:
break是跳出当前整个循环,continue结束本次循环开始下一次循环。
代码展示:


/*计算1到20之间不能被3整除的数字之和。
运算结果为: sum=147 */
#include <stdio.h>
int main()
{
    int i, sum;
    for(i=1, sum=0; i<=20; i++)
    {
        if( i%3==0   )    //不能被3整除这个条件如何写呢?
        {
            continue;          //应该用哪个循环结束语句呢?
        }                  
        sum += i;
    }
    printf("sum=%d\n", sum);
    return 0;    
}

while、do-while和for三种循环在具体的使用上是有区别的:

1.在知道循环次数的情况下更适合使用for循环;

2.在不知道循环次数的情况下适合使用while或者do-while循环,如果有可能一次都不循环应考虑使用while循环,如果至少循环一次应考虑使用do-while循环。

3.while,do-while和for循环之间是可以相互转换的.
代码展示:

/*使用循环计算1-2+3-4+5-6+…-100的值
运行结果为: sum=-50 */
#include <stdio.h>
int main()
{
   int sum = 0;  //定义计算结果变量sum
    int i = 1;    //定义循环数字变量i
    int flag = 1; //定义符号状态变量flag
    
    //使用while循环
    while(i<=100)
    {
        //sum=sum+flag*i;
        //flag=-flag;
        i++;
        
    }

    i = 1;  //重新初始化变量i
    
    //do-while循环
    do{
        //sum=sum+flag*i;
       // flag=-flag;
        i++;
        
    }while(i<=100);

    i = 1;  //重新初始化变量i
    
    //使用for循环
    for(i=1;i<=100;i++)
    {
        sum=sum+flag*i;
        flag=-flag;
        i++;
    }  
    printf("sum=%d\n",sum); 
    
    return 0;    
}

1.4 循环嵌套

注:一个父循环可以有多个子循环
多重循环中,外层循环为父循环,内层循环为子循环,父循环一次,子循环需要全部执行完,直到跳出循环。父循环再进入下一次,子循环继续执行
代码展示:

/*使用双重循环实现输出正三角形
   *
  ***
 *****
*******
*/
#include <stdio.h>
int main()
{
    int i, j, k;
    for(i=1; i<5; i++)
    {
        for(j=i;j<5;j++)  
        {
            printf(" ");    //输出空格
        }
        for(k=0;k<2*i-1;k++) 
        {
            printf("*");   //每行输出的*号
        }
        printf("\n");     //每次循环换行
    }
    return 0;
}

学习体会:

循环这一章节的语法运用,大大解决了很多循环重复做的问题,使得代码运行更快更准。
循环的语法简单易懂,但在难度较高的题目上自己就可能没有思维去做,需要训练代码思维,简单的题目会做,一稍微就卡死了(呜呜呜)
在循环语法中一些括号分号的小细节也特别的重要,有时候容易粗心而导致错误
有时候的嵌套循环在运行时凭个人肉眼也看不出它的运行方式,需要个人去单步调试理解

2.编程技巧总结

各种数列求和问题

(1)scanf吸收换行符
scanf(" %c",&c); //%c前面加空格,过滤回车
scanf("%d\n",&n); //使用\n过滤回车
getchar()来读取一次回车符号,每次接受一个字符,多余字符放在缓冲区,等待下一次调用getchar接收
fflush(stdin)的函数,可以用来清空缓冲区
(2)判断素数条件:
除了 1 和它本身以外,不能被任何整数整除的数
思路1) :把 m 被 2 ~ m/2 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数
思路2):m需被 2 ~ 根号m 之间的每一个整数去除,如果 m 不能被 2 ~ 根号m 间任一整数整除,m 是素数
思路3):m被2~m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数
范围:
[2,m-1]
[2,m/2]
[2,根号m]
引入flag作为素数标志
flag=1
若循环满足条件,flag=0
结束后根据flag状态判断
(3)阶乘累加
求i的阶乘直接调用fact(i)
即:sum=sum+fact(i)
计算过程中阶乘值与累加和非常大相关变量和函数类型都定义为double

  • 置item初值为1,保证每次阶乘都从1开始连乘

字符如何转数字、数字逆序问题等

(1)字符转数字:

  • 把数字9转换成字符,然后输出字符‘9’
    可以使用强制类型转换
int a=9;

char b;

b=(char)a;  

printf("%c",b);

输出的结果就是9。
在要转换的变量面前加括号,括号里面填要转换的字符
比如输入数字字符ch='8'输出只要ch=ch- '0' printf(“%d”,ch)输出就是数字8了
(2)大写字母转小写字母:
ch=ch-'a'+'A'

注:字符和数字在内存里都是以ASCII码形式存储的。
减去'0',就是减去字符'0'的ASCII码,字符'0'的ASCII码是30,所以减去'0'也就是减去30,然后就得到字符对应的数字了。

* 二进制转十进制:

sum = sum * 2 + (ch - '0')

图形打印问题

1.等腰三角形打印



(1)应先着手分析,查找规律
行号 空格 星号
1  0  5
2 1 3
3 2  1

行数:n=(输入数字 + 1)/2
空格与行数的关系:空格数=行数-1
星号:行数*2-1

四则运算

#include<stdio.h>
int main()
{
    int x, y, z;
    char c;
    scanf("%d%c%d", &x, &c,&y);
    switch (c)
    {
    case '+':
        z = x + y;
        break;
    case '-':
        z = x - y;
        break;
    case '*':
        z = x * y;
        break;
    case '/':
        z = x / y;
        break;
    default:
        printf("erro!");
        break;
    }
    printf("%d", z);
    return 0;
}

求成绩最高分初值

max初值:
1.输入的第一个数
2.比输入数都小的数
min的初值:
1.输入的第一个数
2.比输入数都大的数

求平均值:

考虑除数为0情况
if(num!=0)
avg=total/num;
else avg=0;

逆序问题:

num=num*10+新的个数

while(n != 0)
      {
       count= n%10; //得到最小位

       printf("%d\n",count);//输出最小位

            n /=10;//丢弃最小位
      }

x%10,分离一位
x=x/10,为下一次分离做准备

3.PTA实验作业

3.1 数列求和问题

3.1.1 流程图或伪代码介绍思路

int main()
{
int n;
double sum = 0;//定义变量sum为double型,题目要求保留小数位
输入一个正整数n;
for (定义double型i=1; i 小于等于 n; i自增1)
{
sum += i / (2 * i - 1) * pow(-1, i + 1);/前面是分数的函数,后面判断符号,奇数与偶数/
}
printf("保留三位小数", sum);
return 0;
}

3.1.2 代码截图

3.1.3 PTA提交列表及说明

  • 没有判断好正负号问题

3.2 图形打印问题


3.2.1 数据处理

  • 定义两个变量i,j;
  • 第一个for (i = 1;i < 7;i++),控制行数,当循环结束时则换行,换到7为止
  • 分i大于3和i小于3的情况
    3.2.2 代码截图

3.2.3 PTA提交列表及说明

  • 没有分类好情况,条件判断错误
  • 输出格式不符合题目要求

3.3 自选一题,介绍printf调试如何检查错误

3.3.1 单步调试截图

3.3.2 代码截图

3.3.3 PTA提交列表及说明

  • 在输出时候格式判断错误
posted @ 2020-11-22 22:23  Li-xinguo★  阅读(293)  评论(0编辑  收藏  举报