c语言博客作业-数据类型
一、PTA实验作业
题目1:7-8 判断合法标识符
1. 本题PTA提交列表
2. 设计思路
- 1.定义变量repeat,i 控制判断次数,j 用于计数输入的字符个数,k用于计数输入的合法字符个数。定义字符变量ch 。
- 2.输入repeat,同时输入ch=getchar();以吸收回车。
- 3.使用for循环,控制次数。重复第4到8步。
- 4.使用do-while语句,逐次进行每个字符的输入,同时用 j 统计个数。重复5和6步,指导输入字符为'\n',跳出循环。
- 5.使用 if 语句,判断 j 为1时(首字符)的字符是否为字母或下划线。是则为合法字符,k+1;
- 6.使用 if 语句,判断 j 不为1时的字符是否为字母,下划线和数字,是则为合法字符,k+1;
- 7.当跳出循环后,判断k是否等于j,是则输出yes,否则输出no。
- 8.给j和k赋初值为0;为下一次for循环做准备。
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 没有吸收回车的问题,在本题我的代码中出现很多次,而且造成代码完全出错。一次是repeat没吸收回车,调试时刚打了4,就printf(“no”),一次是判断完一次合不合法后没有吸收回车,所以输不了第二次标识符,为了解决这个问题,我在do-while 前加了getchar,最后一次是我的 j 和 k 在合法标识符的情况下是不等的,因为我是用的是do-while语句,所以最后输入的回车会被统计进 j ,而不会被统计进 k ,于是添了新的if语句。此外最后一次格式错误是因为我在上述第二次问题中使用getchar吸收回车导致格式错误,思来想去换成了在printf语句后加\n。
题目2:7-10 简单计算器
1. 本题PTA提交列表
2. 设计思路
- 1.定义变量number1和number2来存放运算符两边的运算数。i控制循环,result存放每一个运算符运算后的结果,j统计出错个数。
- 2.输入number1,将result赋初值为number1,j赋初值为0;
- 3.使用for循环,ch=getchar(),(ch输入的字符为运算符)
- 4.使用switch语句,case'+':
scanf("%d",&number2);result+=number2;break; - 5.另三个运算符同上。
- 6.当运算符为除号时,判断是否为0,是的话输出ERROR,同时j加一。
- 7.运算符为=,break;
- 8.default:
printf("ERROR");j=j+1;break; - 9.跳出switch语句后,如果ch=‘=’,输出result,跳出for循环。如果j不等于0,说明已经出错,也跳出for循环。
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
本题第一遍除号错打成乘号,c++调试一次后就过了。
题目3:7-6 掉入陷阱的数字
1. 本题PTA提交列表
2. 设计思路
- 1.定义i控制循环变量,sum为累加和,number为判断两次sum的值是否相同
- 2.输入N,sum赋初值为0
- 3.使用for循环,将number赋为sum(sum为上一次循环带来的值)的值,同时sum需重新赋值为0,
- 4.当输入的N大于一位数时,使用while语句,进行各位数字求和 sum=sum+N%10;
N=N/10; - 5.如果N小于10,sum直接sum=sum+N(这一步的sum 可以是从第四步累加下来的)
- 6.sum=sum*3+1;然后输出sum。
- 7.使用if 语句,如果第一次循环sum的值就为13,break。如果number等于sum,说明已掉进陷阱,break。
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
这道题错了两个地方,一次是每次for循环sum没有赋初值,一次是一步到位的语句没写,但是调试的过程忘了截图。不过很快找出了错误。
二、截图本周题目集的PTA最后排名
三、本周学习总结
1.你学会了什么?
1.1 一维数组如何定义、初始化?
一维数组定义的一般形式为:类型名 数组名 【数组长度】
初始化就是赋初值,举例 int a [5]={1,2,3,4,5} 就是给a[0]到a[4]分别按大括号里的顺序赋初值。静态数组如果没有初始化会自动赋值为0,否则元素的值不确定。如果没写数组长度,系统按大括号里的数字个数自动给数组赋数组长度。
1.2 一维数组在内存中结构?可画图说明。数组名表示什么?
数组名表示该数组分配连续内存空间中第一个单元的地址,即首地址。知道了首地址,那么假设int型占用两个字节,首地址为4010,就可以知道其他数的地址为4012 ,4014.。。。递增。也就是说知道了首地址,每个元素的字节数,其余的元素的存储地址均可以计算得到。
1.3 为什么用数组?
在程序中使用数组,可以让一批相同类型的变量使用同一个数组变量名,用下标来相互区分。他的优点是表达简洁,可读性好,便于使用循环结构。
1.4 介绍选择法、冒泡法、直接插入排序如何排序?伪代码展示.
选择法:
- 1.定义n个元素,i,k用于控制循环次数,idenx用于存放最小值
- 2.将n个元素赋值给a[n],idenx赋值为k,k=0;即假设第一个数组值为最小值。
- 3.for(i=k;i<n;i++){
if(a[i]<a[idenx]) idenx=i; - 4.找到最小值后将它赋为a[0],k=k+1;idenx=k;重复第三步,找到最小值,赋为a[1],依次类推。
冒泡法:
- 1.定义n个元素,i用于控制循环次数,max存放最大值。k用于交换
- 2.将n个元素赋给数组a[n],max=n;
- 3.for(i=n-1;i>=0;i--){
if(a[i]>a[max])k=a[max];a[max]=a[i];a[i]=k; - 4.输出。
直接插入排序法:
1.5 介绍什么是二分查找法?它和顺序查找法区别?
二分查找法就是假设有n个元素,取第n/2个元素,比较其与要找的元素x是否相等,相等则结束,否则比较大小,小则在左半部分找中间数,比较是否相等,以此类推,直至找到。顺序查找法是从第一个依次与x比较是否相等。这两个查找法的表都是升序的。二分查找法比较次数少,查找速度更快。
1.6 二维数组如何定义、初始化?
二维数组的定义形式为:
类型名 数组名 【行长度】【列长度】
举例:int a[3][3]={{1,2,3},{4,5,6},{7,8,9}},一位内二维数组是平面的,所以先行后列的给数组中的元素赋值。
1.7 矩阵转置怎么实现?方阵中:下三角、上三角、对称矩阵的行标i列标j的关系?请说明。
转置矩阵:
int a[c][d];int b[c][d];
for(i=1;i<=c;i++)
for(j=1;j<=d;j++)
b[i][j]=a[j][i];
下三角i>j;上三角i<j;对称i=j;
1.8 二维数组一般应用在哪里?
矩阵
2.本周的内容,你还不会什么?
学了数组,但是目前还没实际运用过,感觉可能不太熟练,还有课堂派的那道填空题,目前那种题我做不出来。这次的期中考考的很差,伤心的同时我也意识到自己对一些基础知识掌握不牢,关键时刻用不上。