第三次博客

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

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

0.展示PTA总分(0----2)


1.本章学习总结(2分)

1.1 for循环语法

(1)格式:

for(初值表达式;条件表达式;步长表达式) 
{
 循环体语句;//多条语句用大括号--复合语句
}

(2)流程图:

(3) 注意:for里面语句之间是‘;’,不要在for语句中随意加分号

(4)for语句中初值表达式只执行一次

(5)循环中出现的值要注意初始值

(6)例题:计算1+2+3+···+n

#include<stdio.h>
int main()
{
  int i,n,num;
  scanf("%d",&n);
  sum=0;
  for(i=1;i<=n;i++)
 {
   sum=sum+i;
   printf("%d",sum);
 }
  return 0;
}

1.2 while、do while循环语法

1.while循环

(1)格式:

while(表达式)
  循环体语句;

(2)流程图:

(3)当表达式的值为‘真’时,循环执行,直到表达式的值为‘假’时,循环中止并继续执行while的下一条语句

(4)while语句中的表达式可以是任意合法的表达式,循环体语句只能是一条语句

(5)for语句改写成while语句:

表达式1;
while(表达式2)
{
  for的循环体语句;
  表达式3;
}

(6)当无法确定输入数据个数时,需要自己设计循环条件,可以用一个特殊的数据作为正常输入数据的结束标志

(7)例:最佳情侣身高差

#include <stdio.h>  
int main () 
{  
    int n;  
    char c;  
    float h;  
    scanf("%d", &n);  
    getchar(); 
    while (n--) //当n递减到0时,判断为‘假’,循环结束
    {  
        scanf("%c %f", &c, &h);  
        getchar();  
        if (c == 'F' )   
            printf("%.2f\n", h * 1.09);  
        else  
            printf("%.2f\n", h / 1.09);  
    }   
    return 0;  
}  

2.do while循环

(1)格式:

do
{  
  循环体语句;
}while(表达式);

(2)流程图:

(3)使用do while、while、for情况

·如果循环次数不明确,通常用while语句或do while语句

·如果事先给定了循环次数,首选for语句

·do while循环适合于先循环、后判断循环条件的情况

(4)无论循环条件的值如何,至少会执行一次循环体

(5)例题:统计一个整数的位数

#include<stdio.h>
int main()
{
     int count=0,number;
     printf("Enter a number:");
     scanf("%d",&number);
     if(number<0)number=-number;
     do{
          number=number/10;
          count++;
     }while(number!=0);
     printf("%d\n",count);
     return 0;
}

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

2种区别,举例说明。

(1)break:强制循环结束,应该和if语句配合使用,即条件满足时,才执行break跳出循环

(2)continue:跳出循环体中continue后面的语句,继续下一次循环。一般也需要与if语句配合使用。

(3)区别:break结束循环,continue跳过后面语句继续循环。

break还用于swictch语句,continue只能用于循环。

(4)流程图:

for结构中break的作用:

for结构中continue的作用:

(5)例题举例:

伪代码:
#include <stdio.h>
int main ()
{
  do
  {
   if(t/9)
    {
      t--;
      continue;//执行到continue,会直接跳转到表达式
     }
    K;
    P;
   }while(表达式);
 
   while(表达式1)
   {
      for (1; 2; 3)
      {
        if(表达式2)
         {
	    A;
	    B;
	    continue; //执行到continue,转去执行3
	    C;
	    break; //若执行到break,则终止 for 循环的所有内容,转而执行E
	 }
	 D;
      }
      E;
      continue; //此处continue执行完,执行表达式1
      F;
      break;//若执行到此处的break,则终止 while 循环,转而执行H
      G;
   }
   H;
   return 0;
 }

1.4 循环嵌套(重难点)

(1)使用嵌套时一定要分清内外层循环的功能是什么

(2)例:

计算1!+...+100!

部分代码
 item=1;
 for(i=1;i<=100;i++)
 {
   for(j=1;j<=i;j++)
    {
      item*=j;
      sum+=item;
    }
 }

判断素数

要清楚判断素数的条件(书P74)

判断m是否能被2~sqrt(m)或m/2或m-1整除

/*部分代码*/
for(m=2;m<=100;m++)//嵌套循环判断素数
{
  n=sqrt(m);
  for(i=2;i<=n;i++)
  {
    if(m%i==0)
    break;
  }
  if(i>n)
   {
     printf();
     count++;
     if(count%10==0)
       printf();
   }
}

换硬币

注意多层循环之间三种硬币的关系

#include<stdio.h>
int main()
{
    int coin, five, two, one, total, count = 0;
    scanf("%d", &coin);
    for (five = coin / 5; five > 0; five--)
    {
        for (two = coin / 2; two > 0; two--)
        {
            for (one = coin; one > 0; one--)
            {
                if (5 * five + 2 * two + one == coin)
                {
                    total = five + two + one;
                    printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n", five, two, one, total);
                    count++;
                }
            }
        }
    }
    printf("count = %d\n", count);
    return 0;
}

2.编程技巧总结(2分)

1.各种数列求和问题

(1)当求解式子中有出现符号变化时,可引入flag来表示项的符号

例:计算1-1/3+1/5-1/7+...共n项之和

#include <stdio.h>
int main()
{
  int denominator,flag,i,n;
  dounle item,sum;
   printf("enter n:");
   scanf("%d",&n);
  /*执行循环前给变量赋初值*/
   flag=1;//flag表示第i项符号,初始为正
   denominator=1;
   sum=0;
  for(i=1;i<=n;i++)
 { 
     item=flag*1.0/denominator;
     sum=sum+item;
     flag=-flag;//改变符号
     denominator+=2;
 }
  printf("sum=%f\n",sum);

 return 0;
}

(2)运用循环嵌套或自定义函数求解数列

例:(选自pta)自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。

输入格式:

输入第一行中给出非负整数 n(≤1000)。

输出格式:

在一行中输出部分和的值,保留小数点后八位。

运用自定义函数:

#include <stdio.h>
double fact(int n)//自定义函数算n!
{
   int i;
   double result=1;
	
   for (i = 1; i <= n; i++)
   {
	result *= i;
   }
	return result;
}
double fact(int n);
int main()
{
    int m,j;
    
    double sum = 1.0;
    scanf("%d", &m);
    for (j= 1; j <= m; j++)
    {
	sum += 1.0 / fact(j);
    }
     printf("%.8f", sum);
     return 0;
}

循环嵌套

#include<stdio.h>
int main()
{
    int i,j,n;
    double sum = 1.0, s = 1.0;//如果阶乘定义成int类型,会超出上限
    scanf("%d",&n);
    for(i = 1; i <= n; i++)//求和
    {
       for(j = 1; j <= i; j++)//for循环嵌套求阶乘
    {
       s *= j;
    }
    sum += 1.0 / s;
    s = 1.0;
  }
  printf("%.8lf\n",sum);
  return 0;
}

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

(1)字符转数字:通过与字母对应的ASCII码转换成数字

或者使用atoi()函数可以将字符串转换为任意类型(整型、长整型、浮点型等)的数字。

技巧:ASCII码在字符转换中运用广泛,除了字母转换为数字,还有大小写字母的转换,数字字符与数字间的转换

#include <stdio.h>
int main()
{
     int i;
     char ch_lower,ch_upper;

     for(i=1;i<=6;i++)
      {
         scanf("%c",&ch_lower);
         if(ch_lower>='a'&&ch_lower<='z')
          {
           ch_upper=ch_lower-'a'+'A';
          }
         printf("%c->%c->%d\n",ch_lower,ch_upper,ch_upper%10);
      }
   return 0;
}
# include <stdio. h>
# include <stdlib. h>
int main (void)
{
    int num;
    char  ch = "100";
    num = atoi(ch);
    printf("The string 'str' is %s and the number 'num' is %d. \n",
                   ch, num);
}

(2)数字逆序:进行n%10;n/10循环,求出各位数字重新排列

要注意循环结束的条件

#include <stdio.h>
int main ()
{
   int x;
   scanf("%d",&x);
   int digit;
   int ret=0;
   while(x>0)//循环结束条件
   {
      digit=x%10;
      ret=ret*10+digit;
      x/=10;
   }
  printf(“逆序数值是 %d\n”,ret);
  return 0;
} 

3.图形打印问题,观看超星平台的视频:图形打印,总结图形打印问题注意事项

打印菱形

#include<stdio.h>
int main()
{
  int i,j;
  for(i=0;i<7;i++)//从i=0开始计算第一行
  {
      if(i<=3)//前三行递增
      {
          for(j=0;j<5-i;j++)
            printf(" ");
          for(j=0;j<1+2*i;j++)
            printf("*");
      }
      if(i>3)//后四行递减
      {
          for(j=0;j<5-(6-i);j++)
             printf(" ");
          for(j=0;j<1+2*(6-i);j++)
            printf("*");
      }
      printf("\n");//每一行结束后
  }
    return 0;
}

注意事项:

用到循环嵌套,要对各个循环所代表的功能清晰:外循环控制行数,内循环控制空格数以及‘*’个数

可以将图形分为上下两半部分

写程序前先观察图形每一行的具体空格数

不要把各个循环以及循环中变量的初始值弄混

4.四则运算,观看超星平台的视频:四则运算,总结四则问题注意事项

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

#include<stdio.h>
int main()
{
    int i, sum, flag = 0;
    char op = '0';

    scanf("%d", &sum);

    while (op != '=')
    {
        scanf("%c", &op);
        if (op == '=')
            break;
        scanf("%d", &i);
        if (op == '+')
            sum = sum + i;
        else if (op == '-')
            sum = sum - i;
        else if (op == '*')
            sum = sum * i;
        else if (op == '/')
        {
            if (i != 0)
                sum = sum / i;
            else
                flag = 1;
        }
        else
            flag = 1;
    }

    if (flag == 1)
        printf("ERROR");
    else
        printf("%d\n", sum);

    return 0;
}

注意事项:

注意格式!!!

计算时存在实数误差,注意使用float和double,否则个别特殊数据无法通过测试点

注意精度的有效位

3.PTA实验作业(6分)

3.1 数列求和问题

7-1 求交错序列前N项和 (15分)

本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。

输入格式:
输入在一行中给出一个正整数N。

输出格式:
在一行中输出部分和的值,结果保留三位小数。

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

思路:

使用for循环,实现每次循环分母加二,分子加一

设计变量表示加减符号的交替变化

最后累加

/*伪代码*/
  int denominator=1;
  int i,n;
  int flag=1;
  double sum=1;
  scanf(n);
  for (i = 2; i <= n; i++)
    {
        分母
	正负符号
	sum累加;
    }
	printf(sum);

3.1.2 代码截图

3.2 图形打印问题

(1)打印菱形

3.2.1 数据处理

思路:先用for循环行数递增,

判断行数小等于三和大于三,分成两个部分计算

再利用for循环‘ ’与‘*’递增

//伪代码
for(i;i<=7;i++)
{
    if(i<=3)
    {
       for
       for
    }
    if(i>3)
     {
        for
        for
     }

3.2.2 代码截图

3.2.3 PTA提交列表及说明

说明:只考虑*而没有考虑空格输出的情况

下半部分循环中for语句的条件表达式没有判断清楚,和上半部分的不同

在判断输出时程序不够简洁

注意行数

(2) 编程打印空心字符菱形

3.2.1 数据处理

思路:
1、先画出实心菱形(把菱形分成上下俩部分,再分成正三角和倒三角 )

2、 把输入的N(n层)带入循环

3、 用if语句使菱形中心为空

4、 利用ASCII码的加减 实现字母组成

3.2.2 代码截图


3.2.3 PTA提交列表及说明

说明:不知道每行字母前以及同行字母间的空格个数如何计算

运用嵌套时关系比较混乱

字母的变化先增后减

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

3.3.1 单步调试截图

7-6 求幂级数展开的部分和


3.3.2 代码截图


3.3.3 PTA提交列表及说明

没有注意自定义函数中对于a的判断条件,无限制条件导致运行超时

没有考虑x<=1的情况导致测试点没过

posted on 2020-11-22 22:13  诗酒趁年华灬  阅读(156)  评论(0编辑  收藏  举报