C博客作业--指针

本文解析了PTA平台上的三个编程题目:统计大于等于平均分的人数、过滤字符串保留字母字符、查找子串最后一次出现的位置,并分享了调试过程中遇到的问题及解决办法。

一、PTA实验作业

6-3 统计大于等于平均分人数

1. 本题PTA提交列表

1233242-20171217214936233-992142139.png

2. 设计思路

  - 1.定义i用于循环,flag存放大于平均分人数,sum为总分数。
  - 2.使用for循环,累加sumfor(i=0;i<n;i++,s++){
        sum=sum+*s;
    }
  - 3.求平均值,存放于*aver中
  - 4.使用for循环,当数组中元素大于平均值时,flag++
        for(i=n-1;i>=0;i--,s--){
        if(*s>=*aver){
            flag++;
        }
    }
  - 5.return flag;

3.代码截图

1233242-20171217215324452-1113182554.png

4.本题调试过程碰到问题及PTA提交列表情况说明

第二个for循环中,刚开始调试,统计的人数不对,因为 i 所指的数组数和 s 所指的数组数不一致,当i 指向0时,s才刚刚知道s【1】,也就是少了一个,所以人数不对,多次调试和循环后在第二个for循环上加了一个 s--; 得到正确答案。

6-7 过滤字符串只保留串中的字母字符

1. 本题PTA提交列表

1233242-20171218213320271-558889450.png

2. 设计思路

1.定义flag用于统计数字,temp用于统计字符个数
2.使用for循环,每次循环temp加一,
3.如果指针指向的数为阿拉伯数字,查看下一个是否阿拉伯数字,直到指针指向字符,将其赋给第一个遇见阿拉伯数字的指针
if(*ptr>='0'&&*ptr<='9'){
            if(*(ptr+flag)>='0'&&*(ptr+flag)<='9'){
                flag++;ptr--;temp--;//遇到阿拉伯数字temp--
            }
4.如果指正不指向阿拉伯数字,指针就指向指针地址加上flag
else
            *ptr=*(ptr+flag);//指针指向地址加flag,
5.当指针指向\0时退出循环
6.将此时指针指向的数改为\0
7.return temp-1

3.代码截图

1233242-20171218213657678-1447381681.png

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 刚开始思路那里第三步当指针指向阿拉伯数字时我就将其赋为ptr+1;这样导致的问题时ptr+1可能也是阿拉伯数字而导致输出如图
    1233242-20171218214612928-492730868.jpg

  • 后来输出字符的数量有问题,我的代码只会把原数组的总字符量减2,也就是出现如下如所示的,明明只有六个字符,却输出9,所以重新定义整形数temp,统计字符个数
    1233242-20171218214833850-1911415484.jpg

6-9 求子串在母串中最后一次出现的地址

1. 本题PTA提交列表

1233242-20171218214943600-1575112741.png

2. 设计思路

1233242-20171223201927396-2046559704.png

3.代码截图

1233242-20171218215654865-521777649.png

4.本题调试过程碰到问题及PTA提交列表情况说明

  • 一开始无论如何都输出 no found! ,是因为很多的小问题使我的flag1永远都不等于0,也就是永远返回0,经过调试改回
    1233242-20171218215915771-342488838.jpg

  • 后来是无法输出字符串,经同学知道知道是我的返回地址写错了,因为我是倒着找字符的,此时指针指向的地址就是我要返回的地址,也就是 return s;就好了。
    1233242-20171218220126100-1104589025.jpg

二、截图本周题目集的PTA最后排名

1233242-20171221154501693-676796006.png

三、阅读代码

检查一个数能不能表示成两个质数之和

#include <stdio.h>
int prime(int n);
int main()
{
    int n, i, flag=0;
    printf("Enter a positive integer: ");
    scanf("%d",&n);
    for(i=2; i<=n/2; ++i)
    {
        if (prime(i)!=0)
        {
            if ( prime(n-i)!=0)
            {
                printf("%d = %d + %d\n", n, i, n-i);
                flag=1;
            }

        }
    }
    if (flag==0)
      printf("%d can't be expressed as sum of two prime numbers.",n);
    return 0;}int prime(int n)      /* Function to check prime number */{
    int i, flag=1;
    for(i=2; i<=n/2; ++i)
       if(n%i==0)
          flag=0;
    return flag;
}

四、本周学习总结

1.自己总结本周学习内容。

2.罗列本周一些错题。

Fun函数用来删除字符串中所有空格, 
如输入:  as df gghk lkj78, 
则输出:  asdfgghklkj78        
#include <stdio.h>
#include <ctype.h>
void Fun(char *str)
{
   int i,j;
   i=j=0;
   while(____2_____)
   {
       if(str[i]!=' ')
           str[j++]=str[i];
       i++;
   }
   str[j]=___3____;
 }

int main()
{
  char str[81];
  int n;
  gets(str); 
  puts(str);
  _____1______;
  printf("*** str: %s\n",str);

}
参考答案
 Fun(str)
str[i]
'\0'
我的作答
fun(str)
str[i]!='\n'
'\0'
编写函数目的:a数组中存放n个由大到小的有序数, 
功能是把x插入a中,a数列中数仍然有序
#include <conio.h>
#include <stdio.h>
#define  M  50
void  Fun ( int a[ ], int x, int *n )
{
   int i,j;
   for(i=0;i<*n;i++)
      if(x>a[i])
         _____2______
   for(j=*n;___3____;j--)
      a[j]=a[j-1];
   a[i]=x;
   ______4____;
}

void main( )
{
   int  a[M]={20,15,13,10,9,6,5}, x, n=7, k;
   scanf("%d", &x );
   _______1_____;
   for( k = 0; k < n; k++ )
      printf ("%d ",a[k] );
}
参考答案
 Fun(a,x,&n);
break;
j>i
*n=*n+1;
我的作答
fun(a[M],x,n)
a[i]=x;
j>=0

转载于:https://www.cnblogs.com/yiyeluo0701/p/8053538.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值