《C语言程序设计(第3版)》教材配套习题 第二章

第二章 用C语言编写程序

    • 各种看错和漏看
    • 基本概念缺漏
          • 循环体语句
          • 函数返回类型
          • 位运算符
          • 移位运算符:
          • 取余运算符%
    • 基本数据类型
          • int不够,double来凑
          • 长整型(long long)
          • 忘记类型转换(求交错序列前N项和)
    • 格式化输入输出
          • 输出数字前补充0(常用在日期)
          • 八进制、十六进制的输入输出
    • math.h函数
          • pow(double x, double y)

各种看错和漏看

1.输出变量的顺序偷换

int i, j;  
i = 10; 
j = 20; 
printf("i = %d, j = %d", j, i); //这里i,j的值反过来了

2.运算符’/‘与’%'看错

int number;
number = 11;
printf("%d-%d-%d\n", number/2, number/3, number/12); 

3.输入时忽略了输入格式

double x;   
scanf("x=%lf", &x);  //输入:x=30
printf("%.2f", x);   //输出:30.00

4.循环体内有毒的赋值

int i, sum;
for (i = 1; i <= 10; i++){
     
    sum = 0; //有毒的赋值
    sum = sum + i;
}

基本概念缺漏

循环体语句

[例1]

int fahr;
double celsius;   
for (fahr = 91 ; fahr <= 100; fahr++)   //非循环体语句,下面的语句①才是
    celsius = 5.0 * (fahr - 32) / 9.0;     	/* 语句① 执行了10次 */
    printf("%4d%6.1f\n", fahr, celsius);   	/* 语句② 执行了1次(不在循环体内 */

[例2]

int fahr;
double celsius;   
for (fahr = 121 ; fahr <= 125; fahr++) ;  //注意这里的分号,即没有循环体语句
    celsius = 5.0 * (fahr - 32) / 9.0;     	/* 语句① */
    printf("%4d%6.1f\n", fahr, celsius);   	/* 语句② */
函数返回类型

默认为int型

test()
{
     
	return 1;
}
int main()
{
     
	printf("%d\n", test()); //结果输出1
	return 0;
}
位运算符
  1. 逻辑运算符:
    ① ~: 位 ‘非’,取反:0000→1111
    ② &:位 ‘与’ :只有都为1才为1,否则为0(1 & 1=1,1 & 0=0,0 & 1=0,0 & 0=0)
    ③ | : 位 ‘或’:只有都为0才为0,否则为1(1 | 1=1,1 | 0=1,0 | 1=1,0 | 0=0)
    ④ ^:位 ‘异或’:相异为1,相同为0(1 ^ 1=0,1 ^ 0=1,0 ^ 1=1,0 ^ 0=0 )
移位运算符:

①a<<1: a的二进制左移1位
②>>: 右移
4.运算符优先级
位非~运算符>移位运算符>位与&运算符>位异或^运算符>位或|运算符

取余运算符%

有负数参与的取余运算,如下(结果的正负取决于%前的那个数)

printf("%d\n", -123%10); //结果:-3
printf("%d\n", 123%(-10)); //结果:3
printf("%d\n", -123%(-10)); //结果:-3

基本数据类型

int不够,double来凑

(输出时用%.0f就可以假装int了)

//以下求 n! 的函数可以正确计算21!
_______ fact(int n)
{
     
    int i;			 
    _______ product; //应是double,而不是int

    product = 1;
    for (i = 1; i <= n; i++){
      
         product = product * i;
    }

    return  product;
}
长整型(long long)
long long i;
scanf("%lld", &i);
printf("%lld", i);
忘记类型转换(求交错序列前N项和)

要求:计算交错序列 1-2/3+3/5-4/7+5/9-6/11+… 的前N项之和

int n;
double factor=1.0; //通过控制正负的变量转换类型
double sum = 0;

scanf("%d", &n);
for ( int i=1; i<=n; i++ ){
     
    sum += factor * i / (2*i-1); //也可以另外乘一个1.0
    factor = -factor;
}

printf("%.3f", sum);

格式化输入输出

输出数字前补充0(常用在日期)
int day, month, year;
scanf("%d-%d-%d", &month, &day, &year);
printf("%d-%02d-%02d", year, month, day);
八进制、十六进制的输入输出
int k1, k2, k3;
//输入,但是八进制和十六进制输入时,数字/字母前不需要加0/0x
scanf("%d %o %x", &k1, &k2, &k3);
//输出,需要额外输出0/0x
printf("k1=%d,k2=0%o,k3=0x%x\n",k1,k2,k3);

math.h函数

pow(double x, double y)

—— 返回值是double

int i = 4;
printf("pow(2,%d) = %.0f\n", i, pow(2,i)); //int可以自动转换成double
//但是要小心pow的返回值必须是double

你可能感兴趣的:(教材配套习题,c语言)