实验2 格式化输入输出和分支语句

实验结论

Part1: 格式化输出函数printf()和格式化输入函数scanf()

  • ex2_1.cpp

         代码如下:

#include <stdio.h>
int main() {
    int x=1234;
    float f=123.456;
    double m=123.456;
    char ch='a';
    char a[]="Hello, world!"; 
    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;
}

      分析如下:

计算机读取数据时是二进制,再转化为十进制输出,其过程易出现数据的失精。

  • ex2_2.cpp

      代码如下:

#include <stdio.h>
int main() {
    double x,y;
    char c1,c2,c3;
    int a1,a2,a3;
    scanf("%d%d%d",&a1,&a2,&a3);//a1,a2,a3前添加取地址符& 
    printf("%d,%d,%d\n",a1,a2,a3);
    scanf("%c%c%c",&c1,&c2,&c3);
    printf("%c%c%c\n",c1,c2,c3);
    scanf("%lf,%lf",&x,&y);//double型必须用%lf 
    printf("%f,%lf\n",x,y);
    return 0;
}      

      运行结果如下:

 总结:1、%d整型  %f浮点型  %c字符  %s字符串

            2、%5d  5个字符  %.3f小数点后三位    %6.2f 6个字符小数点后两位

            3、double型必须用%lf 长整型必须用%ld

Part 2 验证性实验

  • ex2-3

 代码如下:

 #include <stdio.h>
 int main() {
     double a,b,c;
     scanf("%lf %lf %lf", &a, &b, &c);
     
     if(a<0 || b<0 || c<0)
         printf("不能构成三角形\n");
     else if(a+b>c && a+c>b && b+c>a) {
         if(a==b || a==c || b==c) { 
        if (a==b && a==c) printf("构成等边三角形\n");
        else  
        printf("构成等腰三角形\n"); 
        } 
        else 
        printf("构成一般三角形\n"); 
     }
     else
         printf("不能构成三角形\n");
         
     return 0;
} 

 运行结果如下:

 

 

 

 修改后依旧成立

  • ex2-4

代码如下:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int choice;
    
    // 显示菜单 
    printf("输入0~9以内的数字,选择屏幕背景色前景色方案: \n");
    printf("1-\t黑底绿色\n");
    printf("2-\t白底黑色\n");
    printf("3-\t蓝底白色\n");
    printf("其它-\t黑底白色(默认)\n");
    printf("\n请输入, 选择你想使用的屏幕配色方案:    ");
    
    // 要求用户从键盘输入0~9的数字,选择屏幕配色方案 
    scanf("%d",&choice);
    
    // 根据用户输入,设置屏幕配色方案 
    if (choice == 1) {
        system("color 02");
        printf("《黑客帝国》一类的影视剧常见这种屏幕色:)\n"); 
    } 
        
    else if(choice == 2) {
        system("color f0");
        printf("大部分编辑器默认是这种配色:)\n");    
    }
        
    else if(choice == 3) {
        system("color 1f");
        printf("这是机器蓝屏故障时的不讨喜色:)\n");
    }
        
    else {
        system("color 0f");
        printf("控制台程序默认小黑窗:)\n");        
    }
        
        
    printf("programming is fun, just try@_@\n");
    
    
    return 0;
} 

 运行结果如下:

 

 

 

Part 3 编程训练

1、逆序正序

代码如下:

#include<stdio.h> 
int main(){
    int x,a,b,c,t;
    printf("请输入一个三位以内的十进制整数\n");
    scanf("%d",&x);
    a=x%10;
    t=x/10;
    b=t%10;
    t=t/10;
    c=t%10;
    t=t/10;
    if(t!=0)
    printf("输入错误\n");
    else if(c==0&&b!=0){
        if(a==b)
        printf("%d正序逆序相等\n",x);
        else
        printf("%d正序逆序不相等\n",x); 
    }
    else if(c==0&&b==0)
    printf("%d正序逆序相等\n",x);
    else{
        if(a==c)
        printf("%d正序逆序相等\n",x);
        else
        printf("%d正序逆序不相等\n",x); 
    }
        return 0;
     } 

运行结果如下:

2、年月日

代码如下:

#include <stdio.h> 
#include <stdlib.h>
int main(){
    int year,month,day;
    printf("输入年份 月份:\n"); 
    scanf("%d%d",&year,&month);
    if(year<0||month<1||month>12)
    {
    printf("输入的数据错误\n");
    exit(0);
    }
    if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
    day=31;
    else if(month==4||month==6||month==9||month==11)
    day=30;
    else if(year%4==0&&year%100!=0||year%400==0&&month==2)
    day=29;
    else if (month==2)
    day=28;
    printf("%d年%d月是%d天\n",year,month,day);
    return 0;
}

运行结果如下:

3、成绩排序

代码如下:

# include <stdio.h>
# include <stdlib.h>
int main()
{
    int x;
    printf("输入分数(0~100)\n");
    scanf("%d",&x);
    if(x<0||x>100)
    {
    printf("输入的数据错误\n");
    exit(0); 
    }
    switch(x/10)
    {
        case 10:
        case 9:printf("优秀\n");break;
        case 8:printf("良好\n");break;
        case 7:printf("中等\n");break;
        case 6:printf("及格\n");break;
        default:printf("不及格\n");break;
    }
    return 0;
}

运行结果如下:

Part 4

找零(输入小数点后最多为一位的金额和票面,找零并将小数精确到找零个数(取较优找零法))
#include<stdio.h>
int main(){
    int x,change,y,one,two,five,a;
    double money;
    printf("请输入金额和票面:"); 
    scanf("%lf",&money);
    scanf("%d",&x) ;
    change=x-money;
    y=(x-money-change)*10;

    for(one=0;one<=y;one++){
        for(two=0;two<=y/2;two++){
            for(five=0;five<=y/5;five++){
                if(one+two*2+five*5==y){
                printf("可找%d元%d个一角%d个两角%d个五角\n",change,one,two,five);
                goto out;
                }
            }
        }
    }
    out:
    return 0;
}

运行结果:

实验总结与体会 
1、scanf()中&不可丢
2、if switch有时自己会被套进去,可能需要事先把流程图想想清楚再写程序。
3、part 4 代码写的太急了没去试边界值(突然想写这个程序)。。。。估计漏洞百出。忘记了整数部分的优化(是可以搞成几张10元的那种),较优找零是我觉得面额大的优先。还用了让人憎恶的goto..
3、代码写的一言难尽....感觉其实很多实验自己不写一遍很难有真正的效果。这周其实是偷懒来着,试图以听课代替写代码(手写代码了解一下TAT),但其实如果不能在电脑上写一遍,真正运行一下,很多bug很难被自检出来。But一味地写代码不去复习(反思),也很难有提高。如何在两者之间达到一个最优的平衡,可能需要一些时间来调试。Anyway,渣渣的日子还是要过下去。咸鱼也妄图翻个身,只是它现在睡着了。
posted @ 2019-11-04 20:18  饿了就吃药  阅读(289)  评论(6)    收藏  举报