一、PTA实验作业
题目1:7-4 打印菱形图案
本题要求编写程序,打印一个高度为n的、由“”组成的正菱形图案。
输入格式 : 输入在一行中给出一个正的奇数n。
输出格式 : 输出由n行星号“”组成的菱形,如样例所示。每个星号后跟一个空格。
1. 本题PTA提交列表
2. 设计思路
上半部分
- 1、定义变量i实现行数的循环,j实现空格的循环,K实现 * 的循环 ,m,n ;
- 2、数的输入:scanf("%d",&n);
- 3、取奇数且保证为正数;
- 4、进入for外循环 实现前(n/2)+1行,即输出至中间行 for(i=1;i<=n/2+1;i++);
- 5、内循环实现空格 (j=((n/2)+1-i)*2;j>=1;j--);
- 6、继续嵌套循环for(k=1;k<=(2i)-1;k++)实现 输出;
- 7、记得换行: printf("\n");
下半部分
- 8、继续重复实现后面几行for(i=1;i<=n/2;i++)
- 9、防止后面多出一行空格,先判断: if(i!=1) printf("\n");
- 10、接下来的同上;
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- (1)一开始的思路错误,不懂的怎么实现前面空格,解决:需要找出行数 i 与空格关系;
- (2)格式错误&修改错误,跟题目要求不一致,多次改动,加星号之间的空格,然后在最后一行应该是没有空行的,所以要把下半部分,最后面的printf(“\n”)放到for的最开始,否则会从下半部分就出现换行,多空出一行;
题目2:7-5 BCD解密
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
1. 本题PTA提交列表
2. 设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- (1)题目理解出错,根据提示先把18转换回十六进制0x12,然后再转换回十进制12,结果出错;
- (2)进制间的转换不对,在上一个问题基础上进行修改,反而更乱,再进行计算发现在第一步就已经转换成了12,不需要再变,否则相当于没转;
题目3:7-10 简单计算器
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式: 输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式: 在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
1. 本题PTA提交列表
2. 设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 答案错误,输不出任何值
-答案只满足输出样例,改为其他数就是错误的;
- 修改多次,仍为部分正确,规定时间内没法改正确;
二、截图本周题目集的PTA最后排名
三、本周学习总结
1.你学会了什么?
1.1 一维数组如何义、初始化?
一维数组的初始化:在编译阶段进行,不占用运行时间;
- 一维数组定义的一般形式是:类型名 数组名 [数组长度];
- 一维数组的初始化:类型名 数组名 [数组长度] ={ 初值表 };如:a [ 5 ] ={1,2,3,3,4}; static char ch [ 3 ]= {‘p‘,‘q‘,‘q‘};给部分元素赋值 static int a [ 5 ] = {7,6};
1.2 一维数组在内存中结构?可画图说明。数组名表示什么?
- 数组存储:系统为数组分配内存中的一片连续的存贮单元,各元素按下标从小到大的顺序排列;
- 一维数组在内存中结构:具体见大一C语言课本149-150页;
- 数组名是一个地址常量,存放数组内存空间的首地址;
a
4010 4012 4014 4016 4018 4020 4022 4024 4026 4028 内存地址
9 8 7 6 5 4 3 2 1 0 下标
值
1.3 为什么用数组?
- 数组是可以在内存中连续存储多个元素的结构数组中的所有元素必须属于相同的数据类型;
- 减少内存占用、代码定义变量;
1.4 介绍选择法、冒泡法、直接插入排序如何排序?伪代码展示.
选择法:找个最小值min,后续比较比min小就交换;
- 1、定义数组 a [ i ];
- 2、起始:for( i =0 ;i < n - 2;i++);
- 3、下标为 i 的值设为最小值min
- 4、 :数组进行循环 for i = 2 to n-2 ,如果 a [ i ] < min ,则 a [ i ] = min;
- 5、 重复循环进行比较;
- 6、 min的值赋给a [ i ],返回1;
冒泡法:每次排序时,从下往上查看,若发现顺序错误,则交换位置,在第 ( n-1) 趟排序完成后,所有的数字都按顺序排列完毕,较大的数放在后面;
- 1、定义数组 a [ i ];
- 2、数组起始下标:for ( i=0 ;i< n-3;i++)
- 3、:数组进行循环,for i=0 to n-2 ,如果 a [ i ] > a [ i + 1] ,则交换 a [ i ] 与 a [ i +1];
- 4、每次两个数字之间的交换需要三次的操作;
直接插入法:循环寻找插入的位置,将原来数组 a [ i ] 所对应的值变成插入的值,后面数组 a [ i+1 ] 对应原先数组 a [ i ] 的值;
- 1、定义数组 a [ i ];
- 2、起始:for( i =0 ;i < n - 2;i++);
- 3、数组进行循环 for i = 2 to n-2 ,从第二个数开始与前一个数进行比较;若前一个数小,则交换到前一个位置;
- 4、重复步骤3,直到该数前面没数字或者前一个数比它大;
1.5 介绍什么是二分查找法?它和顺序查找法区别?
二分查找法又称折半查找,充分利用了元素间的次序关系,它的基本思想是;将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x;
与顺序查找法区别:
- 二分法只用于数据按顺序排列,相比于顺序法效率会高,减少了比较和移动的次数,降低了复杂程度;而顺序法可用于无规律数据的查找,效率较低;
- 二分法所占空间内存比顺序法小;
1.6 二维数组如何定义、初始化?
- 二维数组定义的一般形式是:类型名 数组类型 数组名[数组行长度][数组列长度]
- 二维数组初始化一般形式是:类型名 数组类型 数组名[数组行长度][数组列长度]={ { 初值表1},···,{ 初值表k},···};
1.7 矩阵转置怎么实现?方阵中:下三角、上三角、对称矩阵的行标i列标j的关系?请说明
- 定义转置前数组 a [ i ][ j ],数组的行下标与列下标互换,即 i 与 j 互换,即可实现矩阵转置;
转置前:
- 上三角:i > = j;
- 下三角:i < = j;
转置后:
- 上三角:i < = j;
- 下三角:i > = j;
- 对称矩阵:a [ i ] [ j ] ==a [ j ] [ i ];
1.8二维数组一般应用在哪里 ?
- 一个是问题中需要用到行、列的地方,使用二维数组比较方便;
- 二是可以应用于描述表示方阵或矩阵上;
2.本周的内容,你还不会什么?
int main(void){
float s[6]={1,3,5,7,9};
float x;
int i;
scanf("%f",&x);
for(i=4;i>=0;i--)
if(s[i]>x) s[i+1]=s[i];
else break;
printf("%d\n",i+1);
return 0;
写出下列程序的运行结果:
- (1)如果输入4,则输出 5 4
- (2)如果输入5,则输出 3 5 4
- 这题答案出错,加上这次的期中考试,发现在阅读程序这一块还不够,需要加强;
- 对于数组,在定义时,及应用都还不熟悉;
- 对于数据类型,在练习运算,包括优先级等问题;
- 还有写程序时,尽量精简内容,要多使用类似于flag 这类的符号语言,减少复杂度;