目录
1、新手第一站,打印“hello world,I am coming!”
2.3.1、判断输入字符的类型:字母、数字、还是其它字符(课本P74)
4.7、输入三个数a,b,c,要求按照从小到大的顺序输出(课本P72)
5.2、用while语句、do while语句、for循环求等差数列前n项的和
0、编写程序注意事项
0.1、运算符的优先级别
在一个逻辑表达式中如果有多个逻辑运算符,则优先顺序为!&& ||
逻辑运算中的短路原则:当能够得到表达式的结果,就不再继续进行余下的运算
C语言处理真假的规则:真值为非0值,假值为0;条件表达式的结果为0,则按照假处理,如果是非0,则为真值。
/*逗号表达式的运用*/
#include<stdio.h>
int main()
{
int x, y, z, i, j;
printf("(x=1,y=100,z=(x+y)*5)=%d\n", (x = 1, y = 100, z = (x + y) * 5));
printf("x=(i=10,j=5,i*j)=%d\n", x = (i = 10, j = 5, i * j));
printf("(x=i=10,j=5,i*j)=%d\n",(x = i = 10, j = 5, i * j));
return 0;
}
0.2、
0.3、
0.4、
0.5、
0.6、
0.7、
0.8、
1、新手第一站,打印“hello world,I am coming!”
#include<stdio.h>//预处理命令
int main()
/*函数说明,int说明函数类型,main是函数名称,()内是函数的参数列表,
void表示函数没有定义参数,有的编译器甚至不需要*/
{
printf("Hello world ,I am coming !");
return 0;//函数的返回值
}//函数体,包括功能语句和说明语句
//void是用来修饰函数的参数或者返回值,代表函数没有参数或没有返回值
2、ASCLL字符表相关
2.1、ASCLL字符表字符和ASCLL值的转化
#include<stdio.h>
int main()
{
int number01=68,number02=320;
char ch = 'A';
printf("number01=%c", number01);//数字在0-255之间,和ASCLL字符表一一对应
printf("number02=%c", number02);//数字溢出,利用周期性T=256去周期
printf("ch=%d", ch);//字符以十进制输出,可以变成0-255之间的具体数字
return 0;
}
2.2、打印ASCLL字符表
#include<stdio.h>
int main()
{
int i;
for (i = 0; i < 255; i++)
{
printf("字符%c ,序号%d\n", i, i);
}
return 0;
}
2.3、字符加密
2.3.1、判断输入字符的类型:字母、数字、还是其它字符(课本P74)
2.3.2、字母加密
#include <stdio.h>
int main()
{
char c;
do
{
c = getchar();
if (c != '\n')
putchar(c + 4);
} while (c != '\n');
return 0;
}
3、数据类型处理
#include<stdio.h>
int main()
{
int i=123;
float f=3.1415;
double d= 1234.567890;
long l = 1234567890;
printf(" %d, %ld, %lo, %lx, %lu\n", l, l, l, l,l);
printf(" %d, %f, %e, %f, %e\n", i,f,f,d,d);
printf(" %-d, %-f, %-e, %-f, %-e\n", i, f, f, d, d);
printf(" %o, %x, %e, %f, %g\n", i,i,f,f,f);
printf(" %e, %f, %g\n",d,d,d);
printf(" \n%5d, %10f, %15e\n", i,f,f);
printf(" \n%-5d, %-10f, %-15e\n", i, f, f);
printf(" \n%.3f, %.4e, %.5g\n",f,d,d);
printf(" \n%10.2f, %15.4e, %20.5g\n",f,d,d);
return 0;
}
/* 1234567890, 1234567890, 11145401322, 499602d2, 1234567890
123, 3.141500, 3.141500e+00, 1234.567890, 1.234568e+03
123, 3.141500, 3.141500e+00, 1234.567890, 1.234568e+03
173, 7b, 3.141500e+00, 3.141500, 3.1415
1.234568e+03, 1234.567890, 1234.57
123, 3.141500, 3.141500e+00
123 , 3.141500 , 3.141500e+00
3.141, 1.2346e+03, 1234.6
3.14, 1.2346e+03, 1234.6
计算机的实数运算存在误差,整数运算应注意是否存在溢出错误
通过printf()函数格式化输出时存在格式转换问题,可能会因为有效位数的限制、
格式符使用不当等原因出现结果不正确*/
3.2、字符常量、字符串常量的注意事项
#include<>
int main()
{
char a, b;
printf("set the value of a,b\n");
scanf_s("%c%c", &a, &b);
getchar();//ffush(stdin)可以吗?
printf("\n%c%c\n", a, b);
printf("请输入两个字符,中间以若干空格分隔:\n");
scanf_s("%c %c\n", a, b);
getchar();
printf("\n%c%c\n", a, b);
/*区别scanf_s中字符之间是否有间隔的区别*/
char c, d;
c = 'A';
d = "100";
printf("c=%c d=%c", c, d);
/*单引号定义字符常量;双引号定义字符串常量*/
return 0;
}
4、数学相关应用
4.1、计算圆的面积和周长
#include<stdio.h>
int main()
{
double randius, area;
double PI=3.1415926;
printf("请输入圆的半径:");
scanf_s(" %lf", &randius);
area = PI * randius * randius;
printf("圆的面积是: %lf", area);
return 0;
}
4.2、计算两个数的绝对值之和(其他函数调用类似)
#include<stdio.h>
#include<math.h>
float absv(float x)
{
float y;
y = x >= 0 ? x : -x;//如果“?”前的“x>=0”为真,y取x的值,否则y取-x的值
return y;
}
void main()
{
float a, b, c;
printf("input a,b:\n");
scanf_s(" %f %f", &a, &b);//注意,在scanf函数中,%f之前需要添加空格符
c = absv(a) + absv(b);
printf("|a|+|b|=%f\n", c);
}
/*思考:为什么输入“3;5”的结果偏差过大呢?——
如果输入两个以上变量,为了避免出现类似错误,是否需要多行输入?
当输入的数据类型为多个数值型数据时,若相邻两个格式指示符之间没有间隔符(冒号、逗号等)
则相应的两个输入项之间可用的分隔符有三种:空格、制表符或换行符
*/
4.3、针对不同的象限区域数值进行函数调用
4.4、求二次方程的根
#include<stdio.h>
#include<math.h>
int main()
{
float a, b, c, p, disc, q, x1, x2;
printf("请输入二次方程的三个系数,计算这个方程的根\n");
scanf_s(" %f, %f ,%f", &a, &b, &c);//最多可以同时输入5个变量
p = -b / 2 * a;
q = sqrt(b * b - 4 * a * c) / 2 * a;
x1 = p + q, x2 = p - q;
printf("x1=%f.x2=%f", x1, x2);
return 0;
}
4.5、输入两个角度值,计算他们绝对值的正弦值
#include<stdio.h>
#include<stdio.h>
#define PI 3.141592
float main()
{
float x, y,z,m;
printf("input the value of x and y:");
scanf_s("%f %f", &x, &y);
m = exp(abs(x) + abs(y));
printf("这两个数字绝对值之和的指数为:%f\n", m);
x = x * PI / 180.0;
y = y * PI / 180.0;
z = sin(abs(x) + abs(y));
printf("这两个角度值的绝对值的正弦值为:%f", z);
return 0;
}
4.6、键入学号和数学成绩,计算数学平均成绩
#include<stdio.h>
int main()
{
int num1, num2, num3;
float score1, score2, score3, ave;
printf("请输入三位学生的学号:");
scanf_s("num1=%d num2=%d num3=%d", &num1, &num2, &num3);
fflush(stdin);//清除输入台数据,避免数据紊乱
printf("\n请输入三位学生的成绩:\n");
scanf_s("score1=%d score2=%d score3=%d", &score1, &score2, &score3);
ave = (score1 + score2 + score3) / 3;
printf("学号num1的成绩是%3f", score1);
printf("学号num2的成绩是%3f", score2);
printf("学号num3的成绩是%3f", score3);
printf("这三位同学的平均成绩是%.2f", ave);
return 0;
}
4.7、输入三个数a,b,c,要求按照从小到大的顺序输出(课本P72)
/*找出a,b,c三个数字中最大的数字*/
#include<stdio.h>
int main(void)
{
float a, b, c, max;
printf("请输入三个整数: % %d % %d % %d\n");
scanf_s("%d%d%d", &a, &b, &c);
if (a >= b)
if (a >= c) max = a;
else max = c;
else
if (b >= c) max = b;
else max = c;
printf("\n最大数为:% d\n",max);
return 0;
}
4.8、键入成绩,输出成绩对应的等级
5、循环的应用
5.1、用for循环打印多个字符串
#include<stdio.h>
int main()
{
int i;
for (i = 0; i <= 40;i++)
{
printf("*");
}
printf("\n");
printf(" My name is Harry\n");
int j;
for (j= 0; j <= 40; j++)
{
printf("*");
}
//等学会了函数模块,再来用函数进行优化
return 0;
}
5.2、用while语句、do while语句、for循环求等差数列前n项的和
/*用while循环计算1+2+……+100的结果*/
/*
#include<stdio.h>
int main()
{
int i = 1, sum = 0;
while (i <= 100)//循环条件控制语句
{
sum += i;
//针对每一个i,进行表达式运算,就可以适用于任何确定数字的等差数列计算
i++;//循环条件改变语句,改变循环变量,避免死循环
}
//如果循环体中包含一个以上的语句,应该用花括弧括起来,以复合语句的形式出现。
//如果不加花括弧,则while语句的范围只到while后的第一个分号处。
printf("sum=%d",sum);
return 0;
}
*/
/*do while循环计算1+2+……+100的结果*/
/*
#include<stdio.h>
int main()
{
int i = 1, sum = 0;
do {
sum += i;
i++;
} while (i <= 100);
printf("sum=%d", sum);
return 0;
}
*/
/*for循环计算1+2+……+100的结果*/
/*
#include<stdio.h>
int main()
{
int i, sum;
for (i = 0, sum = 0; i <= 10; i++)
{
sum += i;
printf("i=%d,sum=%d\n", i,sum);
}
printf("sum=%d", sum);
return 0;
}
*/
5.3、求0-1000中的水仙花数
/*用for循环遍历每一个在0-1000之间的数字,符合的输出*/
#include<stdio.h>
int main()
{
int i, a, b, c;
int t = 0;
for (i = 0; i <= 999; i++)
{
a = i / 100;
b = i % 100 / 10;
c = i % 10;
if (i == a * a * a + b * b * b + c * c * c)
{
t++;//计数器,计算特定范围内的水仙花的个数
printf("0-1000中,第%d个水仙花数是%d\n", t, i);
}
}
return 0;
}
5.4、计算π的数值
/*第一种实现方式,调用数学函数库,直接套用公式*/
#include <stdio.h>
#include <math.h>
int main()
{
int i = 1, num;
float sum = 0, item;
printf("请输入计算数列的项数,来确定数据精度");
scanf_s("%d", &num);
while (i <= num)
{
item= pow(-1, i - 1) / (2 * i - 1);//数列的每一项
sum += item;//数列前n项的和
i++;//改变循环变量
}
printf("sum = % .3f\n", 4*sum);
return 0;
}
/*第二种实现方式,利用符号函数来计算不确定正负项问题*/
#include <stdio.h>
int main()
{
int i = 1, num, sign = 1;
float sum = 0, item;
printf("请输入计算数列的项数,来确定数据精度");
scanf_s("%d", &num);
while (i <= num)
{
item = 1.0 / (2 * i - 1);
sum += sign * item;
sign *= -1;
i++;
}
printf("sum = % .3f\n", 4*sum);
return 0;
}
/*改进:思考,按照题目设置数据精度,但为什么与实际数据存在偏差*/
#include <stdio.h>
#include<stdio.h>
int main()
{
int i = 1, num,n, sign = 1;
float sum = 0, item=0;
printf("请输入计算数列的项数,来确定数据精度");
scanf_s("%d", &n);
num = pow(1.0 / 10.0, n);
while (item*sign<= num)
{
item = 1.0 / (2 * i - 1);
sum += sign * item;
sign *= -1;
i++;
}
printf("sum = % .3f\n", 4*sum);
return 0;
}
5.5、用三种循环打印九九乘法表
/*for循环*/
#include <stdio.h>
int main(void)
{
int i, j;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%d\t", i, j, i * j);
}
printf("\n");
}
return 0;
}
5.6、用for 循环计算泰勒级数相关问题 KP98
5.7、输出3-100中所有的素数
素数的数学定义为,“凡是只能被1和自身整除的大于1的整数,就称为质数,即素数”。因此,根据定义,对于任意一个大于1的整数number1,如果不能被从2到 number- 1中的任一数整除,则该数number为素数。
只需被 2 ~ sqrt(c)之间的每一个整数整除有余数即可(原因:素数是因子为1和本身, 如果数c不是素数,则还有其他因子,其中的因子,假如为a,b.其中必有一个大于sqrt(c) ,一个小于sqrt(c) 。所以m必有一个小于或等于其平方根的因数,那么验证素数时就只需要验证到其平方根就可以了。即一个合数一定含有小于它平方根的质因子。)
#include<stdio.h>
int main(void)
{
int number, i;
printf("3 - 100中的所有素数是:\n");
for (number = 3; number <= 100; number++)
{
for (i = 2; i <= number - 1; i++)
if (number % i == 0)
break;
if (i >= number)
printf("%d\t", number);
}
printf("\n");
return 0;
}
5.8、猜数字游戏
问题:设计一个猜数字游戏,游戏规则为:由程序产生一个1 ~ 1000之间的数,由玩家猜这个数,如果猜对了,则提示玩家猜对了这个数字,然后由玩家选择是继续玩还是退出游戏;如果猜的数比生成的数小,则提示玩家数小了,再试一次;如果猜的数比生成的数大,则提示玩家数大了,再试一次,如果玩家要放弃这次猜数,则输入-1。
分析:
因为玩家至少玩一次游戏,所以循环条件的判断放在循环结束的地方,用do-while语句实现;
调用rand()函数随机生成一个1~1000之间的数,要得到一个1 ~1000的随机数,可以用取余运算符%,将 rand()的返回值除以1000所得的余数再加1得到。
为确保每次程序运行时,能得到不同的数,还需要调用srand()函数,以及用time()函数的返回值初始化该数字串。函数rand()和srand()的定义在头文件stdlib.h中,函数 time()的定义在头文件time.h中
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int num1, num2;/*numl是生成的数,num2是玩家猜的数*/
char ch;
do{
srand(time(NULL));
num1 = 1 + (rand() % 1000);
printf("I have a number between 1 and 1000. \n");
printf("Can you guess my number ? \nPlease type your first guess. \n");
scanf_s("%4d", &num2);
while (num2 != -1)
{
if (num2 == num1)
{ printf("Congratulations!");
break;}
else if (num2 <= num1)
{ printf("Guess bigger!");
scanf_s("%4d", &num2);
break;}
else
{ printf("Guess smaller!");
scanf_s("%4d", &num2);
break;}
printf("Would you like to play again(y or n)?");
fflush(stdin);
scanf_s("%2c", &ch);
}
} while (ch == 'y');
return 0;
}
6、分支结构的应用
6.1、输入一个无符号整数,判断该数是偶数还是奇数
6.1.1、用“if……else语句”实现
#include<stdio.h>
int main()
{
unsigned int num,r;
printf("Input num:\n");
scanf_s("%u", &num);
r = num % 2;
if (r==0)
printf("%u is an even.\n",num);
if (r==1)
printf("%u is an odd.\n", num);
return 0;
/*‘=’是赋值运算符;‘==’是关系运算符,修改方法是区别运算符和关系运算符*/
6.1.2、switch与case组合实现
#include<stdio.h>
int main(void)
{
int x;
printf("请输入一个0-3的整数:");
scanf_s("%d", &x);
switch (x)
{
case 0: case 2:
printf("输入的数字是偶数,数字为%d。\n",x);
case 1: case 3:
printf("输入的数字是奇数,数字为%d。\n", x);
default: printf("输入错误!\n");
}
return 0;
}
6.2、利用条件运算符判断学生的成绩水平
#include<stdio.h>
int main()
{
int score;
char grade;
printf("please input a score:\n");
scanf_s("%d", &score);
grade = score >= 90 ? 'A' : (score < 60 ? 'C' : 'B');
/*此处如果运用逻辑运算符,还可以写成
grade = score >= 90 ? 'A' : (score >= 60 && score < 90 ? 'B': 'C'); */
printf("%dbelongs to %c", score, grade);
return 0;
6.3、判断字符类型,实现相应的操作
/*判断输入的字符,如果是字母,则大小写对换,如果是数字,输出数字;
如果是除@、#外的其他字符,则输出other character*/
#include<stdio.h>
int main()
{
char c;
printf("请输入一个字符:");
c = getchar();
if (c >= 'a' && c <= 'z')//①
{
c = c - 32;
printf("letter %c\n", c);
}//通过对字符的ASCLL表的序号的运算,可以实现加密
else if (c >= 'A' && c <= 'Z')
{
c = c + 32;
printf("letter %c\n", c);//②
}
else if (c >= '0' && c <= '9') //③
{
printf("digit %c\n", c);
}
else
{
printf("other character \n");
if (c == '@' || c == '#')//④
printf("%c\n", c);
}
return 0;
}
6.4、输入年月日,判断这是一年的第几天
#include<stdio.h>
int main()
{
int day, month, year, sum, leap;
printf("\n please input year,month,day:\n");
scanf_s("%d,%d, %d", &year, &month, &day);
switch (month)
{
case 1:sum = 0; break;
case 2:sum = 31; break;
case 3:sum = 59; break;
case 4:sum = 90; break;
case 5:sum = 120; break;
case 6:sum = 151; break;
case 7:sum = 181; break;
case 8:sum = 212; break;
case 9:sum = 243; break;
case 10:sum = 273; break;
case 11:sum = 304; break;
case 12:sum = 334; break;
default:printf("data error\n"); break;
}
sum = sum + day;
/*
地球绕太阳运行的周期为365天5小时48分46秒(合365.24219天),即一回归年。公历的平年只有365天,比回归年短约0.2422天,所余下的时间约为每四年累积一天,故在第四年的2月末加1天,使当年的时间长度变为366天,这一年就是闰年。
现行公历中每400年有97个闰年。按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样,每128年就会多算出1天,经过400年就会多算出3天多。因此,每400年中要减少3个闰年。
所以公历规定:年份是整百数时,必须是400的倍数才是闰年;不是400的倍数的世纪年,即使是4的倍数也不是闰年
*/
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
leap = 1;
else
leap = 0;
if (leap == 1 && month >= 2)
sum++;
printf("The days are %d.\n", sum);
return 0;
}
6.5、键入二维点坐标,根据对应函数计算结果
#include<stdio.h>
#include<math.h>
int main()
{
double x, y, z;
printf("请输入两个非0的数字:");
scanf_s("%lf%lf", &x, &y);
if ((x > 0) && (y > 0))//第一象限
printf("z = log(x) + log(y)=%f", z = log(x) + log(y));
else if ((x < 0) && (y > 0))//第二象限
printf("z = sin(x) + cos(y)=%f", z = sin(x) + cos(y));
else if ((x < 0) && (y < 0))//第三象限
printf("z = exp(2 * x) + exp(3 * y)=%f", z = exp(2 * x) + exp(3 * y));
else if ((x > 0) && (y < 0))//第四象限
printf("z = tan(x + y)=%f", z = tan(x + y));
else if (x == 0 || y == 0)
printf("Sorry,Points on axes are not included");
else
printf("data error! please input again!");
return 0;
}
6.6、根据基本运费、货物重量和距离求总运费
/*switch语句的使用要点:
①遇到第一个相同的case常量分支之后,顺序向下执行,不再进行是否相等的判断,
因此,除非特别情况,一般情况下break语句必不可少
②多个case可以共同使用一个语句序列——只需要调整break的位置即可*/
#include<stdio.h>
float p, w, f;
int d,s;
int main()
{
printf("请输入基本运费(元)、货物重量(吨)、距离(千米):");
scanf_s("%f%f%d", &p, &w, &s);
int c ; c = s / 250;
switch (c)
{
case 0:d = 0; break;
case 1:d=0.02; break;
case 2:case 3:d=0.05; break;
case 4:case 5:case 6:case 7:d=0.08; break;
case 8:case 9:case 10:case 11:d=0.10; break;
default:d=0.15; break;
}//此处d的定义是少支付的单位价格比例
f = p * w * s * (1 - d);
printf("总运费为:%f", f);
return 0;
}//也可以用if ;else if ;else if;else的多分支结构处理,将s的范围作为分支依据
//这种方法特别适合s的范围没有严格的规律性或者case的数值比较多的情况
6.7、输入班号,输出该班学生人数
#include<stdio.h>
int main()
{
int codeshare,number;
printf("请输入班级的班号(21-26):\n");
scanf_s("%d", &codeshare);
switch(codeshare)
{
case 21:number = 45;
case 22:number = 51;
case 23:number = 48;
case 24:number = 46;
case 25:number = 48;
case 26:number = 52;
}
printf("班号为%d的班级学生人数为%d", codeshare, number);
return 0;
}
6.8、计算三个数字中较大的数字
/*输入三个数,按照从小到大的顺序输出:将最小的数放在a上,最大的数放在c上*/
#include<stdio.h>
int main()
{
float a, b, c, t;
printf("set the number of a,b,c");
scanf_s("%f%f%f", &a, &b, &c);
if (a > b)
{
t = a; a = b; b = t;
}
if (a > c)
{
t = a; a = c; c = t;
}
if (b > c)
{
t = b; b = c; c = t;
}
printf("%5.2f,%5.2f,%5.2f\n", a, b, c);
return 0;
}
6.9、银行存贷款利率模型(课本P84)
6.10、计算器模型
#include<stdio.h>
int main(void){
float num1 = 0.0, num2 = 0.0;
char op, ch;
do { printf("请按格式%%f %% c %%f 输入计算式:\n");
scanf_s("%2f %1c %2f", &num1, &op, &num2);
switch (op)
{ case'+': printf("=%f\n", num1 + num2); break;
case'-': printf("=%f\n", num1 - num2); break;
case'*': printf("=%f\n", num1 * num2); break;
case'/':{
if (num2 == 0)
printf("0不能作为被除数");
else
printf("=%f\n", num1 / num2);}
case'%':{
if (num2 == 0)
printf("0不能作为被除数");
else
printf("=%f\n", (long)num1 % (long)num2);
break; }
default:
printf("错误:运算符非法!,运算符仅包括+、-、*、/、%\n"); }
printf("是否继续练习( Y/N )?");
fflush(stdin);
scanf_s("%1c", &ch);
} while (ch == 'y' || ch == 'Y');
return 0;}
6.11、输入考试成绩,输出成绩的等级
/*给出一百分制成绩,要求输出成绩等级‘A’, ‘B’, ‘C’, ‘D’, ‘E’。
90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’。
*/
#include<stdio.h>
int main(void)
{
float score;
char grade;
printf("请输入学生成绩:");
scanf("%f", &score);
while (score > 100 || score < 0)
{
printf("\n 输入有误,请重输");
scanf("%f", &score);
}
switch ((int)(score / 10))
{
case 10: case 9: grade = 'A'; break;
case 8: grade = 'B'; break;
case 7: grade = 'C'; break;
case 6: grade = 'D'; break;
case 5: case 4: case 3: case 2: case 1: case 0: grade = 'E';
}
printf("成绩是 %5.1f,相应的等级是%c\n ", score, grade);
return 0;
}