C码字练习.03.while循环和运算符 - 北方连萌

C码字练习.03.while循环和运算符

标准数学库

应用之一:乘方(C语言的运算符只有四则运算,没有乘方)

#include<stdio.h>
#include<math.h> //包含标准数学库(头文件<math.h>)
int main(void)
{
   double d;

   d = pow(3, 3);
   printf("%f\n",d);

   return 0;
}

重复将ASCII码转成字母

#include<stdio.h>
#define A_G 103
int main(void)
{
   int n = 96;

   while (n++ < A_G)
      printf("%c", n);
   printf("\n");

   return 0;
}
abcdefg

分钟转小时

一个可重复将n分钟转换成n1小时n2分钟格式的程序,条件是输入正整数

#include<stdio.h>
#define M_TO_H 60
void mtoh(int n);
int main(void)
{
   int a;
   printf("请输入分钟数:");
   scanf("%d", &a);
   while (a > 0)
   {
      mtoh(a);
      printf("请输入分钟数:");
      scanf("%d", &a);
   }
   printf("输入了小于等于零的数,程序结束。\n");

   return 0;
}

void mtoh(int n)
{
   int n1, n2;
   n1 = n / M_TO_H;
   n2 = n % M_TO_H; //%是取余符号
   printf("结果是%d小时%d分钟。\n", n1, n2);
}
请输入分钟数:454
结果是7小时34分钟。
请输入分钟数:5615
结果是93小时35分钟。
请输入分钟数:262626
结果是4377小时6分钟。
请输入分钟数:151
结果是2小时31分钟。
请输入分钟数:-888
输入了小于等于零的数,程序结束。

天数转星期

这里演示的是不带函数和#define预处理的版本

#include<stdio.h>
int main(void)
{
   int day, week, left;

   printf("请输入天数:\n");
   scanf("%d", &day);
   while (day > 0)
   {
      week = day / 7;
      left = day % 7;
      printf("相当于%d星期%d天。\n", week, left);
      printf("请输入天数:\n");
      scanf("%d", &day);
   }
   printf("输入了小于等于零的数,程序结束。\n");
   
   return 0;
}
请输入天数:
55
相当于7星期6天。
请输入天数:
88
相当于12星期4天。
请输入天数:
66
相当于9星期3天。
请输入天数:
44
相当于6星期2天。
请输入天数:
84456
相当于12065星期1天。
请输入天数:
177
相当于25星期2天。
请输入天数:
0
输入了小于等于零的数,程序结束。

while与递增运算符

#include<stdio.h>
int main(void)
{
   int a, i;

   printf("请输入一个整数:\n");
   scanf("%d", &a);
   printf("接下来将打印比该数大0到10的所有整数。\n");
   i = 0; //首先进行的是第0次操作
   while(i++ < 11) //次数i与右侧的值相比较,相符则进行块中的操作,随后将i的值加1
   {
      printf("%d\n", a);
      ++a; 
      //与前面的不同,此处递增是前缀,表示“先加1再赋值”,
      //但在此由于语句中只有这一个式子所以与a++;实际上相同
   }

   return 0;
}
请输入一个整数:
9
接下来将打印比该数大0到10的所有整数。
9
10
11
12
13
14
15
16
17
18
19

前缀与后缀递增符号

如前述,前缀递增者,先加1再使用之;后缀递增者,使用之后加1

#include<stdio.h>
int main(void)
{
   int a = 10; //初始值指定
   int b, c;

   b = a++; //后缀,a的值先赋给b,随后a加上了1变为11
   c = ++a; //前缀,a的值先加1变为12,随后赋给c,a,c此时皆12
   printf("%d\n%d\n%d", a, b, c);

   
   return 0;
}
12
10
12

递减规则相同

#include<stdio.h>
int main(void)
{
   int a = 10; //初始值指定
   int b, c;

   b = a--; //后缀,a的值先赋给b,随后a减去了1变为9
   c = --a; //前缀,a的值先减1变为8,随后赋给c,a,c此时皆8
   printf("%d\n%d\n%d", a, b, c);

   
   return 0;
}
8
10
8

数列求和

(1)

#include<stdio.h>
int main(void)
{
   int n, i, t;

   printf("请输入末项:");
   scanf("%d", &n);
   i = 0;
   t = 0;
   while (i++ < n)
   {
      t = t + i;
   }
   printf("从1加到%d的总和是%d。\n", n, t);
   
   return 0;
}
请输入末项:100
从1加到100的总和是5050。

(2)

#include<stdio.h>
int main(void)
{
   int n, i, t;

   printf("请输入末项:");
   scanf("%d", &n);
   i = 0;
   t = 0;
   while (i++ < n)
   {
      t = t + i * i;
   }
   printf("从1加到%d的平方和是%d。\n", n, t);
   
   return 0;
}
请输入末项:100
从1加到100的平方和是338350。

(3)

#include<stdio.h>
int main(void)
{
   int m, n, i, t;

   printf("请输入首项:");
   scanf("%d", &m);
   printf("请输入末项:");
   scanf("%d", &n);
   i = m;
   t = i * i;
   for (;m <= n;) //使用模仿while风格的for
   {
      while (++i < n + 1)
      {
         t = t + i * i;
      }
      printf("从%d加到%d的平方和是%d。\n", m, n, t);
      printf("请输入首项:");
      scanf("%d", &m);
      printf("请输入末项:");
      scanf("%d", &n);
      i = m;
      t = i * i;
   }
   printf("输入的末项小于首项,程序结束。\n");

   
   return 0;
}
请输入首项:6
请输入末项:6
从6加到6的平方和是36。
请输入首项:2
请输入末项:3
从2加到3的平方和是13。
请输入首项:4
请输入末项:6
从4加到6的平方和是77。
请输入首项:9
请输入末项:8
输入的末项小于首项,程序结束。

求余

由于求余运算只能对整数型起作用,故对于输入小数的情况需要使用强制类型转换使其抛掉小数部分

#include<stdio.h>
int main(void)
{
   float a, b;
   int c;

   printf("请输入除数:\n");
   scanf("%f", &b); 
   printf("请输入被除数:\n");
   scanf("%f", &a);
   while (a > 0)
   {
      c = (int)a % (int)b; //强制类型转换,此处将小数点型的数去尾成整数
      printf("余数是%d。\n", c);
      printf("请输入除数:\n");
      scanf("%f", &b); 
      printf("请输入被除数:\n");
      scanf("%f", &a);
   }
   printf("输入了小于等于零的数,程序结束。\n");
   
   return 0;
}
请输入除数:
4.2
请输入被除数:
18.45
余数是2。
请输入除数:
13
请输入被除数:
65
余数是0。
请输入除数:
999
请输入被除数:
6666
余数是672。
请输入除数:
999.99
请输入被除数:
6666.66
余数是672。
请输入除数:
-8457
请输入被除数:
-78451
输入了小于等于零的数,程序结束。

绝对值

#include<stdio.h>
#include <math.h>
double cal(double a, double b);
int main(void)
{
   double m, n, r;

   printf("Please enter 2 numbers:");

   while(scanf("%lf%lf", &m, &n) == 2)
   {
      r = cal(m, n);
      printf("Result: %f\n", r);
      printf("Please enter 2 numbers:");
   }
   printf("You didn't (fully) enter 2 numbers. The program will exit.\n");

   return 0;
}

double cal(double a, double b)
{
   double c;

   c = fabs(a - b) / (a * b); //abs(), fabs()在<math.h>中用以求整数型和浮点型的绝对值

   return c;
}
Please enter 2 numbers:88 -77.1
Result: -0.024334
Please enter 2 numbers:-88 77.1
Result: -0.024334
Please enter 2 numbers:77 a
You didn't (fully) enter 2 numbers. The program will exit.

温度换算

#include<stdio.h>
void temperatures(double f);
//指定以下为常量,与#define大致相同,不过这种形式也可以写进函数的花括弧内部
const double h = 5.0;
const double j = 9.0;
const double u = 32.0;
const double g = 273.16;
int main(void)
{
   double a;
   int x;
   
   printf("请输入华氏温度:\n");
   /*
   对下两行的解释是,将scanf()函数的返回值赋给x,
   如果读取的是数字,返回值为1,否则返回值为0,
   由此,就可以指定while的循环条件了
   */
   x = scanf("%lf", &a);
   while (x == 1)
   {
      temperatures(a);
      printf("请输入华氏温度:\n");
      x = scanf("%lf", &a);
   }
   printf("你输入了非数字,程序结束。\n");
   
   return 0;
}

void temperatures(double f)
{
   double c, k;
   c = (h / j) * (f - u);
   k = c + g;
   printf("摄氏温度是:%.2f\n", c);
   printf("开氏温度是:%.2f\n", k);
}
请输入华氏温度:555摄氏温度是:290.56开氏温度是:563.72请输入华氏温度:99.254摄氏温度是:37.36开氏温度是:310.52请输入华氏温度:0摄氏温度是:-17.78开氏温度是:255.38请输入华氏温度:-74摄氏温度是:-58.89开氏温度是:214.27请输入华氏温度:not_temp你输入了非数字,程序结束。

添加新评论

电子邮件地址不会被公开,评论内容可能需要管理员审核后显示。