C++学习笔记(26)
七 、显示字符串中的字符
从界面上输入一个字符串(C 风格),把字符串中的每个字符显示出来,如果输入的是"abc",要求:
1)正序显示:a b c
2)逆序显示:c b a
求字符串的长度可以利用上一题的成果,也可以直接用 strlen()函数,关注性能的细节。
示例:
#include <iostream>
using namespace std;
// 采用 while 循环,用指针表示法和临时变量计数。
int length(char* str)
{
int len = 0;
char* ptr = str; // 指向字符串的开始。
while (*ptr++) len++;
return len;
}
int main()
{
// 从界面上输入一个字符串(C 风格),把字符串中的每个字符显示出来,正序和逆序。
char str[31];
memset(str, 0, sizeof(str)); // 初始化是个好习惯。
cout << "请输入一个字符串:"; cin >> str;
// 正序显示
//for (int ii = 0; ii < length(str); ii++) // 循环 10000 次。
// cout << str[ii] << " ";
//for (int ii = 0, len=length(str); ii < len; ii++) // 循环 200 次。
// cout << str[ii] << " ";
for (char *pos=str;*pos;pos++) // 循环 100 次。
cout << *pos << " ";
cout << endl;
// 逆序显示
for (int ii = length(str)-1; ii >= 0; ii--) // 循环 200 次。
cout << str[ii] << " ";
cout << endl;
}
八、字符串反转
从界面上输入一个 C 风格的字符串,如果输入的是"abc",反转后"cba"。
要求:
1)反转的结果存放在另一字符串中。
2)原地反转,不借助其它的字符串。
#include <iostream>
using namespace std;
int main()
{
char str[31];
memset(str, 0, sizeof(str)); // 初始化是个好习惯。
cout << "请输入一个字符串:"; cin >> str;
// 1)反转的结果存放在另一字符串中。
char str1[31]; // 反转后的字符串。
memset(str1, 0, sizeof(str1));
int jj = 0; // 反转后的字符串的下标。
for (int ii = strlen(str) - 1; ii >= 0; ii--)
str1[jj++] = str[ii];
cout << "反转后:" << str1 << endl;
// 2)原地反转,不借助其它的字符串。
//str a b c d e f
for (int ii = 0,len= strlen(str) ; ii < len / 2; ii++) // 如何确定循环的边界?用笨方法举例验
证,需要耐心。
{
// 交换数组中两个元素的值。str[ii]、str[len-1-ii]
char tmp = str[ii];
str[ii] = str[len - 1 - ii];
str[len - 1 - ii] = tmp;
}
cout << "反转后:" << str << endl;
// 测试用例 strlen(str) strlen(str)/2 ii
// a 1 1/2=0 不进
入循环
// ab 2 2/2=1 0 执
行一次循环
// abc 3 3/2=1 0 执
行一次循环
// abcd 4 4/2=2 0、1 执
行两次循环
// abcde 5 5/2=2 0、1 执
行两次循环
// abcdef 6 6/2=3 0、1、2
执行三次循环
}
九、二维数组的应用
有两个任务:
1)超女有 3 个小组,每组有 4 名选手,请提供一个界面,输入每个超女的体重,然后,计算出每组
的超女的平均体重和全部超女的平均体重。
2)从界面上输出三个超女的姓名,存放在 C 风格的字符串数组中,然后,分别向她们表白。
示例一:
#include <iostream>
using namespace std;
int main()
{
// 超女有 3 个小组,每组有 4 名选手,请提供一个界面,输入每个超女的体重
// 然后,计算出每组的超女的平均体重和全部超女的平均体重。
double weights[3][4]; // 存放每个超女的体重。
memset(weights, 0, sizeof(weights)); // 初始化数组。
for (int ii = 0; ii < 3; ii++)
{
for (int jj = 0; jj < 4; jj++)
{
cout << "请输入第" << ii + 1 << "组,第" << jj + 1 << "名超女的体重:"; cin >>
weights[ii][jj];
}
}
double total = 0; // 全部超女的体重之和。
for (int ii = 0; ii < 3; ii++)
{
double sum = 0; // 一组内四名超女的体重之和。
for (int jj = 0; jj < 4; jj++)
{
sum = sum + weights[ii][jj]; // 把组内超女的体重累加。
}
cout << "第" << ii + 1 << "组超女的平均体重是:" << sum / 4 << endl;
total = total + sum; // 把全部超女的体重累加。
}
cout << "全总超女的平均体重是:" << total / 12 << endl;
}
示例二:
#include <iostream>
using namespace std;
int main()
{
// 从界面上输出三个超女的姓名,存放在 C 风格的字符串数组中,然后,分别向她们表白。
char name[3][11]; // 存放三个超女的姓名。
memset(name, 0, sizeof(name));
for (int ii = 0; ii < 3; ii++)
{
cout << "请输入第" << ii + 1 << "超女的姓名:"; cin >> name[ii];
}
for (int ii = 0; ii < 3; ii++)
cout << "亲爱的 " << name[ii] << ",我是一只傻傻鸟。\n";
}
十、把整数转换成字符串
从界面上输入一个整数,把它转换为十进制和二进制的 C 风格的字符串。
4358
4358%10=8 把 8 转换成字符
4358/10=435
435
435%10=5 把 5 转换成字符
435/10=43
43
43%10=3 把 3 转换成字符
43/10=4
4
4%10=4 把 4 转换成字符
4/10=0
结束循环
示例:
#include <iostream>
using namespace std;
int main()
{
// 从界面上输入一个整数,把它转换为十进制和二进制的 C 风格的字符串。
int value = 0;
cout << "请输入整数:"; cin >> value;
int radix = 0;
cout << "请选择(2-二进制;10-十进制):"; cin >> radix;
char result[20];
memset(result, 0, sizeof(result)); // 一定要初始化,否则 bug
int ii = 0; // 用于 result 字符串的计数器。
// 把整数转换为字符串。4358
while (value > 0)
{
result[ii++] = value % radix + '0'; // 取余数,并转换成字符。
value = value / radix; // 商。
}
// 把字符串 result 反转。
for (int ii = 0, len = strlen(result); ii < len / 2; ii++) // 如何确定循环的边界?用笨方法举
例验证,需要耐心。
{
// 交换数组中两个元素的值。str[ii]、str[len-1-ii]
char tmp = result[ii];
result[ii] = result[len - 1 - ii];
result[len - 1 - ii] = tmp;
}
cout << "result=" << result << endl;
}