C++谭浩强指针刷题记录(1-7)

题目1.

1.输入三个整数,按由小到大的顺序输出

注意指针输出数据要加*,就是输出的时候没有加*把地址输出了一堆乱码

题目2.

输入三个字符串,按由小到大的顺序输出

复习了strcmp和strcpy的用法

出现了一个问题:我定义了一个函数sort(char **p1,int m) 定义一个数组a[3][100] 一个指向数组的指针*p[3] 当我第一次调用sort的时候输入sort(p[3],3)报错,报错原因是候选函数不可行:第一个参数没有从“char*”到“char**”的已知转换 应当这样调用:sort(p,3)

因为我调用的是这个指向指针的指针 不是该指针所指向的指针(即数组)

题目3.

输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换,写3个函数,1⃣️输入10个数2⃣️进行处理3⃣️输出10个数

下图是我写的实现处理的代码,没有实现交换的目的

输入

7 2 1 90 87 27 36 71 12 23

输出

12 2 1 90 87 27 36 71 7 -225771319 (lldb)

为什么?

void huan(int *p1,int a[],int m)
{
    p1=a;
    int min1,max1;
    for(int i=0;i<m-1;i++)
    { for(int j=1;j<m;j++)
        {
            if(*(p1+j)<*(p1+i))
            {
               
                min1=j;
                max1=i;
            }
            else
            {
                min1=i;
                max1=j;
            }
                
        }
        
    }
    int t;
    t=*(p1+min1);
    *(p1+min1)=*p1;
    *p1=t;
    t=*(p1+max1);
    *(p1+max1)=*(p1+10);
    *(p1+10)=t;
    
    
}

查错运用了在纸上写出每步循环结果的方法 发现循环到最后记录的是最后两个输入的数据的大/小.

还有一个致命的问题,也是一串负数的来源:p1+10,应该是p1+9,a[10]最后一个数据应为a[9],天啊噜好粗心

这是改正之后的代码:

void huan(int *a,int n)
{
    int min=*a,max=*a,max1,min1,temp,i;
    for(i=0;i<n;i++)
    {
        if(min>*(a+i))
        {min=*(a+i);min1=i;}
        if(max<*(a+i))
        {max=*(a+i);max1=i;}
    }
    if(min!=*a)
    {
    temp=*(a+min1);
        *(a+min1)=*a;
        *a=temp;
    }
    if(max!=*(a+9))
    {
        temp=*(a+max1);
        *(a+max1)=*(a+9);
        *(a+9)=temp;
    }

其实找最大/最小数不是排序问题,根本用不到两次循环,一次就足够

4.有n个整数,使前面各数顺序后移m个位置,最后m个数变成最前面m个数,写一函数实现以上功能,在主函数中输入n个整数,并输出调整后的n个数

思路一:直接新开一个数组 计算好哪个数最后会移到哪位 将数移动到新开数组中的对应位数直接输出

    这是我写出的代码,但是有错误

输入:1 2 3 4 5 6 7 8 9 10

3

输出:89101234560

void chang(int*p1,int*p2,int m,int n)//m为数字个数,n为后退位数
{
  
    for(int i=0;i<m;i++)//需要移动的数字个数
    {
        if((n+i)<(m-1))//应改为<=并且去掉else的条件
        {
            *(p2+i+n)=*p1;
        }
        if((n+i)>(m-1))
        {
            *(p2+i+n-m)=*p1;
        }
        else
        {   *p2=*p1;}/*出错原因:当计算到7时,6+3=9,满足else条件,直接等于a[0],其实是不对的,7应该位于a[9]位,在考虑运算条件时没有考虑周全,写else条件想表达的意思是如果移动位数等于数字个数的话,可以直接不用计算,数据挨个平移到b数组,若想实现这个条件,应该写为*(p2+i)=*p1;*/
        p1++;
    }
    
}

7去哪里了?(出错原因在代码中注释)

思路二:每次循环都记录最后一个数字,其余数字从倒数第二个开始各退一位

void chang(int*p1,int m,int n)//m为数字个数,n为后退位数
{
    int last;
    for(int i=0;i<n;i++)
    {
        
        last=*(p1+m-1);
        for(int k=0;k<m-1;k++)
        {
            *(p1+m-1-k)=*(p1+m-2-k);
        }
        *p1=last;
    }
    
}

5.有n个人围成一圈,顺序排号,从第一个人开始报数(从1-3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号

(1).需要两个计数器,计数器一计数是第几个人,计数器二计数报数

(2).注意计数器的清零

这是我写的错误函数,能计算2-6个人的正确数值,但是7以上就错误

为什么?

int chang(int*p1,int m)
{
    int j=0,k=0;//j计数人数,k计数报数
    while(1)
    {
      
        for(int i=0;i<m;i++)
        {
            
            if(*(p1+i)==0)
            {
            continue;
            }
            if(*(p1+i)!=0)
            {
                j=*(p1+i);
                k++;
            }


        if(k==3)
        {
            *(p1+i)=0;
            k=0;
        }
    
            
        }
        if(k==1)
        break;
     
    }
    
        return j;

}

因为忽略了最后剩下n个人,n人最后一人报数为1,达到while循环退出条件的情况

最终新增了一个记录退出人数的计数器,结果正确

int chang(int*p1,int m)
{
    int j=0,k=0,w=0;//j计数人数,k计数报数,w记录退出人数
    while(1)
    {
      
        for(int i=0;i<m;i++)
        {
            if(*(p1+i)==0)
            {
                w++;
            }
            if(*(p1+i)!=0)
            {
                j=*(p1+i);
                k++;
                
            }


        if(k==3)
        {
            *(p1+i)=0;
            k=0;
        }
    
            
        }
        
        if(w==(m-1))
        break;
        w=0;
     
    }
    
        return j;

}

磨了半小时,不容易

6.写一函数,求一字符串的长度,在main函数里输入字符串,并输出其长度

int changgg(char*p1)
{
    int k=0;
    for(int i=0;;i++)
    {
    if(*(p1+i)=='\0')
    {break;}
    
        k++;
    }
    return k;

}

没什么好说的,注意输入前给数组清空,和最后的判断条件,空字符为'\0'

7.有一字符串,包含n个字符,写一函数,将此字符串中从第m个字符开始的全局字符复制成为另一个字符串

先在主函数里定义两个全为空字符的数组,用两个指针分别指向它们

void changgg(char*p1,char*p2,int m)
{
    int k=0;
    for(int i=0;;i++)
    {
    if(*(p1+i)=='\0')
    {break;}
    
        k++;
    }
    for(int e=0;e<k-m;e++)
    {
        *(p2+e)=*(p1+m+e);
    }
    

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]: 这段代码是一个C++程序,用于输出一系列图案。它使用了嵌套的for循环来控制输出的行数和每行的星号数量。首先,外层的for循环控制了输出的行数,循环变量i从0开始,每次循环增加1,直到i小于4为止。然后,在每一行中,内层的for循环控制了输出的星号数量,循环变量j从0开始,每次循环增加1,直到j小于2*i+1为止。在每次内层循环中,使用cout语句输出一个星号,并在每行结束后输出一个换行符。接着,又使用了一个类似的循环结构来输出倒序的图案。最后,main函数返回0,表示程序正常结束。\[1\] 引用\[2\]: 这段代码是一个C++程序,演示了类的继承的概念。它定义了一个基类Shape和一个派生类Rectangle。基类Shape有两个成员变量width和height,以及两个成员函数setWidth和setHeight用于设置宽度和高度。派生类Rectangle继承了基类Shape,并添加了一个成员函数getArea用于计算矩形的面积。在main函数中,创建了一个Rectangle对象Rect,并使用setWidth和setHeight函数设置了宽度和高度。然后,使用Rect.getArea函数计算并输出了矩形的面积。最后,main函数返回0,表示程序正常结束。\[2\] 引用\[3\]: 这段文字是关于一门C语言程序设计的考试的内容和要求。考试的目的是全面考核学生对于C语言程序设计的学习水平,要求学生掌握C语言的基本结构、基本数据类型、运算符和表达式、程序设计结构、数组及其应用、字符串操作、函数及其应用、结构体、共用体和枚举类型、指针及其应用等内容。考试形式为闭卷笔试,考试时间为120分钟,满分200分。参考教材为《C程序设计(第五版)》。\[3\] 问题: c++谭浩强第三版网课推荐 回答: 对于C++谭浩强第三版的网课推荐,很抱歉,我没有找到相关的引用内容。但是,你可以在各大在线教育平台或者学习网站上搜索C++谭浩强第三版的网课,比如Coursera、Udemy、网易云课堂等,这些平台上通常会有许多优质的C++编程课程供你选择。你可以根据课程的评价、内容介绍和适合的学习方式来选择适合自己的网课。另外,你也可以参考一些学习网站上的教程和资料,比如C++ Primer、cplusplus.com等,它们提供了丰富的C++学习资源,可以帮助你更好地学习和理解C++编程。 #### 引用[.reference_title] - *1* [谭浩强c++第三版3-24](https://blog.csdn.net/weixin_44817229/article/details/104673564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++面向对象程序设计总复习](https://blog.csdn.net/Yalena_/article/details/125297313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [c语言设计程序实现顺序冒泡_专业课C语言程序设计考试大纲](https://blog.csdn.net/weixin_39976382/article/details/110149678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值