实验环境
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* stri1,const 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’来标记字符串结束,否则在输出时不会认为这是一个字符串,会出现越界错误