一、PTA实验作业
题目1:6-2 求出数组中最大数和次最大数
1. 本题PTA提交列表
2. 设计思路
定义变量i,j用于循环,t用于中间转换量,max表所求最大值
(外)for i=0 to 2
max=i 假设a[0]最大
(内)for j=i+1 to n
如果 a[j]>a[max] max=j 最大下标改变
a[i] 与 a[max] 交换
end for
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 完全错误,在查找最大值及与第一个数交换地方不对,思路上一开始打算把最大、最小值分别找出来,最后与第一、二个数进行交换,无法得出答案;
- 重新组织思路,在找完第一个数之后,接着直接从第二个数与后面数相比较,进行内外循环;
- 发现在实现一次的查找之后,次大数应直接从1开始,所以要在内循环里做改变,为使第二次能从1开始查,j=i+1;
- 答案错误,次大值位置错,说明内循环与交换有问题,调试发现执行内循环时括号匹配错,在if(a[j]>a[max])判断时加上括号会使最大值换值出错;
题目2:6-4 找最大值及其下标
1. 本题PTA提交列表
2. 设计思路
定义变量i用于循环,max存放最大值
初始化:i=0;max=0;*b=0;
for i=1 to n-1
如果 a[i]>a[max] max=i 改变最大值下标
a[max]=a[i] 交换
*b=max;
end for
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 答案错误,,position的值未进行说明得出,不断调试,发现一是循环内条件出错以及返回值不相符;
- 本题要求找最大值,一开始写成交换代码,没有下标返回,应该只要进行一次的对比,然后利用指针将对应最大下标max传回原来的内存中;
题目3:6-7 过滤字符串只保留串中的字母字符
1. 本题PTA提交列表
2. 设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 答案错误,判断过滤不正确;
- 调试,字符串的个数正确,新输出的字符串没发生变化,说明返回新的字符串过程错误,修改,使新的字符串赋值到原来的里面返回;
二、截图本周题目集的PTA最后排名
三、阅读代码
代码1:
冒泡排序:重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来;遍历数列的工作是重复地进行直到没有再需要交换;
#include<stdio.h>
#include<assert.h>
#include<stdlib.h.h>
int main(){
TestBubbleSort(BubbleSort1);
TestBubbleSort(BubbleSort2);
system("pause");
return 0;
}
void BubbleSort1(int *arr,int sz){//从头向尾遍历,相邻两数进行比较,将最大数(相对)沉入尾部(相对)
int i = 0;
int j = 0;
assert(arr);
for(i=0;i<sz-1;i++){
for(j=0;j<sz-i-1;j++){
if(arr[j]>arr[j+1]){
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
void BubbleSort2(int *arr,int sz){//从尾向头遍历,相邻两数进行比较,将最小数(相对)冒泡到头部(相对)
int i = 0;
int j = 0;
assert(arr);
for(i=0;i<sz-1;i++){
for(j=sz;j>i;j--){
if(arr[j]>arr[j-1]){
int tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
}
}
}
}
//为了方便起见,将参数设定为一个函数指针
void TestBubbleSort(void (*BubbleSort)(int *arr,int sz)){
int arr[]={1,3,5,7,9,2,4,6,8,0};
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
BubbleSort(arr,sz);
for(i=0; i<sz; i++){
printf("%d ",arr[i]);
}
printf("\\n");
}
int main(){
TestBubbleSort(BubbleSort1);
TestBubbleSort(BubbleSort2);
system("pause");
return 0;
}
程序分析:
该代码功能:实现排序;
优点:这两种方式相对来说容易理解,不属于复杂级的,而且利用函数进行解答,可以对函数进行巩固,也可以给对使用冒泡法不清楚的同学进行参考,掌握;
代码2:
#include<stdio.h>
int main()
{
int a,b,num1,num2,temp;
printf("please input two number:\\n");
scanf("%d%d",&num1,&num2);
if(num1<num2){
temp = num1;
num1 = num2;
num2 = temp;
}
a=num1;
b=num2;
while(b!=0){ /*利用辗除法,直到b为0为止*/
temp=a%b;
a=b;
b=temp;
}
printf("gongyueshu:%d\\n",a);
printf("gongbeishu:%d\\n",num1*num2/a);
}
程序分析:
该代码功能:输入两个正整数m和n,求其最大公约数和最小公倍数;
优点:利用了辗转相除法,它处理大数时非常高效,它需要的步骤不会超过较小数的位数(十进制下)的五倍,熟悉它后可以也利用递归思想进行解题,提升代码能力;
四、本周学习总结
1.自己总结本周学习内容
- 指针深入学习,应用指针,对指针进行初始化操作,初值置为空,指针与函数结合进行数组、字符串间的习题训练,更了解指针的用法;指针可以进行改变,对该指针进行赋值等操作,指向其他单元地址,从而表示不同的内容,表示数组时,*(p++)就可以逐个表示所表示数组内的值; 指针用于函数中时,又可以实现将数据返回到主函数中特定的值;
- C语言常用字符串处理函数链接:http://m.blog.csdn.net/junyucsdn/article/details/50759021
- 结构体学习,在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据,结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员,【注意】大括号后面的分号;不能少,这是一条完整的语句;
一般形式:
struct 结构体名{ struct stu{
结构体所包含 int num; //学号
的变量或数组 char *name; //姓名
}; int age; //年龄
char group; //所在学习小组
float score; //成绩
};
2.罗列本周一些错题
课堂派错题1:
此题错在对-->的使用在预习结构体时还不理解熟悉,选错;
正确答案:D
[解析]:通过结构体变量引用其成员用“.”,通过结构体指针引用其成员用“-->”,本题中选项A、B和C引用其成员变量都正确,选项D数组越界;
课堂派错题2:
#include <conio.h>
#include <stdio.h>
#define M 20
void fun ( int a[ ], int x, ______1___ )
{
int i,j;
for(i=0;i<*n;i++)
if(____2____)
break;
for(j=i;____3____;j++)
a[j]=a[j+1];
_______4______;
}
int main( )
{
int k, m, x, a[M];
printf( "\\nPlease enter a number: " );
scanf( "%d", &m );
printf( "\\nPlease enter %d numbers(from small to large): ", m );
for( k = 0; k < m; k++ )
scanf( "%d", &a[k] );
printf ("\\nEnter x : ");
scanf ( "%d", &x );
fun (a, x, &m );
printf( "\\nAfter deleter:\\n" );
for( k = 0; k < m; k++ )
printf( " %d,", a[k] );
printf("\\n");
}
参考答案:int *n
a[i]==x
j<*n-1
*n=*n-1
我的作答:int *n
n==0
j<*n
a[j]=\'\\0\'