一.PTA实验作业
题目1: 7-6 掉入陷阱的数字
1. 本题PTA提交列表
2.设计思路
定义变量N,i,g=1表示位数,a表示各位数字相加的和,b=0,j,N1,c,d用于储存N
do{
for(i=0;i<N1;i++){
算出N的位数g
}
for(j=g;j>0;j--){
各位数字相加求和a
}
N1=3*a+1;
按格式输出printf("%d:%d",b,N1);其中b由1开始增加
直到N1等于N结束循环
3.代码截图
4.本题调试过程中碰到的问题以及解决方案
题目2: 7-4 打印菱形图案
1. 本题PTA提交列表
2.设计思路
int n,a,i,l,j,k,g,h,count=0,count1=0;
输入n
if((n-1)%2==0)则继续
由规律可以看出,
上半部分(大三角型)有 (n+1)/2行
for(i=(n+1)/2;i>0;i--){
行数count加1
输入*的数量=2*count-1
for(j=2*count-1;j>0;j--)
在输入完每一行的*后输出换行
for(k=(n-1)/2;k>0;k--){
下半部分有 (n-1)/2行
思路同上
3.代码截图
4.本题调试过程中碰到的问题以及解决方案
- 1.思路错误:漏掉了空格的步骤
- .解决方案:如上代码。根据空格数与行数的规律输出空格
- 2.部分正确:if((n-1)%2==0)在判断奇数时,求余写成除法
. - 解决方案:改为求余的%
题目3:7-8 判断合法标识符
1. 本题PTA提交列表
2.设计思路
定义一个数组 line[80],整型n(表示做n次下列运算 )
输入n
令j=1,k=0
给数组赋值直到line[k]='\n',期间k++
判断第一个字符是否为下标号和字母,如果是则进行下面,不是则输出NO
k=1
从line[1]开始判断每个字符是否是下标号或字母或数字
k++;
continue;跳过后面语句
直到line[k]!='\0'
若有不是的
printf(NO,换行)
break;
若每个都是,即line[k]==0
printf(合格,换行)
j++,再次赋值数组
直到j=n
3.代码截图
4.本题调试过程中碰到的问题以及解决方案
1.对数组赋值后进行判断时line[k]=0
2.错误:进行判断的下标符输入错误
解决方案:从题目复制
3.错误:判断错误后没有结束循环导致输出两个结果
解决方案:加break;
二.截图本周题目集的PTA提交列表及最后排名
三、本周学习总结(3分)
1.你学会了什么?
1.1 一维数组如何定义、初始化?
类型名 数组名 [数组长度];
如:int a[10];
1.2 一维数组在内存中结构?可画图说明。数组名表示什么?
-
一维数组再内存中结构是连续的,线性的;
-
数组名指定数组内每个元素的类型
1.3 为什么用数组?
- 使用数组可以让一批相同类型的变量使用同一个数组变量名,用下标来相互区分
- 表达简洁,可读性好,便于使用循环结构
1.4 介绍选择法、冒泡法、直接插入排序如何排序?伪代码展示.
1.选择法
- 考虑n个数的数组A:首先找出A中的最小元素并将其与A[0]中的元素进行交换,然后找出A中次最小元素并将其与A[1]中的元素进行交换,对A中的前n-1个元素进行该操作。
定义数组a[具体数n]={数组赋值}
定义i,j,temp;
int b=n;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<b;j++)
{
如果a[i]>a[j]{
把两个记录的相反次序进行交换
}
}
}
for(i=0;i<n;i++){
printf("%d",a[i]);
}
2.冒泡法
- 冒泡排序法:即两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
定义i=0,j,t;
for(i=0;i<len;i++)
{
for(j=0;j<len-i-1;j++)
{
if(a[j]>a[j+1])
{
将a[j]和a[j+1]交换
}
}
}
按顺序输出数组
}
3.直接插入排序
- 指每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。具体方法是第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程
1.5 介绍什么是二分查找法?它和顺序查找法区别?
- 二分查找法就是先寻找数组中间位置的数,判断其是否为要寻找的数,不是的话,大于要找的数,则往左继续二分,小于要找的数,则往右二分。
- 二分查找法适用于排序过的数组,速度快,顺序查找法要遍历数组,在数组很大时效率低,但对数组本身没有要求,适用于短数组
1.6 二维数组如何定义、初始化?
- 二维数组定义格式为 类型名 数组名 [行长度][列长度]
- 初始化格式为类型名 数组名 [行长度][列长度] = { {初值表0}, ... ,{初值表k}, ...} 如果初始化了全部行,则可以忽略行长度
1.7 矩阵转置怎么实现?方阵中:下三角、上三角、对称矩阵的行标i列标j的关系?请说明。
#include<stdio.h>
int main(void) {
int n1,m1,n2,m2,i,j;
printf("输入一个矩阵的行和列:");
scanf("%d%d",&n1,&m1);
m2=n1; n2=m1; /*将行和列交换定义*/
int a1[n1][m1],a2[n2][m2];
printf("输入%d*%d的矩阵\n",n1,m1);
for(i=0;i<n1;i++)
for(j=0;j<m1;j++)
scanf("%d",&a1[i][j]);
for(i=0;i<n1;i++)
for(j=0;j<m1;j++)
a2[j][i]=a1[i][j];
for(i=0;i<n2;i++)
{
for(j=0;j<m2;j++)
printf("%d ",a2[i][j]);
printf("\n");
}
return 0;
}
下三角qi>=j 上三角i<=j 对称矩阵 a[i][j]=a[j][i]
1.8 二维数组一般应用在哪里?
当数组中的数表示的不止一种含义时,比如我们要表示不同的人不同科目的成绩时,这里有两个变量,不同的人和不同科目,所以要用二维矩阵,在或者是矩阵时,就要用到二维数组
2.本周的内容,你还不会什么?
- (1)对直接插入排序不是很理解
- (2)其他的还没有遇到