第4章第1章基础知识1基础简介.docx

上传人:夺命阿水 文档编号:346252 上传时间:2023-04-20 格式:DOCX 页数:9 大小:70.01KB
返回 下载 相关 举报
第4章第1章基础知识1基础简介.docx_第1页
第1页 / 共9页
第4章第1章基础知识1基础简介.docx_第2页
第2页 / 共9页
第4章第1章基础知识1基础简介.docx_第3页
第3页 / 共9页
第4章第1章基础知识1基础简介.docx_第4页
第4页 / 共9页
第4章第1章基础知识1基础简介.docx_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《第4章第1章基础知识1基础简介.docx》由会员分享,可在线阅读,更多相关《第4章第1章基础知识1基础简介.docx(9页珍藏版)》请在课桌文档上搜索。

1、第4章第1章基础知识1.1基础简介蓝桥比赛中,前几题往往会考查学生的基础知识,基础知识包含的内容很多,这里选择几个知识点介绍。一、计算机中数据的表示计算机中数据分为数值型数据和非数值型数据。计算机中的数字、字母、符号等信息都必须转换成二进制数据保存在计算机中。这样才能被计算机识别。能够进行算术运算得到明确数值概念的信息称为计算机数值数据,其余如字符、文字、图像、声音等均为非数值数据。L数值类型数据的表示计算机中常用的进制包括十进制、八进制、十六进制和二进制。十进制以正常数字1-9开头,八进制以数字O开头,十六进制以0x(或OX)开头,二进制不能在C语言中直接书写,部分编译器支持以Ob或OB开头

2、的二进制数据表示。例如:inta=12,b=012,c=0xl2;printf(*%d%d%d*,a,b,c);输出结果:121018上述输出结果为十进制输出,数据要想以八进制或者十六进制的形式输出,需要改变输出控制符,如下所示:printf(*%d%o%x”,a,b,c);输出结果:121212那如何表示二进制数据呢?常用的方法就是采用字符数组的方式,下面例子实现了如何将一个十进制数转换成二进制数并存储在字符数组中:WhiIe(num0)辗转取余(arrn+=num%2+0;num=2;)2.非数值类型数据非数值类型数据也是以二进制数据形式保存在计算机中。最简单的就是字符数据,其采用的编码是

3、ASCIl编码。ASClI码也是以整数形式存储在计算机中的,这个整数为编码,常用的编码和字符对应如下:F号编码字符备注10NUL(NULL)多用于字符串结束标志213CR回车键3480其它字符9的编码是依次是4957465A大写字母BZ的编码依次是6690597a小写字母bz的编码依次是98122将一段字符转换成整数存放到一个变量中,常用的方法是:intchnum(charstr)inti,n,num-0;for(i=0;stri!=0,;i+)if(stri=*O,&stri=0;i-)输出结果Printf(%c”,Hexfresulti);三、闰年计算地球绕太阳的运行周期为365天5小时4

4、8分46秒(合365.24219天),即一回归年(tropicalyear)0公历的平年只有365天,比回归年短约0.2422天,每四年累积约一天,把这一天加于2月末(即2月29日),使当年的时间长度变为366天(112月分别为31天、29天、31天、30天、31天、30天、31天、31天、30天、31天、30天、31天),这一年就是闰年。按照每四年一个闰年计算,平均每年就要多算出0.0078天,经过400年就会多出大约3天来,因此,每400年中要减少3个闰年。闰年的计算,归结起来就是通常说的:四年一闰;百年不闰,四百年再闰。利用逻辑表达式表示:year%4=0&year%100!=0year

5、%400=0而对于每月天数的表示,由于也没有规律性,所以常用的表示方式是利用数组来表示。如:intdays13=0,31,28,31,30,31,30,31,31,30,31,30,31);四、文件操作在程序中,经常会遇到需要读取的数据量比较大的情况,如果用键盘输入,则输入时间较长,这时就需要用到文件操作了。常用的文件操作分成以下四步:一是打开文件;二是判断文件打开是否成功;三是读取(写入)文件;四是关闭文件。例如:FILE*fp;fp=fopen(D:,r);if(fP=NULD(printf(*failtoOPen!n);return0;)while(!feof(fp)chi+=fgetc

6、(fp);fclose(fp);由于程序竞赛中,往往只需要从文件中读入程序数据即可,为了简化读入过程,读取文件数据最常用的方法就是文件重定向技术。常用的方式是使用freopen()函数,其声明为:FILE*freopen(constchar*fiIename,constchar*mode,FILE*stream);重定向技术的使用方法如下:将输入重定向到文件,后面的输入语句直接到文件中读取数据freopen(,r,stdin);将输出重定向到文件,后面的输出语句直接将数据输出到文件中freopen(,w,stdout);从文件中读取数据,存入变量中inta,b;scanf(,%d%d”,&a,

7、&b);printf(%dn”,a+b);关闭文件fclose(stdin);fclose(stdout);1.2购物单(2017试题A)【题目描述】小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。取款机只能提供100元面额的纸币。小明想尽可能少取些现金,够用就行了。你的任务是计算出,小明最少需要取多少现金。以下是让人头疼的

8、购物单,为了保护隐私,物品名称被隐藏了。180.90 10. 2556.14104. 65 100. 30 297. 15 26. 75130. 62240. 28270. 62 115. 87247. 34 73.21 101.00 79. 54278.44 199. 2612. 97166. 30 125. 5084. 98113. 35 166. 5788折65折9折9折88折半价65折 半价58折8折88折95折9折半价 半价7折半价 9折78折58折9折68折 半价42.56 81.90131.78 255. 89109. 17 146. 69 139. 33 141. 16 154

9、. 7459. 42 85. 44293. 70 261. 7911.30268. 27 128. 29251.03 208. 39 128. 8862. 06 225. 8712. 89 34. 2862. 16 129. 12218. 37289. 699折95折8折78折9折68折65折78折8折8折68折88折65折88折58折88折8折75折75折9折75折75折75折58折半价半价8折需要说明的是,88折指的是按标价的88%计算,而8折是按80%计算,余者类推。特别地,半价是按50%计算。请提交小明要从取款机上提取的金额,单位是元。答案是一个整数,类似4300的样子,结尾必然是00

10、,不要填写任何多余的内容。特别提醒:不许携带计算器入场,也不能打开手机。【解析】该题的计算不算复杂,难点在于如何将数据读入到数组中。这里利用了C+中的文件读取技术:文件重定向。程序的具体步骤是:(1)对数据进行预处理由于原始数据有数字,也有中文,需要进行预处理。将数据复制到文本文件中,利用替换工具将“半价”替换成“50”,然后将“折”替换成(空)。最后将文件保存为(2)读取数据到数组利用文件重定向技术:freopen,将数据输入改成到文件中读取。然后利用循环语句读取文件数据。(3)计算数据并输出将读取的数据进行计算,这里注意的是:折扣如果小于10的话,需要进行乘10处理。【参考程序】#incl

11、udeusingnamespacestd;floatprice100;intdiscount100;intmain()(inti;freopcn(z,zz,r”,stdin);i=0;while(cinpriceidiscounti)i+;i=0;floatsum=0;while(pricei!=0)(if(discounti10)sum+=pricei*discounti10;elsesum+=pricei*discounti100;i+;)coutsumendl;return0;)1.3第几天(2018试题A)【问题描述】2000年的1月1日,是那一年的第1天。那么,2000年的5月4日,

12、是那一年的第几天?注意:需要提交的是一个整数,不要填写任何多余内容。【参考答案】125【解析】本题考查的闺年的判断。因为该题的数据量比较小,也可以直接计算:31+29+31+30+4=125在实际编程过程中,如果涉及到较多的年份,即需要编写一个函数来判断闰年,是则二月是29天,否则是28天。【参考代码】#includeusingnamespacestd;boolleap(intyear)return(year%4=0&year%lOO!=Oyear%400=0);intmain()intfeb;if(leap(2000)feb=29;feb=28;cout31+feb+31+30+4endl;

13、returnO;1.4明码(2018试题B)【问题描述】汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛。16点阵的字库把每个汉字看成是16x16个像素信息。并把这些信息记录在字节中。一个字节可以存储8位信息,用32个字节就可以存一个汉字的字形了。把每个字节转为2进制表示,1表示墨迹,0表示底色。每行2个字节,一共16行,布局是:1 第1字节,第2字节2 第3字节,第4字节3 .4 第31字节,第32字节这道题目是给你一段多个汉字组成的信息,每个汉字用32个字节表示,这里给出了字节作为有符号整数的值。题目的要求隐藏在这些信息中。你的任务是复原这些汉字的字形,从中看出题目的要求,

14、并根据要求填写答案。这段信息是(一共10个汉字):404040432-1-16432432432432432832832163416343230-64016641664346812712666-12467466466-124126100663666466466412646640016404040432-1-16432432432432432832832163416343230-6400-12864-12848-1281781-42888016643264-326432-9632-963316348361440440301004-1-2404167-8416416416816816161632-

15、96641664207262-473325161063-810-1-206408063-88644641640-12801663-810101014-1-21010101010101050202O2O7-16832246437-128212812-128113-4281216183233-641O14O112O1O1O1O932916171217433166516132164O-1281O2O12O112OOOO7-16242448125612O56O-32O-64O-128OOOOl-1283-641-128OO注意:需要提交的是一个整数,不要填写任何多余内容。【解析】汉字的字形码表示方法如

16、下图所示。要得到字形信息,需要进行两步转换:一是将字模信息转换成二进制的位代码;二是再将位代码转化成中文字模。中文字模位代码0100 0 10 0001 00 0 10 0001 00 0 10 0010 0Ollll110 00 10 0 0010 01 0 0 0 0010 10 0 0 0 1010 00 0 0 0 1010 00 0 10 1010 00 0 10 1010 00 10 0 1010 01 0 0 0 1010 00 0 0 0 1010 00 0 0 0 1010 00 0 10 1010 00 0 0 1 0000 00 0 00 0 01 1 10 0 10 1

17、 00 0 00 0 01 0 00 1 00 1 10 0 10 0 00 0 00 0 00 0 0字模信息0x08,0x80 OXO8, 0x80 OXO8, 0x80 0x1 lj Oxfe 0x1 Ij 0x02 0x32, 0x04 0x5% 0x20 0x10, 0x20 OxlOj OXa8 OxlOj OXa4 0x11,0x26 OXl2, 0x22 0x10, 0x20 0x10, 0x20 OxlOj OxaO 0x10, 0x40本题的解题方法有两种:(1)自己编写转换函数自己编写转换函数,需要弄明白一点:数据在计算机中是以补码形式存储的。正数的补码跟原码相同,转换比

18、较容易,直接转换即可。负数的补码相对复杂一点,是原码(除符号位外)各位变反加1。例如:4直接转换:。T的原码:,转换成补码:。(2)利用bitset模板类bitset模板类包含在C+的bitset头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。该模板类可以实现整数到二进制数的自动转换,一般用法如下:#includebitsett(24);把24转换成一个8位的二进制数t=30;把30转换成一个8位的二进制【参考程序1#includeintmain()intn,num=0,offset=l;charch1616;/存储16*16字模for(intk=0;k

19、32;k+)scanf(z/%dz,&n);if(nO)n=n+128;for(inti=l;i=8;i+)(intmod=n%2;n=n2;chnum28*offset-i=mod+48;)num+;if(num%2=0)offset=1;elseoffset=2;)for(inti=0;i16;i+)for(intj=0;j16;j+)Printf(%c,chij);printf(n);)return0;)【参考程序2】#includettincludeusingnamespacestd;intmain()(intn,num=0;for(intk=0;k32;k+)SCanf(,&n);if(n0)n=n+128;bitsetb(n);coutb;num+;if(num%2=0)coutendl;)return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号