第三次实验报告

C程序设计实验报告

姓名:张涛   实验地点: 514实验室    实验时间:2019年4月17日

 

实验项目:

1、用for语句实现循环
2、用while循环语句实现循环
3、用do-while语句实现循环
4、用while语句和for语句配合实现循环
5、用for语句嵌套实现循环

一、实验目的与要求

1.用for语句实现循环
  • 掌握for语句实现循环的方法;
  • 循环嵌套的使用;
2.用while循环语句实现循环
  • 掌握fwhile语句实现循环的方法;
  • 进一步掌握fwhile语句实现循环的方法;
3.用do-while循环语句实现循环
  • 掌握do-fwhile语句实现循环的方法;
4.用while语句和for语句配合实现循环
  • 掌握fwhile语句和for语句配合实现循环的方法;
5.用for语句嵌套实现循环
  • 掌握for语句嵌套实现循环的方法;
  • 掌握for语句嵌套(三层)实现循环的方法;
  • 掌握continue语句的使用;

 

二、实验内容

A、实验5.3.1

a、5.3.1.1

1、5.3.1.1的问题的简单描述:编写一程序,求出1,1+2,1+2+3……数列中前n项的值。

2、实验代码:
#include<stdio.h>
#include<conio.h>
main()
{
    int i,j=0,k,s=0;
    printf("Enter a number;");
    scanf("%d",&k);
    for(i=1;i<=k;i++)
    {
       s=s+i;
       printf("%d ",s);
       j++;
    } 
}

3、问题分析:注意输出 printf("%d ",s);的格式要在双引号内加入空格,这样输出不会一连串数字,或者用 \t 水平制表符可以使结果自动排版。

b、5.3.1.2

1、5.3.1.2的问题的简单描述:编写一程序,求数列1,-3!,5!,-7!……(-1)^(n-1)*(2n-1)前n项的和。n的值由键盘输入。

2、实验代码:
#include<stdio.h>
main()
{
    int n,i,j,sign=1;
    float fac,sum;
    printf("please input value of n:");
    scanf("%d",&n);
    sum=0.0;
    for(i=1;i<=n;i++)
    {
        fac=1.0;
        for(j=1;j<=2*i-1;j++)
        {
            fac=fac*j;
        }
        fac=fac*sign;
        sum=sum+fac;
        sign=-sign;
    }
    printf("sum=%.0f\n",sum);
}

3.问题分析:

开始控制i的循环结构是错误的应该为for(i=1;i<=n;i++),一开始没有怎么看懂算法框图,然后自己用记事本写了几遍才看懂。n为键盘输入数字,i控制总的循环次数,j控制2n-1的结果,fac和sum控制阶乘运算输出结果,sign控制结果的正负。

B、实验5.3.2

a、5.3.2.1

1、5.3.2.1的问题的简单描述:从键盘输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。

2、实验代码:
#include<conio.h>
#include<stdio.h>
main()
{
    float x,max,min;
    printf("please input scores:");
    scanf("%f",&x);
    max=min=x;
    while(x>=0)
    {
        if( x>max)
        max=x;
        if( x<min)
        min=x;
        scanf("%f",&x); 
    }
    printf("\nmax=%f\nmin=%f\n",max,min);
}

3、问题分析:

主要了解while的用法就ok了

 

b、5.3.2.2

1、5.3.2.2的问题的简单描述:求所有的水仙花数(水仙花数是一个3位数的自然数,该数各位数的立方和等于该数本身,如153为水仙花数1*1+5*5+3*3=153)

2、实验代码:
#include<stdio.h>
main()
{
    int x,y,z;
    int k=100;
    while(100<=k&&k<=999)
    {
        x=k/100;
        y=(k/10)%10;
        z=k%10;
        if(k==x*x*x+y*y*y+z*z*z)
        printf("%d\n", k);
        k++;
    }

}

3、问题分析:

注意while里面的判断语句的写法,应该为数学或者逻辑表达式

 

C、实验5.3.3

1、问题的简单描述:求满足下列不等式的n的最小值。其中,value是大于1的任何数。1+1/2+1/3+……+1/n>value

  2.实验代码:
#include<stdio.h>
main()
{
    float sum,value;
    int n;
    printf("Input value:");
    scanf("%f",&value);
    sum=0.0;
    n=0;
    while(sum<value)
    {
        ++n;
        sum+=1.0/(float)n;
    }

    printf("n=%d",n);
}

 

 3、问题分析:

while(sum<value)

{
++n;
sum+=1.0/(float)n;
}

这种写法和下面的循环是一样的,一个是用while写的,另一个使用do-while写的。通过写这两种写法,我更加理解了while和do-while的区别,循环次数的区别。

do
{
++n;
sum+=1.0/(float)n;
}
while(sum<value);

D、实验5.3.4

 1、问题的简单描述:输入4个字符,并把其转换为4位十进制整数后显示出来。

 2.实验代码:

#include<stdio.h>
main()
{
    char c;
    int k,data;
    data=0;
    for(k=0;k<4;k++)
    {
        while(1)
        {
            c=getchar();
            if(c>='0' && c<='9')
               break;
        }
     if(k==0) data+=(c-'0')*1000;
     if(k==1) data+=(c-'0')*100;
     if(k==2) data+=(c-'0')*10;
     if(k==3) data+=(c-'0')*1;
    }
    printf("Data=%d",data);
}

3、问题分析:

首先看到了四条横线先想到的是用switch,然后发现横线不够用了。就想到用if写比较快。

E、实验5.3.5

a、5.3.5.1

1、5.3.5.1的问题的简单描述:有100匹马。要驮100担货物,其中,1匹大马可以驮3担,1匹中马可以驮2担,两匹小马可以驮1担,请问,大马、中马和小马可以有多少种组合。

2.实验代码:
#include<stdio.h>
main()
{
    int m,n,k;
    int sum=0;
    printf("各种驮法如下:\n");
    for(m=1;m<=100;m++)
       for(n=1;n<=100-m;n++)
       {
              k=100-m-n;
              if((k%2==0)&&(3*m+2*n+0.5*k==100))
              {
                      printf("大马%3d匹;中马%3d匹;小马%3d匹.\n",m,n,k);
                      sum++;
           }       
       }
       printf("共有%d种驮法.\n",sum);    
} 

 

3、问题分析:

这道题主要是要先理解算法,就是先把大马和小马数量定义为循环变量,然后小马的数量通过这两个马的数量表示出来,最后通过一个if判断语句判断百马百担的结果是否正确,最后输出结果。

b、5.3.5.2

1、5.3.5.2的问题的简单描述:编写程序,求一正整数等差数列的前6项的和,该数列前4项之和是26,前4项之积是880。

2.实验代码:
#include<stdio.h>
main()
{
    int a,b,c,d,i,sum=0;
    for(a=1;a<=26;a++)
        for(d=1;d<=26;d++)
        {   
            b=4*a+6*d;
            if(b!=26)
                continue;
            else
            {   
                c=a*(a+d)*(a+2*d)*(a+3*d);
              if(c!=880)
                  continue;
              else  
                  for(i=0;i<6;i++)
                  {     
                       printf("%d,",a+i*d);
                       sum=sum+(a+i*d);
                  }
            }    
        }
        printf("\n数列的前六项的和:%d\n",sum);
}

3、问题分析:

这题我觉得主要是看算法比较难以理解。我仔细看了好几遍才看懂,数列的逆运算,如果是一道单纯的数学题,我相信很快能做出来,然而在想算法。a为首相,d为公差,先写a的循环,再写d的循环(我觉得循环次数多了,次数可以少一点)。 然后还要满足第二个条件数列的前四项的积为880,满足两个条件就ok了。

 

c、5.3.5.3

1、5.3.5.3的问题的简单描述:有30个学生一起买小吃,共花钱50元,其中,每个大学生花3元,每个中学生花2元,每个小学生花1元,问大、中、小学生的人数共有多少种不同的解(去掉某类学生数为0的解)

2.实验代码:
#include<stdio.h>
main()
{   
    int x,y,z,sum;
    sum=0;
    for(x=1;x<=30;x++)
    {  
        for(y=1;y<30;y++)
        {   
            z=30-x-y;
            if((z!=0)&&(3*x+2*y+z==50))
              {   
                 printf("大学生%3d\t中学生%3d\t小学生%3d\n",x,y,z);
                 sum=sum+1;
              }
            else
                 continue;
        }
    }
    printf("sum=%d\n",sum);
}

3、问题分析:

这题和之前的百马百担查不错理解起来比较容易。


三、实验小结

这次的实验内容有点多,差点就顶不住了。还好有些难度不大,我觉得此次实验主要还是for,while,do-while语句的使用练习。百马百担是一个很经典的问题,循环变量是什么,怎么样去写for循环,内外循环,先想怎么写外循环,再写内循环是解决百马百担的关键。然后就是加深了while,do-while语句的写法以及两种语句之间的转换,循环次数的差别。

总之现在学的越来越深入c语言,循环好像变得有趣而又生动了。

 

转载于:https://www.cnblogs.com/zt1037054045/p/10747715.html

西南交通大学;实验(大作业)题目:C语言文件操作;实验目的: (1) 掌握C语言字符文件读方法; (2) 掌握C语言二进制文件读方法。 实验要求: (1) 完成2个文件操作程序。 (2) 撰实验报告:每个程序包括源程序代码;按要求描述关键算法或算法流程图;提供程序测试结果(至少两种不同输入,可屏幕截图)与结论。 实验内容: 1. 在字符文件b.txt中录入n个整数,录入整数的分隔符为空格、换行或TAB。若n=5,则b.txt的一种正确格式为 5 9 12 -15 30 -7 即b.txt的第一个数为n,后面是n个整数。 编程序,从文件b.txt读出n值,建立长度为n的动态1维整型数组,然后继续从文件b.txt读入n个整数存于该数组,进行由小到大排序,最后将排序结果输出到字符文件c.txt中。 要求的输出格式是每个整数%6d,每输出5个整数换一行。 实验报告中要求给出该程序的流程图。 2. 1616点阵汉字的显示。从键盘输入一个汉字,从1616点阵汉字库文件HZK16.dat中毫读取汉字点阵信息,打印汉字到控制台屏幕上(构成汉字的每个点用输出字母O表示)。 输入输出示例: 请输入一个汉字:中 O O O O OOOOOOOOOOOOOO O O O O O O O O O O O O OOOOOOOOOOOOO O O O O O O O O O 提示1:16*16点阵字库文件HZK16.dat的存储格式。 以汉字“我”为例,16*16点阵构成的字形信息用二进制编码(1表示有点,0表示无点)形成32字节,每行2个字节,共16行,如下所示。这32个字节在文件中的存储顺序为:每行从左向右,行从上到下。 16*16点阵字库文件HZK16.dat中,每个汉字(32字节字形信息)按区位码由小到大的顺序存储。以汉字“啊”为例,它的区号为16,位号为1,故它的32字节字形信息在文件中的起始字节偏移量offset=((区号-1)*94+位号-1)*32。 0000010010000000 0x04,0x80 0000111010100000 0x0E,0xA0 0111100010010000 0x78,0x90 0000100010010000 0x08,0x90 0000100010000100 0x08,0x84 1111111111111110 0xFF,0xFE 0000100010000000 0x08,0x80 0000100010010000 0x08,0x90 0000101010010000 0x0A,0x90 0000110001100000 0x0C,0x60 0001100001000000 0x18,0x40 0110100010100000 0x68,0xA0 0000100100100000 0x09,0x20 0000101000010100 0x0A,0x14 0010100000010100 0x28,0x14 0001000000001100 0x10,0x0C 提示2:GB2312-80汉字内码 GB2312-80共收录约6700多个汉字以及其它符号,用一个94行*94列的表格表示(最多可表示94*94个汉字和符号)。某个汉字所在的行号(从1开始)称为“区号”,列号(从1开始)称为“位号”,形成区位码。 如:汉字“啊”在16行,第1列,故它的区位码为(16,1)。 在存储器中,为了与ASCII码区别,用内码表示一个汉字的编码,汉字的内码为一个2字节编码,第一字节=区号+160,第2字节=位号+160,故汉字“啊”的内码为(176,161)。 已知汉字内码,则在HZK16.dat中该汉字32字节字形信息首字节的存储位置为 offset=((内码第一字节-161)*94+(内码第二节字-161))*32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值