BUAA程设第四周上机总结

代码格式化

同学们的码风可能一时半会不好培养,这种情况下不如尝试使用IDE自带的格式化功能:

拿DEV-C++举例:使用快捷键 ctrl + shift + A 可以快速方便的格式化代码。

格式化前:


格式化后:

(请忽视奇怪的配色)

基本输入输出

输入

scanf的小技巧

如果我们想一次性读取n位字符,那我们可以使用形如 %1d 的格式控制符( %nd 即每次只读入 n n n 个数字, n n n 必须是个常数)

这一点偶尔会用到,比如输入日期 19710101 19710101 19710101 ,可以用 scanf("%4d%2d%2d",&year,&month,&day); 来读取

//示例程序
#include <stdio.h>
int main()
{
    int a;
    scanf("%2d", &a);
    printf("%d\n", a);
    return 0;
}

使用 %s 输入字符串时,在读到空白符时会停止读取(回车,空格等)

那么如果我们想一次读取一行包含空格的字符串,我们可以使用 gets() 函数

注意事项

当摁下回车的时候会同时产生一个回车符(在oj平台上是 \r\n

如果紧接着使用 getchar() scanf("%c",&a) 获取字符,那么将会读取到回车符,导致无法读取我们预计的内容。这里就需要介绍一下 s c a n f scanf scanf 函数的特性:

1.空白字符会使 s c a n f scanf scanf 函数在读取过程中忽略缓冲区中的一个或多个空白字符

2.一个非空白字符会使 scanf() 函数在读入时剔除掉与这个非空白字符相同的字符

于是在这里介绍一种简单的解决忽略空白符,直接读取到我们想要的数据的办法

解决办法:

//示例程序
#include <stdio.h>
int main()
{
    char a;
    int n;
    scanf("%d", &n);
    scanf(" %c", &a);        //scanf中都接先导空格,这样会过滤掉可见字符前的所有空白符
    printf("%d %c\n", n, a);
    return 0;
}

关于字符串读入

C语言中我们将字符串视为由字符构成的数组。读入字符串使用 %s 格式符。

//示例程序
#include <stdio.h>
int main()
{
	char str[100];		//str是一个至多能存储99个字符的字符串
    scanf("%s", str);	//读取字符串
    printf("%s\n", str);//输出字符串
    return 0;
}

在读入字符串时, s c a n f scanf scanf 里不要对字符数组取地址,即如果有 str[100] ,请直接写 scanf("%s", str); 而不是 scanf("%s", &str);

注意不要将读入字符串和读入单个字符搞混了,除了读入字符串外都要写 &

C语言的 string.h 库中有许多关于字符串操作的实用函数,同学们可以自行学习,逐渐掌握。

输出

printf格式控制符的操作

形如 %3d 将右对齐三位输出数字,左补空格。注意!如果你想要输出的数字多于三位,那么效果等同 %d

(即如果写 printf("%2d",12345); 将会输出 12345 而非 12 )

形如 %-3d 将左对齐输出三位数字,右补空格

形如 %03d 将右对齐输出三位数字,左补零

注:如果你写 %-03d ,那么你的0将会被无视掉,效果等同 %-3d

形如 %+d 将输出符号位,正数会在左侧输出 + ,负数在左侧输出 -

“+”、"-"也会被算作输出中的一位

//示例代码
#include <stdio.h>
int main()
{
    int n = 12;
    int m = 123456;
    printf("%4d%4d\n%04d%04d\n%-4d%-4d\n%+d %+d", n, m, n, m, n, m, n, -n);
    return 0;
}

如果输出的位数是不定的,我们可以使用 %*d%0*d

//示例代码
#include <stdio.h>
int main()
{
    int n = 12;
    int m = 123456;
    printf("%*d %0*d\n", n, m, n, m); //n的作用就是控制输出几位数字,会被当做参数传入*中
    return 0;
}

标识变量的使用

我们在写代码时,有时需要判断程序在运行过程中是否满足了某些条件,这时候我们可以使用一个标识变量来代表条件是否满足。拿判断三角形举例:

#include <stdio.h>

int main(){
    int a;
    int b;
    int c;
    scanf("%d%d%d", &a, &b, &c);
    if(a > b){
        int t = a;
        a = b;
        b = t;
    }
    if(a > c){
        int t = a;
        a = c;
        c = t;
    }
    if(b > c){
        int t = b;
        b = c;
        c = t;
    }
    int flag = 1;						//默认为1,代表能构成三角形
    if(a + b <  = c){
        printf("no triangle\n");		//不能构成三角形
        flag = 0;						//标识变量为0,代表不能构成三角形
    }
    else if(c * c < a * a + b * b){
        printf("acute triangle\n");		//锐角三角形
    }
    else if(c * c == a * a + b * b){
        printf("right triangle\n");		//直角三角形
    }
    else if(c * c > a * a + b * b){
        printf("obtuse triangle\n");	//钝角三角形
    }
    if(flag){							//如果能够成三角形,则判断是否构成等腰三角形
        if(a == b && a == c && b == c){
            printf("equilateral triangle\n");
        }
        else if(a == b || a == c || b == c){
            printf("isosceles triangle\n");
        }
    }
    return 0;
}

本题不使用标识变量也能做出,这里只是举一个例子。使用标识变量是一种思想,使用范围很广,作用很大,同学们可以逐步理解这种思想。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值