间隔一月多才发第七章是因为开始写毕业论文了,向各位道歉,之后会加快速度。第六章从阅读量上看还是较受欢迎的,涨了二十多个关注,开心噢=w=,进入正题。
首先,最近尝试安装了Visual Stdio 2017,比起Dev C++来说复杂很多但真正工程肯定得用它,为了方便目前以后者为主。不过学完这本书后,我会继续学计算机专业其他课程,然后开始学着用VS。毕竟很多新特性、新需求在VS上才能实现。
其次,关于这一章,学习的过程整体不算困难,我卡壳的地方有三个。一是P188程序7.5里头关于使用“标记”这一方法,二是P195程序7.7里关于“标记”应用实例,三是P198程序7.9里求多个数最值时设min=MAX、max=MIN的技巧。
前两者都是关于如何用“标记”方法解决逻辑问题,后者是一种解决结构问题的手段。
这些方法给时间是能够想出替代品的,但这三个案例里给出的是前人千锤百炼总结的技巧,类似于数学题的巧解方法。如果不是出生科班有老师教授,那么我认为这值得类似于我这样的自学萌新反复理解然后尝试,以期达到掌握。
最后,提及我发现的一些问题,1、多重选择的else if结构以if开头,中间用多个else if,结尾用else结束,但实际上也能用else if结尾,switch结构最后的default也是同理可以省略的。2、switch结构里case:后面输入 return 0作为语句,你可以结束整个程序,目前章节还没提及这个我是参考别人写的第八题中如何实现“输入5,结束整个程序”而得知的,相信后面的章节会讲解。
附上程序。
#include
#include
int main(void)
{
char c, prev;
int m, p, q;
m = p = q = 0;
while((c = getchar()) != '#')
{
if(!isspace(c))
m++;//统计其他字符数
if(c == '\n')
p++;//统计换行数
if(isspace(c))
q++;//统计换行数与空格的总和(即空白数)
prev = c;
}
q = q - p;//没有函数能直接算空格数,只能间接算:空白数-换行数=空格数
if(prev != '\n')
p++;//参照P194考虑,#在一行中间算换行数需要加一的情况,且不能放在空格数计算前,否则会少算空格数
printf("空格数为%d,换行符数为%d,其他字符数%d", q, p, m);
return 0;
}
#include
int main(void)
{
char c;
int n;
n = 0;
while((c = getchar()) != '#')
{
if(c != '\n')//这个if使最后不把Enter也打印出来
{
n++;
printf("%c-%d ", c, c);
if(n % 8 == 0)
printf("\n");
}
}
return 0;
}
#include
int main(void)
{
int n, p, q, odd_and, even_and;
float odd_avg, even_avg;
p = q = odd_and = even_and = 0;
scanf("%d", &n);
while(n != 0)
{
if(n % 2 == 0)
{
p++;
odd_and += n;
}
else
{
q++;
even_and += n;
}
scanf("%d", &n);
}
if(p != 0 && q != 0)
{
odd_avg = odd_and / p;
even_avg = even_and / q;
printf("偶数个数为%d,偶数均值为%f,奇数个数为%d,奇数均值为%f", p, odd_avg, q,
even_avg);
}
if(q != 0) //要考虑到用户只输入奇数或偶数的情况
{
even_avg = even_and / q;
printf("奇数个数为%d,奇数均值为%f", q, even_avg);
}
if(p != 0)
{
odd_avg = odd_and / p;
printf("偶数个数为%d,偶数均值为%f", p, odd_avg);
}
return 0;
}
#include
#define tra '!'
int main(void)
{
char c;
int n;
n = 0;
while(
(c=getchar())
!= '#')//模仿p182写法
{
if(c == '!')//?变形要放在!变形前,不然?变成的!会接着变成!!
{
printf("!");
n++;
}
if(c == '?')
{
c = tra;
n++;
}
printf("%c", c);
}
printf("\n%d", n);
return 0;
}
#include
#define tra '!'
int main(void)
{
char c;
int n;
n = 0;
while(
(c=getchar())
!= '#')//模仿p182写法
{
switch(c)
{
case '!':
printf("!");
n++;
break;
case '?':
c = tra;
n++;
break;//switch语句不一定要跟default做结尾,且两个case语句间的复合语句不需要括起来
}
printf("%c", c);
}
printf("\n%d", n);
return 0;
}
#include
#define tra '!'
int main(void)
{
char c;
int n;
n = 0;
while((c=getchar()) != '#')
{
if(c == 'e' && (c=getchar()) == 'i')
{
n++;
}
}
printf("%d", n);
return 0;
}
#include
#define bas 10.00
#define T 40//基本工作时间
#define v 1.5//加班时间增速
#define mon1 300//税率截点1
#define mon2 450//税率截点2
#define tax1 0.15//税率1
#define tax2 0.20//税率2
#define tax3 0.25//税率3
#define Tax1 (mon1 * tax1)//$300缴税
#define Tax2 (Tax1 + (tax2 * (mon2 - mon1)))//$450缴税
int main(void)
{
int h;
double bill, tax;
printf("请输入您的周工作时间(单位小时)\n");
scanf("%d", &h);
if(h > T)
h = (h - T) * v +T;
bill = bas * h;
printf("您的报酬为%.2f\n", bill);
if(bill <= mon1)
tax = bill * tax1;
else if(bill <= mon2)
tax = Tax1 + (tax2 * (bill - mon1));
else
tax = Tax2 + (tax3 * (bill - mon2));
printf("您的纳税额为%.2f\n您的净收入为%.2f", tax, bill - tax);
return 0;
}
#include
#define T 40//基本工作时间
#define v 1.5//加班时间增速
#define mon1 300//税率截点1
#define mon2 450//税率截点2
#define tax1 0.15//税率1
#define tax2 0.20//税率2
#define tax3 0.25//税率3
#define Tax1 (mon1 * tax1)//$300缴税
#define Tax2 (Tax1 + (tax2 * (mon2 - mon1)))//$450缴税
int main(void)
{
int h, n;
double bill, tax, des;
printf("*****************************************************************\n");
printf("Enter the number corresponding to the desired pay rate or action:\n");
printf("1) $8.75/hr \t2) $9.33/hr\n3) $10.00/hr \t4) $11.20/hr\n5) quite\n");
printf("*****************************************************************\n");
while(scanf("%d", &n) == 1)
{
switch(n)
{
case 1:
printf("请输入您的周工作时间(单位小时)\n");
scanf("%d", &h);
des = 8.75;
break;
case 2:
printf("请输入您的周工作时间(单位小时)\n");
scanf("%d", &h);
des = 9.33;
break;
case 3:
printf("请输入您的周工作时间(单位小时)\n");
scanf("%d", &h);
des = 10.00;
break;
case 4:
printf("请输入您的周工作时间(单位小时)\n");
scanf("%d", &h);
des = 11.20;
break;
case 5:
return 0;//这里的return 0,只要知道直接结束了整个程序就可以了,符合题目要求
default :
printf("请输入正确选项\n");
continue;//continue不能在switch()中使用,这里是和while()匹配
}
if(h > T)
h = (h - T) * v +T;
bill = des * h;
printf("您的报酬为%.2f\n", bill);
if(bill <= mon1)
tax = bill * tax1;
else if(bill <= mon2)
tax = Tax1 + (tax2 * (bill - mon1));
else
tax = Tax2 + (tax3 * (bill - mon2));
printf("您的纳税额为%.2f\n您的净收入为%.2f\n", tax, bill - tax);
}
return 0;
}
#include
#include
int main(void)
{
unsigned long n, x, y;
bool t;
printf("请输入一个数\n");
while(scanf("%lu", &n) == 1)
{
for(x = 2; x <= n; x++)
{
for(y = 2, t = true; y < x; y++)
{
if( x % y == 0)
t = false;
}
if(t)
printf("%lu以内%lu是素数\n", n, x);
}
}
return 0;
}
#include
#define mon1 17850.00//税率截点1
#define mon2 23900//税率截点2
#define mon3 29750//税率截点3
#define mon4 14875//税率截点4
#define tax1 0.15//税率1
#define tax2 0.28//税率2
#define Tax1 (mon1 * tax1)//$17850缴税
#define Tax2 (mon2 * tax1)//$23900缴税
#define Tax3 (mon3 * tax1)//$29750缴税
#define Tax4 (mon4 * tax1)//$14875缴税
int main(void)
{
int n;
double bill, tax;
printf("*****************************************************************\n");
printf("请输入您的纳税种类:\n");
printf("1) 单身 \t2) 户主\n3) 已婚,共有 \t4) 已婚,离异\n5) 离开系统\n");
printf("*****************************************************************\n");
while(scanf("%d", &n) == 1)
{
switch(n)
{
case 1:
printf("请输入您的工资\n");
scanf("%lf", &bill);
tax = (bill >= mon1) ? (Tax1 + (bill - mon1) * tax2) : bill * tax1;
break;
case 2:
printf("请输入您的工资\n");
scanf("%lf", &bill);
tax = (bill >= mon2) ? (Tax2 + (bill - mon2) * tax2) : bill * tax1;
break;
case 3:
printf("请输入您的工资\n");
scanf("%lf", &bill);
tax = (bill >= mon3) ? (Tax3 + (bill - mon3) * tax2) : bill * tax1;
break;
case 4:
printf("请输入您的工资\n");
scanf("%lf", &bill);
tax = (bill >= mon4) ? (Tax4 + (bill - mon4) * tax2) : bill * tax1;
break;
case 5:
return 0;//这里的return 0,只要知道直接结束了整个程序就可以了,符合题目要求
default :
printf("请输入正确选项\n");
continue;//continue不能在switch()中使用,这里是和while()匹配
}
printf("您的纳税额为%.2lf,请再次选择纳税种类\n", tax);
}
return 0;
}
#include
#define sort1 2.05//洋蓟的价格
#define sort2 1.15//甜菜的价格
#define sort3 1.09//胡萝卜的价格
#define weight1 5//重量截点1
#define weight2 20//重量截点2
#define cost1 6.5//包运费1
#define cost2 14//包运费2
#define cost3 0.5//包运费3
int main(void)
{
char n;
int w1, w2, w3, W1, W2, W3, W;
double COST1, COST2;
W1 = W2 = W3 = 0;
printf("*****************************************************************\n");
printf("请输入您的选择种类:\n");
printf("a) 洋蓟 \tb) 甜菜\nc) 胡萝卜 \tq) 推出订购\n");
printf("*****************************************************************\n");
while((n = getchar()) != 'q')
{
switch(n)
{
case 'a':
printf("请输入您需要的磅数:\n");
scanf("%d", &w1);
W1 += w1;
printf("请输入您的选择种类:\n");
break;
case 'b':
printf("请输入您需要的磅数:\n");
scanf("%d", &w2);
W2 += w2;
printf("请输入您的选择种类:\n");
break;
printf("请输入您的选择种类:\n");
case 'c':
printf("请输入您需要的磅数:\n");
scanf("%d", &w3);
W3 += w3;
printf("请输入您的选择种类:\n");
break;
}
}
W = W1 + W2 + W3;
COST1 = (W1 * sort1) + (W2 * sort2) + (W3 * sort3);
COST1 = (COST1 >= 100) ? COST1 * 0.95 : COST1;
if(W <= weight1)
COST2 = COST1 + cost1;
else if(W <= weight2)
COST2 = COST1 + cost2;
else if(W > weight2)
COST2 = COST1 + cost2 + (W - weight2) * cost3;
printf("洋蓟的售价为$2.05/pound,甜菜的售价为$1.15/pound,胡萝卜的售价为$1.09/pound.\n");
printf("洋蓟订购%dpound费用为$%.2lf,甜菜订购%dpound费用为$%.2lf,胡萝卜订购%dpound费用为$%.2lf.\n", W1, W1 * sort1, W2, W2 * sort2, W3, W3 * sort3);
printf("订购价格为%.2lf,包运费为%.2lf,总价格为%.2lf", COST1, COST2 - COST1, COST2);
return 0;
}
最后说点题外话,这几天搞毕业论文,让我有点心绪起伏。
我本科专业是消防工程,世殊事异现在也算是不亚于计算机的热门了,别的不说光看18年考注册消防工程师就有90多万人了(目前是全国最难的考试,三年通过率从0.94%涨到3.40%),就像当初一窝蜂涌入互联网领域,消防现在也有这个趋势了。原来消防把持在公安部现役武警的体制内是拥有行业壁垒的,现在私有化进程下也算是个未开垦的处女地吧,未来当有多少英雄豪杰在这个舞台上叱咤风云,令人神往。
学计算机我不是科班出身,没有老师自己摸索是很费功夫的,这变相也占用了学专业的时间和精力。而在消防,我可以非常自豪地说我们学校算是国内数一数二了,每天授课的老师们真的算是这个领域的专家了,而且一个个倾囊相授、尽职尽责。那我现在算是舍本逐末、舍近求远吗?
思考许久,我认为是值得的。消防+计算机(互联网、人工智能、大数据等等)算是一座未开发的金矿,我之前跟老师做课题和做软件的公司合作,我就发现我们懂消防但是不懂计算机、他们懂计算机但是不明白消防。这种信息差不仅产生了巨大的耗费,而且这种“落差”是能产生“势能”的,兼具二者的人应该有巨大优势和利益。
主动进来也许会占得先机,当然也欢迎有能力和兴趣的朋友可以尝试跨界一下,毕竟这也不是我的蛋糕嘛(笑)。
不过我对计算机的喜爱更多的是根植于黑客帝国式的憧憬吧,相信在三四十年后的那个未来科幻世界里,懂得计算机技术的人将能主宰自己的命运,晚安。