程序设计1-10题
注: 数据来源网学天地,如有侵权,告知删除。 练习程序用!
1. 字符串转整数
问题
答案
#include <iostream>
using namespace std;
int main() {
string str;
int sum=0; // 用于存储转换后的整数
int flag = 1; //默认为正数
int i=0; // 字符串下标
cout<<"请输入一个字符串";
cin>>str;
if(str[0] == '-') {
// 字符串为负数的情况处理!
flag=-1;
i=1;
}
for( ;i<str.length(); i++) {
int temp = str[i] - '0'; // 字符串从高位依次取出数字
sum = sum*10 + temp;
}
// 正负处理
sum = flag*sum;
// 输出
cout<<sum;
return 0;
}
运行结果:
2. 二维数组数据按列存储到一维数组
问题:
答案
#include <iostream>
using namespace std;
int main() {
string strArray[3][3];
string strs[9];
// 数组赋值
cout<<"输入二维数组的数据:"<<endl;
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
cin>>strArray[i][j];
}
}
// 存放到一维
// ij控制二维,k控制一维
int k=0;
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
strs[k++] = strArray[j][i];
}
}
// 输出查看
for(int i=0; i<k; i++) {
cout<<strs[i]<<ends;
}
return 0;
}
运行结果:
3. 统计字符串个数
问题:
答案
#include <iostream>
using namespace std;
// 统计字符个数函数
int getLen(string str);
int main() {
string str;
char dd[100];
cout<<"请输入一个字符:"<<endl;
getline(cin,str);
cout<<str<<endl;
int n = getLen(str);
cout<<n;
return 0;
}
int getLen(string str) {
int sum=0;
for(int i=0; i<str.length(); i++) {
if(str[i] >= 'a' && str[i] <= 'z') {
while(str[i] >= 'a' && str[i] <= 'z' && i<str.length()) {
i++;
}
sum++;
}
}
return sum;
}
运行结果:
4. 统计各年龄段人数
问题:
答案
#include <iostream>
#include <math.h>
using namespace std;
int main() {
// 用于统计年龄段人数
int dd[11] = {0};
int n;
cout<<"请输入n:"<<endl;
cin>>n;
for(int i=0; i<n; i++){
int year = rand()%200; // 随机生成200以内的年龄
int t = year/10;
switch(t) {
case 0:
dd[0]++;
break;
case 1:
dd[1]++;
break;
case 2:
dd[2]++;
break;
case 3:
dd[3]++;
break;
case 4:
dd[4]++;
break;
case 5:
dd[5]++;
break;
case 6:
dd[6]++;
break;
case 7:
dd[7]++;
break;
case 8:
dd[8]++;
break;
case 9:
dd[9]++;
break;
default:
dd[10]++;
}
}
for(int i=0; i<11; i++) {
cout<<"d["<<i<<"]"<<"共"<<dd[i]<<"人"<<endl;
}
return 0;
}
运行结果:
5. 删除重复数据,就保留一个
问题:
答案
#include <iostream>
using namespace std;
// 简单选择排序
void paiXu(int *nums) {
int i=0;
while(nums[i+1]) {
// 第一次循环执行到倒数第二个元素
int min=i; // 默认最小的是i指向的元素
for(int j=i+1; nums[j]; j++) {
if(nums[j]<nums[i]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
i++;
}
}
// 处理相同字符
void chuLi(int *nums) {
// 通过空间换时间
int t[100];
int i=0, j=0; // 从第一个开始比较
t[j] = nums[i++];
while(nums[i+1]) {
if(t[j] != nums[i]) {
// j指向当前元素,所以赋值赋值到下一个位置。
t[++j] = nums[i++];
}
i++;
}
for(int i=0; t[i]; i++) {
cout<<t[i]<<endl;
}
}
int main() {
int nums[10] = {1,5,2,4,2,5,4,3,5};
// 简单选择排序
paiXu(nums);
chuLi(nums);
return 0;
}
运行结果:
6. 字符串移动问题
解析: 这类移动类问题,均可转换为反转函数的函数实现
问题:
答案
- 核心反转函数:
- 注意mid是 (high - low) / 2;(反转只需要执行一般)
- 换算是 low + i 与 high-i-1;
#include <iostream>
#include <cstring>
using namespace std;
// 反转字符串指定部分
void fanZhuan(char str[], int low, int high){
int mid = (high - low) / 2;
for(int i=0; i<mid; i++) {
char el;
el = str[low+i];
str[low+i] = str[high-i-1];
str[high-i-1] = el;
}
}
int main() {
char str[100]="ABCDEFGHIJK";
// 整体反转
fanZhuan(str,0,strlen(str));
// 左反转
fanZhuan(str,0, strlen(str)-3);
// 右侧反转
fanZhuan(str,strlen(str)-3,strlen(str));
cout<<str;
return 0;
}
运行结果:
7. 获取除了最高位后的数
问题:
答案
- 提示
- 要注意获得整数的位数!
假如为6位数, 我们求除了百位的数应该 模除 10的五次方 (因为10的5次方为6位)
#include <iostream>
using namespace std;
// 处理函数
unsigned int fun(unsigned int w) {
// 获取w的最高位, t用于临时处理
int s = 1, t = w;
while(t/10) {
s*=10;
t/=10;
}
// 因为我们要模除去除最高位,所以百位的数,s要为10位
s/=10;
return w%s;
}
int main() {
int w;
cout<<"请输入w的数值:";
cin>>w;
cout<<fun(w);
return 0;
}
运行结果:
8. 二维数组操作左下三角
问题:
答案
using namespace std;
#define N 4
//处理函数(左下三角×n)
void chuLi(int a[][N], int n) {
for(int i=0; i<N; i++) {
for(int j=0; j<=i; j++) {
a[i][j] *= n;
}
}
}
int main() {
int a[N][N] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}
};
chuLi(a, 2);
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
cout<<a[i][j]<<ends;
}
cout<<endl;
}
return 0;
}
运行结果:
9. 数组元素平移
问题:
答案
但凡这种平移的都可以用反转实现
#include <iostream>
using namespace std;
// 反转函数
void fanZhuan(int a[], int low, int high);
int main() {
int a[11] = {1,2,3,4,5,6,7,8,9,10};
int len=0;
while(a[++len] != '\0');// 统计数组长度
// 整体反转
fanZhuan(a, 0,len);
// 左6位反转
fanZhuan(a,0,len-4);
// 右4位反转
fanZhuan(a,len-4,len);
// 输出最后数据
for(int i=0; i<len; i++) {
cout<<a[i]<<ends;
}
return 0;
}
// 反转函数功能实现
void fanZhuan(int a[], int low, int high) {
int mid = (high - low) / 2;
// 对low到high元素进行反转
for(int i=0; i<mid; i++) {
int t = a[low+i];
a[low+i] = a[high-i-1];
a[high-i-1] = t;
}
}
运行结果:
10. 删除字符串中的空格
问题:
答案
本题用两种方式实现:
- 辅助空间: 不是空格就追加到新字符串
- 原本字符串上进行。 用一个统计已经遇到空格的变量, 每次遇到非空格向前移动已有空格数量
#include <iostream>
#include <string>
using namespace std;
// 辅助空间处理函数
string shanKongGe(string str);
// 原始串上进行操作
string shanKongGe2(string str);
int main() {
string str;
cout<<"请输入字符串:";
getline(cin, str);
// 调用处理函数
str = shanKongGe2(str);
cout<<str;
return 0;
}
// 辅助空间实现
string shanKongGe(string str){
string tt = "";
for(int i=0; i<str.length(); i++) {
if(str[i] != ' ') {
tt.append(1,str[i]);
}
}
return tt;
}
// 不借用辅助空间实现
string shanKongGe2(string str) {
int kongSum=0;// 用于记录扫描到空格的数量
int i;
for(i=0; i<str.length(); i++) {
if(str[i]==' ') {
kongSum++;
}else if(kongSum!=0) {
// 如果不是空格,并且空格数量不是0,则向前移动空格数量
str[i-kongSum] = str[i];
}
}
// 将最后一个字符填空格
str[i-1] = ' ';
return str;
}
运行结果: