实验二 张珂瑜

实验二

(一)实验任务一

(程序源代码)

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a = 5, b = 7 ,c = 100, d,e,f;
    
    d = a / b * c;
    e = a * c / b;
    f = c / b * a;
    printf("d = %d,e = %d,f = %d\n",d,e,f);
    
    return 0;
}

(程序运行结果截图)

(问题回答)

1.表达式对应的数学计算式分别是什么?

d=[a/b]*c (先计算a/b,将结果取整,然后乘以c,把值赋给d)

e=[(a*c)/b] (先计算a*c,然后把结果除以b,将结果取整,把值赋给e)

f=[c/b]*a (先计算c/b,将结果取整,然后乘以a,把值赋给f)

p.s.抱歉电脑没有办法输入数学符号,所以我将计算过程在括号中备注了。

2.变量d,e,f计算结果不同的原因是?

由于表达式的结合从左到右,并且*和/的优先级相同,因此每次都从左往右计算,运算结果不同。

(二)实验任务二

(程序源代码)

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int x=1234;
    float f=123.456;
    double m=123.456;
    char ch='a';
    char a[]="Hello,world!";//定义一个数组a,存放字符串常量。
    int y=3, z=4;
    
    printf("%d %d\n",y,z);
    printf("y=%d z=%d\n",y,z);
    printf("%8d,%2d\n",x,x);
    printf("%f,%8f,%8.1f,%0.2f,%.2e\n",f,f,f,f,f);
    printf("%lf\n",m);
    printf("%3c\n",ch);
    printf("%s\n %15s\n %10.5s\n %2.5s\n %.3s\n",a,a,a,a,a);
    
    return 0;
}

(程序运行结果截图)

(总结程序中用到的格式符的用法)

%d~~~按十进制格式输出

%f~~~按单精度浮点数输出

%lf~~~按双精度浮点数输出

%md~~~输出m位,不足补空格到m位

%.mf~~~输出m位小数

%ms~~~输出的数组字符串占m位,且不足的位数补在前

%.ms~~~输出数组字符串的前m位

(三)实验任务三

(修改语法错误后能正确运行的源代码)

#include <stdio.h>

int main(int argc, const char * argv[]) {
    double x,y;
    char c1,c2,c3;
    int a1,a2,a3;
    
    scanf("%d%d%d",&a1,&a2,&a3);
    printf("a1=%d,a2=%d,a3=%d\n",a1,a2,a3);
    scanf(" %c %c %c",&c1,&c2,&c3);
    printf("c1=%c,c2=%c,c3=%c\n",c1,c2,c3);
    scanf("%lf%lf",&x,&y);
    printf("x=%.1f,y=%.1lf \n",x,y);
    
    return 0;
}

(根据实验任务要求正确输入并显示运行结果的截图)

 

 (四)实验任务四

(补充完整并能正确运行的c程序代码)

#include <stdio.h>

int main(int argc, const char * argv[]) {
    char x;
    x=getchar();
    
    if(x>='0' && x<='9'){
        printf("%c是数字字符。\n",x);
    }else if((x>='a'&&x<='z')||(x>='A'&&x<='Z')){
        printf("%c是英文字母。\n",x);
    }else{
        printf("%c是其他字符。\n",x);
    }
    
    return 0;
}

(运行测试结果截图)

(五)实验任务五

(补充完整并能正确运行的c程序代码)

#include <stdio.h>

int main(int argc, const char * argv[]) {
    char ans1,ans2;
    
    printf("复习了没?(输入y或Y表示复习了,输入n或N表示没复习。):");
    ans1 = getchar();
    
    getchar();
    
    printf("\n动手敲代码了没?(输入y或Y表示敲了,输入n或N表示没有敲代码。):");
    ans2=getchar();
    
    if((ans1=='n'||ans2=='N')&&(ans2=='n'||ans2=='N')){
        printf("\n罗马不是一天建成的。:)\n");
    }else{
        printf("\n罗马不是一天毁灭的。:)\n");
    }
        return 0;
}

(运行测试结果截图)

 

(六)实验任务六

(c程序源代码)

#include <stdio.h>
#include <math.h>

int main(int argc, const char * argv[]) {
    const double num=2;
    double n,sum;
    
    printf("请输入一个1~10以内的正整数:");
    scanf("%lf",&n);
    sum = 1*(1 - pow(num,n+1))/(1-num);
    printf("当 n=%d时,sum=%d\n",(int)n,(int)sum);
    
        return 0;
}

(运行结果截图)

(七)实验任务七

(1)最初不动脑子的实现方法一

(源代码)

#include <stdio.h>
int main(){
    //9
    printf(" o\t o\t o\t o\t o\t o\t o\t o\t o\n");
    printf("<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\n");
    printf("I I\tI I\tI I\tI I\tI I\tI I\tI I\tI I\tI I\n\n");
    //7
    printf(" \t o\t o\t o\t o\t o\t o\t o\n");
    printf("\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\t<H>\n");
    printf("\tI I\tI I\tI I\tI I\tI I\tI I\tI I\n\n");
    //5
    printf(" \t  \t o\t o\t o\t o\t o\n");
    printf("\t   \t<H>\t<H>\t<H>\t<H>\t<H>\n");
    printf("\t   \tI I\tI I\tI I\tI I\tI I\n\n");
    //3
    printf(" \t  \t  \t o\t o\t o\n");
    printf("\t   \t   \t<H>\t<H>\t<H>\n");
    printf("\t   \t   \tI I\tI I\tI I\n\n");
    //1
    printf("  \t  \t  \t  \t o\n");
    printf("   \t   \t   \t   \t<H>\n");
    printf("   \t   \t   \t   \tI I\n\n");
    return 0;
}

(运行结果截图)

(2)开始动脑子想是不是可以用for()循环

 但是我还没有很好的算法真正实现这个程序,但是随着学习,我会补上的。以下是我完成的部分,我只能达到这一步。(11.1)

(源代码)

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int i;
    
    for(i=5;i>=1;i--){
        printf(" o\n<H>\nI I\n");
    }
    
    return 0;
}

(运行结果截图)

 

灵光一现,我打算先简化问题,我把小人先用简单的*来代替,试试看用for语句先把阵型打印出来,于是。。。(11.6)

(源代码)

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int i;
    int cnd;
    for(i=9;i>0;i-=2){
        cnd=i;
        for(;cnd>0;cnd--){
            printf("*\t");
        }
            printf("\n");
    }
    return 0;
}

(运行结果截图)

实验总结

(1)首先,在实践中,我对于各个函数的调用以及格式符的用法有了深刻的理解。其次,在动手操作尤其是实验六和七的思考算法和代码实现中,不断出错修改,事实上真正锻炼了自己的能力。最后,从上次实验到这次实验,细节方面的代码习惯开始养成,基本不会出现scanf中忘记&,文段末尾忘记;的情况。

(2)通过本次实验,让我深刻认识到,掌握一门编程语言并不仅仅是掌握语法知识,用法等,最最重要的还是要学会运用。并且,算法是可以不断优化的,程序代码为什么这样可以实现,那样不会报错但是会出问题,每一步都是有章可循的,都是有原因的。去发现,去挖掘其中的原因所在,先实现代码,而后修改精简代码,再通过学习不断优化算法,这是在我看来非常重要的过程。

 

posted @ 2020-11-02 17:54  张珂瑜  阅读(158)  评论(0)    收藏  举报