C博客作业--指针

一、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("
");
}
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:
"); 
    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
",a);
  printf("gongbeishu:%d
",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( "
Please enter a number: " ); 
   scanf( "%d", &m );
   printf( "
Please enter %d numbers(from small to large): ", m );
   for( k = 0; k < m; k++ )  
      scanf( "%d", &a[k] );
   printf ("
Enter x :  "); 
   scanf ( "%d", &x );
   fun (a, x, &m );
   printf( "
After deleter:
" );
   for( k = 0; k < m; k++ ) 
       printf( " %d,", a[k] );
   printf("
");
   
}
参考答案:int *n
         a[i]==x
         j<*n-1
         *n=*n-1
我的作答:int *n 
         n==0
         j<*n
        a[j]=''
原文地址:https://www.cnblogs.com/78tian/p/8030487.html