程序设计基础作业05-指针练习

实验环境

IDE: Microsoft Visual Studio Code October 2022 (version 1.71.3)

编译器:MingW-W64-builds 10.0.0 & GCC 12.1.0

操作系统:Windows 11 专业版22H2 22623.891 Beta Preview(64-bit)

额外函数库

#ifndef jny_h
#define jny_h
#include<stdlib.h>
#include<iostream>
#include<time.h>
#include<assert.h>
#include<cstring>
#include<string>
namespace jny{

/*----------------------------------------------------------
 *
 * 数字类处理函数
 *
 *---------------------------------------------------------*/

/**
 * @brief 生成一个在[m,n)区间范围内的随机整数,m不输入时默认为0
 * 
 * @param n 
 * @return int 
 */
int ranInt(int n){
    return rand()%n;
}
/**
 * @brief 生成一个在[m,n)区间范围内的随机整数,m不输入时默认为0
 * 
 * @param m 
 * @param n 
 * @return int 
 */
int ranInt(int m,int n){
    return rand()%(n-m)+m;
}



/*----------------------------------------------------------
 *
 * 字符类处理函数
 *
 *---------------------------------------------------------*/

/**
 * @brief 如果参数为大写字母,则返回对应的小写字母,否则返回原字符
 * 
 * @param c 
 * @return char 
 */
char charDisCaps(char c){
    return c>='A'&&c<='Z' ? c+32 : c;
}

/**
 * @brief 给正数自动补上正号
 * 
 * @param n 
 * @return std::string 
 */
std::string addPlus(int n){
    std::string str=std::__cxx11::to_string(n);
    std::string result=n>0 ? "+"+str : str;
    return result;
}

/*----------------------------------------------------------
 *
 * 2022111899_5_1.cpp中的函数
 *
 *---------------------------------------------------------*/

/**
 * @brief 根据ASCII编码依次比较str1和str2的每一个字符,直到出现不同的字符,或者到达字符串末尾(遇见\0)
 * 
 * @param str1 
 * @param str2 
 * @return int
 * @retval 0 or 1 or -1
 */
int myStrcmp(const char* str1,const char* str2){
    int i=0;
    while(str1[i]!='\0'&&str2[i]!='\0'){
        if(str1[i]>str2[i]){
            return 1;                       //str1>str2
        }
        else if(str1[i]<str2[i]){
            return -1;                      //str1<str2
        }
        i++;                                //str1[i]==str2[i]
    }
    if(str1[i]=='\0'&&str2[i]=='\0'){
        return 0;                           //str1==str2
    }else if(str1[i]=='\0'){
        return -1;                          //str1<str2
    }else{
        return 1;                           //str1>str2
    }
}

}
#endif

题目一

编写函数比较两个字符串的大小,在主程序中调用。

int myStrcmp(const char* stri1const char* str2);

myStrcmp()会根据ASCII编码依次比较str1和str2的每一个字符,直到出现不同的字符,或者到达字符串末尾(遇见\0)。

返回值:

如果返回值<0,则表示str1小于str2。

如果返回值>0,则表示str2小于str1。

如果返回值=0,则表示str1等于str2。

问题分析与算法设计

第一次比较:while循环遍历直到有一个字符串结束,如果发现任何一位字符出现不同则完成比较退出循环返回结果,否则进入第二次比较;

第二次比较:判断两个字符串是否长度相等,如果相等则返回0,否则更长的字符串更大,返回对应结果;

代码

#include <iostream>
using namespace std;
int myStrcmp(const char* str1,const char* str2);

/**
 * @brief 根据ASCII编码依次比较str1和str2的每一个字符,直到出现不同的字符,或者到达字符串末尾(遇见\0)
 * 
 * @param str1 
 * @param str2 
 * @return int
 * @retval 0 or 1 or -1
 */
int myStrcmp(const char* str1,const char* str2){
    int i=0;
    while(str1[i]!='\0'&&str2[i]!='\0'){
        if(str1[i]>str2[i]){
            return 1;                       //str1>str2
        }
        else if(str1[i]<str2[i]){
            return -1;                      //str1<str2
        }
        i++;                                //str1[i]==str2[i]
    }
    if(str1[i]=='\0'&&str2[i]=='\0'){
        return 0;                           //str1==str2
    }else if(str1[i]=='\0'){
        return -1;                          //str1<str2
    }else{
        return 1;                           //str1>str2
    }
}

int main(){
    char str1[51]={0};
    char str2[51]={0};
    int i = 1;
    do{
        cout<<"******第"<<i<<"次输入******"<<endl;
        cin.getline(str1,50);
        cin.getline(str2,50);
        i++;
    }while(myStrcmp(str1,str2));
    return 0;
}

实验小结

程序中以’\0’的出现来作为字符串结束的标志

题目二

编写如下的函数,在主程序中调用该函数。

char* mergeString(const char* str1,const char* str2);

该函数根据两个字符串 str1, str2 的内容生成一个新的字符串, 函数返回指向新字符串的指针。从动态内存中申请内存空间,用于存储新字符串。函数首先将str1,str2中的每个字符均转换成小写字符按照对应位置进行比较,选用ASCII码较大的字符(转换为小写)生成新字符串,例如,如果 str1为“STAND”,str2为“Welcome you!”, 则新字符串为“wtlnome you!”。 再例如, “strings”与“Stand”运算后的结果为 “strnngs”

问题分析与算法设计

-通过比较获取两个字符串中较长的长度来作为新字符串的长度

-封装了一个函数char charDisCaps(char c); 该函数用于将大写字母转换为小写字母

-通过for循环遍历嵌套if条件判断来产生新字符串

代码

#include <iostream>
#include "jny.h"
#include <cstring>
using namespace std;

char* mergeString(const char* str1,const char* str2);

/**
 * @brief 该函数根据两个字符串 str1, str2 的内容生成一个新的字符串, 
 * 函数返回指向新字符串的指针。从动态内存中申请内存空间,用于存储新字符串。
 * 函数首先将str1,str2中的每个字符均转换成小写字符按照对应位置进行比较,
 * 选用ASCII码较大的字符(转换为小写)生成新字符串,例如,如果 str1为“STAND”,str2为“Welcome you!”, 
 * 则新字符串为“wtlnome you!”。 再例如, “strings”与“Stand”运算后的结果为 “strnngs”
 * 
 * @param str1 
 * @param str2 
 * @return char* 
 * @retval 合并后的字符串  
 * @note char charDisCaps(char c); 该函数用于将大写字母转换为小写字母
 */
char* mergeString(const char* str1,const char* str2){
    char* str;                                                          //定义一个指针,指向合并后的字符串
    int len=strlen(str1)>strlen(str2) ? strlen(str1) : strlen(str2);    //获取两个字符串中较长的长度
    str=new char[len+1];                                                  
    memset(str,0,sizeof(str));
    for(int i=0;i<len;i++){
        if(jny::charDisCaps(str1[i])>jny::charDisCaps(str2[i])){
            str[i]=jny::charDisCaps(str1[i]);
        }
        else{
            str[i]=jny::charDisCaps(str2[i]);
        }
    }
    str[len]='\0';                                                      //在字符串末尾添加'\0'
    return str;
}



int main(){
    char str1[51] = {0};
    char str2[51] = {0};
    char *pts=NULL;
    cout<<"please input 2 different strings "<<endl;
    do{
        cin.getline(str1,50);
        cin.getline(str2,50);
    }while (!jny::myStrcmp(str1,str2));
    pts=mergeString(str1,str2);
    cout<<"the new string is:"<<pts<<endl;
    if(jny::myStrcmp(str1,pts)<0&&jny::myStrcmp(str2,pts)<0) {
        cout<<"The New String:"<<pts<<">"<<str1<<endl;
        cout<<"The New String:"<<pts<<">"<<str2<<endl;
    }else
        cout << "Something is wrong…"<<endl;
    delete [] pts;
    return 0;
}

实验小结

在新字符串生成后需要在末尾补上’\0’来标记字符串结束,否则在输出时不会认为这是一个字符串,会出现越界错误

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇