第一周 基础练习
1、显示Hello World!
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
2、显示唐诗
#include <iostream>
using namespace std;
int main()
{
cout<< "慈母手中线\n"
"游子身上衣\n"
"临行密密缝\n"
"意恐迟迟归\n"
"谁言寸草心\n"
"报得三春晖\n";
return 0;
}
#include <iostream>
using namespace std;
int main()
{
cout<< "慈母手中线\n\
游子身上衣\n\
临行密密缝\n\
意恐迟迟归\n\
谁言寸草心\n\
报得三春晖" << endl;
return 0;
}
3、显示一句话
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cin >> name;
cout << "This program is coded by " + name + "." << endl;
return 0;
}
4、还是一句话,getline(cin,name); 是string类重载的友元函数;cin.getline()是istream类的成员函数
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
getline(cin,name);
cout << "This program is coded by " + name + "." << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
char name[20];
/* 从键盘输入字符时,字符一直在键盘缓冲区中(shell缓冲区),
当在键盘输入'\n'时,键盘缓冲区中的字符才被全部传送到stdin缓冲区中 */
cin >> name;
cout << name << endl;
cin >> name; /* 忽略空白符 缓冲区还剩余一个回车*/
cout << name << endl;
cin.sync(); /* 清空缓冲区 */
/* 可以读取空白符'\n' 以回车作为结束标记并且读取回车符 缓冲区没有剩余*/
cin.getline(name, 15);
cout << name << endl;
cout << getchar() << endl; /* 缓冲区是空的 等待输入 */
return 0;
}
5、计算矩形周长
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << 2 * ( a + b ) << endl;
return 0;
}
6、已知直角边求斜边
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double a, b, c;
cin >> a >> b;
cout << sqrt ( a*a + b*b ) << endl;
return 0;
}
第一周 中级练习
1、计算公式的值(对数),以m为底的n的对数 log(n) / log(m)
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x, a;
cin >> x >> a;
cout << log(x+sqrt(x*x+1)) / log(a) << endl;
return 0;
}
2、e的近似值
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double n;
cin >> n;
cout << pow(1+1/n, n) << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int n, t;
double y = 1.0;
cin >> n;
t = n;
while(t--)
{
y *= (1+1.0/n);
}
cout << y << endl;
return 0;
}
3、计算公式的值(三角等)
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x;
cin >> x;
cout << sin(x) - log(x) + sqrt(x) - 5 << endl;
return 0;
}
4、计算公式的值(开方)
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x;
cin >> x;
cout << x / sqrt(x*x-3*x+2) << endl;
return 0;
}
第一周 编程作业
1、1-1我爱C++
#include <iostream>
using namespace std;
int main()
{
cout << "Hello C++." << endl;
cout << "I like programming." << endl;
return 0;
}
2、1-2来自系统的问候,注意字符数组的长度
#include <iostream>
using namespace std;
int main()
{
char name[256];
cin.getline( name, 35 );
cout << "Hello " << name << "." << endl;
return 0;
}
3、1-3乘法计算器
#include <iostream>
using namespace std;
int main()
{
double a, b;
cin >> a >> b;
cout << a * b << endl;
return 0;
}
4、1-4单位换算
#include <iostream>
using namespace std;
int main()
{
double inch;
const double inch_to_cm = 2.54;
cin >> inch;
cout << inch << "inch=" << inch * inch_to_cm << "cm" << endl;
return 0;
}
5、1-5平方根计算器
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x;
cin >> x;
cout << sqrt(x) << endl;
return 0;
}
第二周 基础练习
1、求过平面上两点的直线的斜率,斜率 ( y1 - y2 ) / ( x1 - x2 )
#include <iostream>
using namespace std;
int main()
{
double x1, y1 , x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
cout << ( y1 - y2 ) / ( x1 - x2 ) << endl;
return 0;
}
2、计算平面上两点之间的距离
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x1, y1 , x2, y2, distance;
cin >> x1 >> y1 >> x2 >> y2;
distance = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
cout << distance << endl;
return 0;
}
3、判断大小写
#include <iostream>
using namespace std;
int main()
{
char ch;
cin >> ch;
if(ch >= 'A' && ch <= 'Z')
cout << 1 << endl;
else
cout << 0 << endl;
return 0;
}
4、判断数字
#include <iostream>
using namespace std;
int main()
{
char ch;
cin >> ch;
if(ch >= '0' && ch <= '9')
cout << 1 << endl;
else
cout << 0 << endl;
return 0;
}
5、判断闰年
#include <iostream>
using namespace std;
int main()
{
int year;
cin >> year;
if(year%4==0&&year%100!=0||year%400==0)
cout << "IsLeapYear" << endl;
else
cout << "NotLeapYear" << endl;
return 0;
}
6、求商和余数
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << a/b << " " << a%b << endl;
return 0;
}
7、计算平均分取整
#include <iostream>
using namespace std;
int main()
{
int x, y, sum = 0, n = 7;
while(n--)
{
cin >> x;
sum += x;
}
y = int( sum/7.0 + 0.5 );
cout << y << endl;
return 0;
}
8、计算点到直线的距离保留两位小数,int( d*100 + 0.5 ) / 100.0
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int A, B, C, x, y;
cin >> A >> B >> C;
cin >> x >> y;
double d = fabs(A*x+B*y+C) / sqrt(A*A+B*B);
cout << int( d*100 + 0.5 ) / 100.0 << endl;
return 0;
}
9、输入字符显示ASCII值,int(ch)
#include <iostream>
using namespace std;
int main()
{
char ch;
cin >> ch;
cout << int(ch) << endl;
return 0;
}
10、输入整数显示ASCII字符
#include <iostream>
using namespace std;
int main()
{
int k;
cin >> k;
cout << char(k) << endl;
return 0;
}
11、输入整数显示十六进制
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
cout << hex << n << endl;
return 0;
}
12、输入整数显示十六进制和八进制,int sign = n < 0 ? (n = -n, -1) : 1;
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int sign = n < 0 ? (n = -n, -1) : 1;
if(sign == -1){
cout << n*sign << " -" << hex << n << " -"<< oct << n << endl;
}
else{
cout << n << " " << hex << n << " "<< oct << n << endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int sign = n < 0 ? (n = -n, -1) : 1;
sign == -1 ? cout << n*sign << " -" << hex << n << " -"<< oct << n << endl
: cout << n << " " << hex << n << " "<< oct << n << endl;
return 0;
}
第二周 中级练习
1、加密
#include <iostream>
using namespace std;
int main()
{
char a, b, c, d;
cin >> a >> b >> c >> d;
(a-'a'>10) ? cout << a-'a' : cout << '0' << a-'a';
(b-'a'>10) ? cout << b-'a' : cout << '0' << b-'a';
(c-'a'>10) ? cout << c-'a' : cout << '0' << c-'a';
(d-'a'>10) ? cout << d-'a' : cout << '0' << d-'a';
cout << endl;
return 0;
}
#include <iostream>
using namespace std;
void fun(char a)
{
(a-'a'>10) ? cout << a-'a' : cout << '0' << a-'a';
}
int main()
{
char a, n = 4;
while(n--)
{
cin >> a;
fun(a);
}
cout << endl;
return 0;
}
2、解密
#include <iostream>
using namespace std;
int main()
{
char a[256];
cin >> a;
for(int i=0; i<7; i += 2){
cout << char((a[i]-'0')*10 + a[i+1]-'0' + 'a');
}
cout << endl;
return 0;
}
3、压缩存储,位移
#include <iostream>
using namespace std;
int main()
{
int x = 0, a, b, c, d;
cin >> a >> b >> c >> d;
x = a << 24;
x += b << 16;
x += c <<8;
x += d;
cout << x << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int a, x = 0, n = 4;
while(n--)
{
cin >> a;
x += (a << n*8);
}
cout << x << endl;
return 0;
}
4、石头剪刀布
#include <iostream>
using namespace std;
int main()
{
const char* answer[] = {"不认识", "石头", "剪刀", "布"};
int i;
cin >> i;
(i >= 1 && i <= 3) ? cout << answer[i] : cout << answer[0];
cout << endl;
return 0;
}
5、排排坐分果果,格式要求,末尾无空格
#include <iostream>
using namespace std;
int main()
{
int n = 4, a, k;
cin >> a >> k;
while(n--)
{
( n == 3 ) ? : cout << " ";
(a = (a + k - 1)%10) ? cout << a : cout << "10";
a = (a+1)%10;
}
cout << endl;
return 0;
}
第二周 编程作业
1、温度转换,小数常量默认是double类型
#include <iostream>
using namespace std;
int main()
{
double C, F;
cin >> F;
C = 5.0/9*(F-32);
cout << C << endl;
return 0;
}
2、计算数学函数式的值
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x, y;
cin >> x;
y = sin(x*x)/(1-cos(x));
cout << y << endl;
return 0;
}
3、数据的简单统计,题目要求,平均值的四舍五入整数值
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
int sum = a + b + c;
cout << sum << endl;
cout << sum/3.0 << endl;
int ave = sum/3.0 + 0.5;
cout << ave << endl;
return 0;
}
4、找零钱,格式最后没有空格
#include <iostream>
using namespace std;
int main()
{
int x;
cin >> x;
cout << x/50 << " ";
x %= 50;
cout << x/20 << " ";
x %= 20;
cout << x/10 << " ";
x %= 10;
cout << x/5 << " ";
x %= 5;
cout << x << endl;
return 0;
}
#include <iostream>
using namespace std;
void fun(int x){
int arr[] = {50,20,10,5,1};
for(int i=0; i<4; i++){
cout << x/arr[i] << " ";
x %= arr[i];
}
cout << x << endl;
}
int main()
{
int x;
cin >> x;
fun(x);
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int x;
cin >> x;
int arr[] = {50,20,10,5,1};
for(int i=0; i<5; i++){
if(i) cout << " ";
cout << x/arr[i];
x %= arr[i];
}
return 0;
}
5、小写转大写,判断是否为小写字母
#include <iostream>
using namespace std;
int main()
{
char ch;
cin >> ch;
if(ch >= 'a' && ch <= 'z')
ch -= 32;
cout.put(ch) << endl;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cin >> s;
if(s[0] >= 'a' && s[0] <= 'z')
s[0] -= 32;
cout << s[0] << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
char s[256];
cin >> s;
if(s[0] >= 'a' && s[0] <= 'z')
s[0] -= 32;
cout << s[0] << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
char ch;
cin >> ch;
if(ch >= 'a' && ch <= 'z')
ch -= 32;
cout<< ch << endl;
return 0;
}
第三周 基础练习
1、判断奇偶数
#include <iostream>
using namespace std;
int main()
{
int x;
cin >> x;
if(x%2)
cout << "odd" << endl;
else
cout << "even" << endl;
return 0;
}
2、判断数的类型,int(x)==x,判断是否为整数
#include <iostream>
using namespace std;
int main()
{
double x;
cin >> x;
switch(int(x)==x){ //是否为整数
case 0:
if(x>1e-6)
cout << "positive real" << endl;
else if(x<1e-6)
cout << "negative real" << endl;
else
cout << "zero" << endl;
break;
case 1:
if(int(x)>0)
cout << "positive integer" << endl;
else if(int(x)<0)
cout << "negative integer" << endl;
else
cout << "zero" << endl;
break;
}
return 0;
}
3、判断点的象限
#include <iostream>
using namespace std;
int main()
{
double x, y;
cin >> x >> y;
if(x>1e-6 && y>1e-6)
cout << 1 << endl;
else if(x<1e-6 && y>1e-6)
cout << 2 << endl;
else if(x<1e-6 && y<1e-6)
cout << 3 << endl;
else
cout << 4 << endl;
return 0;
}
4、判断字符类型
#include <iostream>
using namespace std;
int main()
{
char ch;
cin >> ch;
if(ch>='0' && ch<='9')
cout << 0 << endl;
else if(ch>='A' && ch<='Z')
cout << 1 << endl;
else if(ch>='a' && ch<='z')
cout << 2 << endl;
else
cout << -1 << endl;
return 0;
}
5、百分制成绩转五分制成绩
#include <iostream>
using namespace std;
int main()
{
int x;
cin >> x;
switch(x/10){
case 10:
case 9:
cout << 5 << endl;
break;
case 8:
cout << 4 << endl;
break;
case 7:
cout << 3 << endl;
break;
case 6:
cout << 2 <<endl;
break;
case 5:case 4:case 3:case 2:case 1:
cout << 1 << endl;
break;
default:
cout << 0 << endl;
}
return 0;
}
6、显示n个字符
#include <iostream>
using namespace std;
int main()
{
int n;
char ch;
cin >> n >> ch;
while(n--)
cout << ch;
cout << endl;
return 0;
}
7、显示字符组成的矩形
#include <iostream>
using namespace std;
int main()
{
int n, m;
char ch;
cin >> m >> n >> ch;
for(int i=0; i<m; ++i){
for(int j=0; j<n; ++j)
cout << ch;
cout << endl;
}
return 0;
}
8、用循环计算1+2+3+...+n
#include <iostream>
using namespace std;
int main()
{
int n, s = 0;
cin >> n;
for(int i=1; i<=n; ++i){
s += i;
}
cout << s << endl;
return 0;
}
9、计算1+1/2+1/3+...+1/n
#include <iostream>
using namespace std;
int main()
{
int n;
double s = 0;
cin >> n;
for(int i=1; i<=n; ++i){
s += 1.0/i;
}
cout << s << endl;
return 0;
}
10、计算n!,long fac = 1;
#include <iostream>
using namespace std;
int main()
{
int n;
long fac = 1;
cin >> n;
for(int i=1; i<=n; ++i){
fac *= i;
}
cout << fac << endl;
return 0;
}
11、交替输出1和-1
#include <iostream>
using namespace std;
int main()
{
int n, sign = 1, t;
cin >> n;
t = n;
while(n--)
{
if(n<t-1) cout << " ";
cout << sign;
sign = -sign;
}
return 0;
}
12、判断整数的位数,n非负,即可以为0
#include <iostream>
using namespace std;
int main()
{
int n, cnt=0;
cin >> n;
if(!n)
cnt++;
while(n)
{
n /= 10;
cnt++;
}
cout << cnt << endl;
return 0;
}
13、求非负整数的各位数字的和
#include <iostream>
using namespace std;
int main()
{
int n, sum=0;
cin >> n;
while(n)
{
sum += n%10;
n /= 10;
}
cout << sum << endl;
return 0;
}
14、九九乘法表,行尾无空格
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i=1; i<=n; ++i){
for(int j=1; j<=i; ++j){
if(j>1)
cout << " ";
cout << i << "*" << j << "=" << i*j;
}
cout << endl;
}
return 0;
}
15、不一样的九九乘法表
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i=n; i>=1; --i){
for(int j=1; j<=i; ++j){
if(j>1)
cout << " ";
cout << i << "*" << j << "=" << i*j;
}
cout << endl;
}
return 0;
}
16、Fibonacci序列,输出n+1项
#include <iostream>
using namespace std;
int main()
{
int n, f0 = 0, f1 = 1;
cin >> n;
for(int i=0; i<n+1; i++){
if(i)
cout << " ";
cout << f0;
int sum = f0 + f1;
f0 = f1;
f1 = sum;
}
return 0;
}
第三周 中级练习
1、计算1!+2!+3!+…+n!
#include <iostream>
using namespace std;
int main()
{
int n, t = 1, result = 0;
cin >> n;
for(int i=1; i<=n; ++i){
t *= i;
result += t;
}
cout << result << endl;
return 0;
}
2、a+aa+aaa
#include <iostream>
using namespace std;
int main()
{
int a, n, t = 0, result = 0;
cin >> a >> n;
for(int i=0; i<n; ++i){
t = t*10 + a; //保存中间结果
result += t;
}
cout << result << endl;
return 0;
}
3、arcsin(x)
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x;
cin >> x;
int n = 0; //第0项
double u = x, arcsin = 0;
while(fabs(u)>=1e-8){
arcsin += u; //累加
n++; //从第一项开始计算u
u = u*(2*n-1)*(2*n-1)*x*x/2/n/(2*n+1);
}
cout << arcsin << endl;
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x;
cin >> x;
cout << asin(x) << endl;
return 0;
}
4、回文数
#include <iostream>
using namespace std;
int main()
{
int n, t, sum = 0;
cin >> n;
t = n;
while(t)
{
sum = sum*10 + t%10;
t /= 10;
}
if(sum==n)
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char str[256], *p, *q;
cin >> str;
p = str, q = str + strlen(str)-1;
while(*p==*q && p<q){
p++,q--;
}
if(p>=q)
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char str[256], i, j;
cin >> str;
for(i=0, j=strlen(str)-1; str[i] == str[j] && i<j; ++i, --j);
if(i>=j)
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}
5、整数的素数因子分解
#include <iostream>
using namespace std;
int main()
{
int i=2, n;
cin >> n;
cout << n << "=";
while(n>1)
{
if(n%i==0){
cout << i;
n /= i;
if(n>1)
cout << "*"; /* */
}
else{
i++;
}
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
cout << n << "=";
for(int i=2; n>1; ++i)
{
if(n%i==0){
cout << i;
n /= i;
--i;
if(n>1)
cout << "*";
}
}
return 0;
}
第三周 编程作业
1、3-1打印3个相邻字母
#include <iostream>
using namespace std;
int main()
{
char ch,ch1 = 'A';
cin >> ch;
if(ch>='a' && ch<='z')
ch1 = 'a';
cout << char((ch-ch1-1+26)%26+ch1) << ch << char((ch-ch1+1)%26+ch1) << endl;
return 0;
}
2、3-2歌唱大赛选手成绩计算
#include <iostream>
using namespace std;
int main()
{
int score, min = 100, max = 0, sum = 0;
int n = 10;
while(n--)
{
cin >> score;
if(score<0 || score>100){
cout << "the score is invalid." << endl;
break;
}
if(score>max)
max = score;
if(score<min)
min = score;
sum += score;
}
if(n==-1)
cout << (sum - max - min)/8.0 << endl;
return 0;
}
3、3-3猴子吃桃
#include <iostream>
using namespace std;
int main()
{
int days,x=1;
cin >> days;
while(--days){
x = 2*(x+1);
}
cout << x << endl;
return 0;
}
4、3-4搬砖问题
#include <iostream>
using namespace std;
int main()
{
int n, flag = 0;
cin >> n;
for(int men=0; men<=n/4; ++men)
{
for(int women=0; women<=(n-men)/3; ++women)
{
int children = n - men - women;
//if(men*4*2+women*3*2+children==2*n){
if(children%2==0 && men*4+women*3+children/2==n){
cout << "men" << men << endl;
cout << "women" << women << endl;
cout << "children" << children << endl;
flag = 1;
}
}
}
if(!flag)
cout << "no result!" << endl;
return 0;
}
5、3-5美分找钱
#include <iostream>
using namespace std;
int arr[] = {25, 10, 5};
int func(int left, int index)
{
if(left==0 || index>=3)
return 1;
int count = 0;
int x = left/arr[index];
for (int i=x; i>=0; i--)
{
count += func(left - i*arr[index], index+1);
}
return count;
}
int main()
{
unsigned int n, count = 0;
cin >> n;
if (n<0||n>99)
cout << "the money is invalid!" << endl;
else
cout << func(n, 0) << endl;
return 0;
}
#include <iostream>
using namespace std;
int MakeChangeCore(int n,int denom)
{
int next_denom=0;
switch(denom)
{
case 25:
next_denom=10;
break;
case 10:
next_denom=5;
break;
case 5:
next_denom=1;
break;
case 1:
return 1;
}
int res=0;
for(int i=0;i*denom<=n;i++)
res+=MakeChangeCore(n-i*denom,next_denom);
return res;
}
int MakeChange(int n)
{
if(n<=0)
return -1;
return MakeChangeCore(n,25);
}
int main()
{
unsigned int n, count = 0;
cin >> n;
if (n<0||n>99)
cout << "the money is invalid!" << endl;
else
cout << MakeChange(n) << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
unsigned int n, count = 0;
cin >> n;
if (n<0||n>99)
cout << "the money is invalid!" << endl;
else{
for (int a=n/25; a>=0; a--) //25美元
{
int ten = n-25*a; //10美元
for (int b=ten/10; b>=0; b--)
{
int five = ten - 10*b; //5美元
for (int c=five/5; c>=0; c--)
{ //(n-25*a-10*b-5*c) 1美元
/* if (25*a+10*b+5*c+(n-25*a-10*b-5*c) == n)
{
count++;
} */
count++;
}
}
}
cout << count << endl;
}
return 0;
}
第4周 基础练习
1、数组元素反序输出
#include <iostream>
using namespace std;
int main( )
{
int n;
cin >> n;
int *arr = new int[n];
for(int i=0; i<n; ++i)
cin >> arr[i];
cout << arr[n-1];
for(int j=n-2; j>=0; --j)
cout << " " << arr[j];
return 0;
}
2、求数组元素最大值
#include <iostream>
#include <climits>
using namespace std;
int main( )
{
int arr[100], index = 0; //其实数组无实质意义
int max = INT_MIN;
int x;
for(; cin >> x, x != -9999; )
{
arr[index++] = x;
if(arr[index-1] > max )
max = arr[index-1];
}
cout << max << endl;
return 0;
}
#include <iostream>
#include <climits>
using namespace std;
int main( )
{
int max = INT_MIN;
int x;
for(; cin >> x, x != -9999; )
{
if(x > max )
max = x;
}
cout << max << endl;
return 0;
}
3、数组指定区间的元素的最大、最小、总和和平均值,总和及平均值均为double,总和若为整形,求平均值要强转
#include <iostream>
#include <climits>
using namespace std;
int main( )
{
int arr[] = {-1,15,-40,-180,99,-122,-124,27,192,128,
-165,95,161,-138, -183,51,107,39,-184,113,
-63,9,107,188,-11,-13,151,-52,7,6};
int i, j, max = INT_MIN, min = INT_MAX;
double sum = 0, ave = 0;
cin >> i >> j;
if(i<j && i>=0 && j<=30)
{
for(int k = i; k<j; ++k)
{
sum += arr[k];
if(arr[k] > max) max = arr[k] ;
if(arr[k] < min) min = arr[k];
}
cout << max << " " << min << " " << sum << " " << sum/(j-i) << endl;
}
else cout << "0 0 0 0" << endl;
return 0;
}
#include <iostream>
using namespace std;
int main( )
{
int arr[] = {-1,15,-40,-180,99,-122,-124,27,192,128,
-165,95,161,-138, -183,51,107,39,-184,113,
-63,9,107,188,-11,-13,151,-52,7,6};
int i, j, max, min;
double sum = 0, ave = 0;
cin >> i >> j;
if(i<j && i>=0 && j<=30) // i,j条件
{
max = arr[i], min = arr[i]; //赋初始值
for(int k = i; k<j; ++k) //从i开始累加
{
sum += arr[k];
if(arr[k] > max) max = arr[k] ;
if(arr[k] < min) min = arr[k];
}
cout << max << " " << min << " " << sum << " " << sum/(j-i) << endl;
}
else cout << "0 0 0 0" << endl;
return 0;
}
4、求矩阵每行元素最大值
#include <iostream>
using namespace std;
int main( )
{
//int arr[20][20]; //省略
int row, col, x;
cin >> row >> col;
for( int i= 0; i<row; i++){
cin >> x;
int max = x;
for(int j=1; j<col; ++j)
{
cin >> x;
if(x>max) max = x;
}
cout << max << endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main( )
{
int arr[20][20];
int row, col;
cin >> row >> col;
for( int i= 0; i<row; i++){
cin >> arr[i][0];
int max = arr[i][0];
for(int j=1; j<col; ++j)
{
cin >> arr[i][j];
if(arr[i][j]>max) max = arr[i][j];
}
cout << max << endl;
}
return 0;
}
5、求矩阵每列元素最大值,int max = arr[0][i];
#include <iostream>
using namespace std;
int main( )
{
int arr[20][20];
int row, col, i, j;
cin >> row >> col;
for( i= 0; i<row; i++){
for( j=0; j<col; ++j)
{
cin >> arr[i][j];
}
}
for( i= 0; i<col; i++){
int max = arr[0][i];
for(j=1; j<row; ++j)
{
if(max<arr[j][i])
max = arr[j][i];
}
if(i) cout << " ";
cout << max;
}
return 0;
}
6、计算向量的和
#include <iostream>
using namespace std;
int main( )
{
int n;
int arr1[100],arr2[100];
cin >> n;
for(int i=0; i<n; ++i)
cin >> arr1[i];
for(int i=0; i<n; ++i)
cin >> arr2[i];
for(int i=0; i<n; ++i){
if(i) cout << " ";
cout << arr1[i] + arr2[i];
}
return 0;
}
7、矩阵向量的内积
#include <iostream>
using namespace std;
int main( )
{
int n, sum = 0;
int arr1[100],arr2[100];
cin >> n;
for(int i=0; i<n; ++i)
cin >> arr1[i];
for(int i=0; i<n; ++i)
cin >> arr2[i];
for(int i=0; i<n; ++i){
sum += arr1[i] * arr2[i];
}
cout << sum << endl;
return 0;
}
8、计算向量的范数
#include <iostream>
#include <cmath>
using namespace std;
int main( )
{
int n;
double arr[100],sum = 0;
cin >> n;
for(int i=0; i<n; ++i){
cin >> arr[i];
sum += arr[i]*arr[i];
}
cout << sqrt(sum) << endl;
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
int main( )
{
int n;
double x, sum = 0;
cin >> n;
for(int i=0; i<n; ++i){
cin >> x;
sum += x * x;
}
cout << sqrt(sum) << endl;
return 0;
}
9、计算向量的欧氏距离,double类型
#include <iostream>
#include <cmath>
using namespace std;
int main( )
{
int n;
double sum = 0;
double arr1[100],arr2[100];
cin >> n;
for(int i=0; i<n; ++i)
cin >> arr1[i];
for(int i=0; i<n; ++i)
cin >> arr2[i];
for(int i=0; i<n; ++i){
sum += (arr1[i] - arr2[i]) * (arr1[i] - arr2[i]);
}
cout << sqrt(sum) << endl;
return 0;
}
10、矩阵求和
#include <iostream>
#include <cmath>
using namespace std;
int main( )
{
int n, m;
double arr1[100][100],arr2[100][100],sum[100][100];
cin >> n >> m;
for(int i=0; i<n; ++i)
{
for(int j=0; j<m; ++j)
cin >> arr1[i][j];
}
for(int i=0; i<n; ++i)
{
for(int j=0; j<m; ++j)
cin >> arr2[i][j];
}
for(int i=0; i<n; ++i)
{
for(int j=0; j<m; ++j){
sum[i][j] = arr1[i][j] + arr2[i][j];
if(j) cout << " ";
cout << sum[i][j];
}
cout << endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main( )
{
int n, m;
double arr1[100][100], arr2[100][100];
cin >> n >> m;
for(int i=0; i<n; ++i)
{
for(int j=0; j<m; ++j)
cin >> arr1[i][j];
}
for(int i=0; i<n; ++i)
{
for(int j=0; j<m; ++j)
cin >> arr2[i][j];
}
for(int i=0; i<n; ++i)
{
for(int j=0; j<m; ++j){
if(j) cout << " ";
cout << arr1[i][j] + arr2[i][j];
}
cout << endl;
}
return 0;
}
11、输入字符串,求长度
#include <iostream>
using namespace std;
int main( )
{
char str[100];
cin.getline(str,100);
char *p = str;
int cnt = 0;
while(*p)
{
cnt++;
p++;
}
cout << cnt << endl;
return 0;
}
12、统计字符串中大写字母的数量
#include <iostream>
using namespace std;
int main( )
{
char str[100];
cin.getline(str,100);
char *p = str;
int cnt = 0;
while(*p)
{
if(*p>='A' && *p<='Z')
cnt++;
p++;
}
cout << cnt << endl;
return 0;
}
13、复制字符串
#include <iostream>
using namespace std;
int main( )
{
char s1[100], s2[100];
cin >> s1;
char* p1 = s1, *p2 = s2;
while( *p2++ = *p1++ );
cout << s2 << endl;
return 0;
}
14、字符串逆序
#include <iostream>
using namespace std;
int main( )
{
char s[100];
cin >> s;
int index = 0, i,j;
while(s[index++]);
for(i=0, j = index - 2; i<j; ++i,--j)
{
char t = s[i];
s[i] = s[j];
s[j] = t;
}
cout << s << endl;
return 0;
}
15、定义表示平面坐标点的结构体计算两点距离
#include <iostream>
#include <cmath>
using namespace std;
struct POINT{
double x, y;
};
int main( )
{
POINT p1, p2;
cin >> p1.x >> p1.y >> p2.x >> p2.y;
cout << sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)) << endl;
return 0;
}
第4周 中级练习
1、矩阵原地转置,for(j=0; j<i; ++j)
#include <iostream>
using namespace std;
int main( )
{
int arr[10][10], i, j;
int n;
cin >> n;
for(i=0; i<n; ++i){
for(int j=0; j<n; ++j){
cin >> arr[i][j];
}
}
//转置
for(i=0; i<n; ++i){
for(j=0; j<i; ++j){
if(i!=j){
int t = arr[i][j];
arr[i][j] = arr[j][i];
arr[j][i] = t;
}
}
}
for(i=0; i<n; ++i){
for( j=0; j<n; ++j){
if(j) cout << " ";
cout << arr[i][j];
}
cout << endl;
}
return 0;
}
2、判断对称矩阵,flag = 1;
#include <iostream>
using namespace std;
int main( )
{
int arr[10][10], i, j;
int n, flag = 0;
cin >> n;
for(i=0; i<n; ++i){
for(j=0; j<n; ++j){
cin >> arr[i][j];
}
}
//判断对称
for(i=0; i<n; ++i){
for(j=0; j<i; ++j){
if(arr[i][j] != arr[j][i]){
flag = 1;
break;
}
}
}
if(flag)
cout << "No" << endl;
else
cout << "Yes" << endl;
return 0;
}
3、去掉字符串末尾的空格
#include <iostream>
using namespace std;
int main( )
{
char str[100];
cin.get(str,100);
cout << "|" << str << "|" << endl;
char *p = str;
while( *p ) p++;
while( *--p == ' ' );
*(p+1) = '\0';
cout << "|" << str << "|" << endl;
return 0;
}
4、去掉字符串开头的空格符
#include <iostream>
using namespace std;
int main( )
{
char str[100];
cin.get(str,100);
cout << "|" << str << "|" << endl;
char *p = str, *q = str;
while( *p == ' ') p++;
while( *q++ = *p++);
cout << "|" << str << "|" << endl;
return 0;
}
5、去掉字符串中间的所有空格,两头的空格保留,从后向前可能会覆盖(计算后头空格个数)
#include <iostream>
using namespace std;
int main( )
{
char str[100];
cin.get(str,100);
cout << "|" << str << "|" << endl;
//保留字符串前空格
char *p = str, *q;
while(*p == ' ') p++;
q = p;
//去掉字符串中间的空格
while( *p )
{
if( *p != ' ' )
*q++ = *p;
p++;
}
//计算字符串后的空格
int cnt = 0;
while(*--p == ' ')
cnt++;
while(cnt--)
*q++ = ' ';
*q = '\0';
cout << "|" << str << "|" << endl;
return 0;
}
6、查找子串
#include <iostream>
using namespace std;
int main( )
{
char s1[100], s2[100];
char *p, *q;
gets(s1);
gets(s2);
/*cin.getline(s1,100);
cin.getline(s2,100);*/
p = s1, q = s2; /* p,q 源串、目标串比较开始位置 */
int cnt = 1;
while(*p&&*q)
{
if (*p==*q)
{
p++;
q++;
}
else
{
p = s1 + cnt++;
q = s2;
}
}
if (*q=='\0') /* 匹配 */
cout << cnt << endl;
else
cout << "没有该子串" << endl;
return 0;
}
7、排序,插入排序
#include <iostream>
using namespace std;
int main( )
{
int arr[100];
int n, i, j;
cin >> n;
for(i=0; i<n; ++i)
cin >> arr[i];
for (j=1; j<n; j++ ) {
int t = arr[j];
for ( i=j; i>0 && arr[i-1]<t; i-- )
arr[i] = arr[i-1]; /*依次与已排序序列中元素比较并右移*/
arr[i] = t; /* 放进合适的位置 */
}
for(i=0; i<n; ++i){
if(i) cout << " ";
cout << arr[i];
}
return 0;
}
8、二分查找,找到,break;
#include <iostream>
using namespace std;
int main( )
{
int arr[300], index = 0;
int x1, x2;
for(; cin >> x1, x1 != -99999; )
arr[index++] = x1;
cin >> x2;
int left = 0, right = index-1;
while(left<=right)
{
int mid = (right-left)/2 + left; //防溢出
if(arr[mid]>x2)
right = mid - 1;
else if(arr[mid]<x2)
left = mid + 1;
else{
cout << mid << endl;
break;
}
}
if(left>right)
cout << -1 << endl;
return 0;
}
第4周 编程作业
1、恺撒加密
#include <iostream>
using namespace std;
int main( )
{
char str[256];
cin >> str;
char *p = str;
while(*p)
{
char ch = 'a';
char num = -32;
if(*p>='A' && *p<='Z')
ch = 'A', num = 32;
*p = (*p - ch + 3)%26 + ch + num;
p++;
}
cout << str << endl;
return 0;
}
2、矩阵转置
#include <iostream>
using namespace std;
int main( )
{
int n, arr[6][6];
cin >> n;
if(n<1 || n > 5)
cout << "matrix order error" << endl;
else{
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j){
cin >> arr[j][i];
}
}
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j){
if(j) cout << " ";
cout << arr[i][j];
}
cout << endl;
}
}
return 0;
}
3、按点击率显示歌曲
#include <iostream>
using namespace std;
struct SONG{
char title[50];
char name[20];
int point;
};
int main( )
{
SONG songs[5];
int i, j;
for(i=0; i<5; ++i){
cin >> songs[i].title >> songs[i].name >> songs[i].point;
}
/* 插入排序 */
for (j=1; j<5; j++ ) {
SONG t = songs[j]; /* 取出未排序序列中的第一个元素*/
for ( i=j; i>0 && songs[i-1].point<t.point; i-- )
songs[i] = songs[i-1]; /*依次与已排序序列中元素比较并右移*/
songs[i] = t; /* 放进合适的位置 */
}
for(i=0; i<5; ++i){
cout << songs[i].title << " " << songs[i].name << " ";
cout << songs[i].point << endl;
}
return 0;
}
4、星期转换
#include <iostream>
using namespace std;
int main( )
{
const char *weeks[] = {"sunday","monday","tuesday","wednesday","thursday","friday","saturday"};
int n;
cin >> n;
if(n<1||n>7)
cout << "invalid" << endl;
else
cout << weeks[n%7] << endl;
return 0;
}
5、插入加密,明文最后一个字符后也要打印插入字符
#include <iostream>
using namespace std;
int main( )
{
char str[30], letter[6] = "abcde";
int n, index = 0;
cin >> str >> n;
char *p = str;
while(*p){
int t = n;
while(*p && t--){
putchar(*p++);
}
putchar(letter[index++]);
index %= 5;
}
return 0;
}
#include <iostream>
using namespace std;
int main( )
{
char str[30], letter[6] = "abcde";
int n, index = 0;
cin >> str >> n;
char *p = str;
for(int t = n; *p; index %= 5){ //单循环
if(t--)
putchar(*p++);
//间隔后打印插入字符并恢复间隔, 明文最后一个字符后也要打印插入字符
if(!*p || !t){
putchar(letter[index++]);
t = n;
}
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
string s;
string word[5] = {"a","b","c","d","e"};
int step, index = 0;
getline( cin, s );
cin >> step;
for(decltype(s.size())i=step; i<s.size(); i+=(step+1),index%=5){
s.insert(i,word[index++]);
}
s += word[index];
cout << s << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
string s;
string word = "abcde";
int step, n = 1, index = 0; //n插入的字符个数
cin >> s >> step;
for(int i=step; i<s.size(); i+=(n+step),index%=5){
s.insert(i,n,word[index++]);
}
s.insert(s.size(),n,word[index]);//字符串尾部要求插入字符
cout << s << endl;
return 0;
}
6、三色球,枚举,j = i+1;
#include <iostream>
using namespace std;
int main( )
{
enum color {red, yellow, blue};
int tmp, i, j, t;
for(i=red; i<=yellow; ++i){
for(j=i+1; j<=blue; ++j){ //j=i+1
for(t=0; t<2; ++t){ //二种选择或i或j
switch(t){
case 0: tmp = i; break; //对应枚举
case 1: tmp = j; break;
}
switch((enum color)tmp){ //强转枚举
case red: cout << "red "; break;
case yellow: cout << "yellow "; break;
case blue: cout << "blue "; break;
}
}
cout << endl;
}
}
return 0;
}
第5周 基础练习
1、求两个数的和
#include <iostream>
using namespace std;
double mysum(double a, double b){
return a + b;
}
int main()
{
double a, b;
cin >> a >> b;
cout << mysum(a,b) << endl;
return 0;
}
2、求绝对值的函数,double的最高位是符号位,位运算 &0x7fffffff 可以改变最高位的值
#include <iostream>
using namespace std;
double myfabs(double x){
*((int*)&x + 1) &= 0x7fffffff;
return x;
}
int main()
{
double x;
cin >> x;
cout << myfabs(x) << endl;
return 0;
}
3、x的k次方
#include <iostream>
using namespace std;
double myfabs(double x){
*((int*)&x + 1) &= 0x7fffffff;
return x;
}
double mypow(double x, int n){
double ret = 1;
if( myfabs(x) <= 1e-7 )
ret = 0.0;
else if(!n)
ret = 1.0;
else if( n<0 ){
n = -n;
for(int i=0; i<n; ++i)
ret /= x;
}
else if(n>0){
for(int i=0; i<n; ++i)
ret *= x;
}
return ret;
}
int main()
{
double x;
int n;
cin >> x >> n;
cout << mypow(x, n) << endl;
return 0;
}
4、求n!的函数
#include <iostream>
using namespace std;
long fact(int n){
long ret = 1;
for(int i=1; i<=n; ++i)
ret *= i;
return ret;
}
int main()
{
int n;
cin >> n;
cout << fact( n ) << endl;
return 0;
}
5、输入数组元素
#include <iostream>
using namespace std;
int input(int *arr){
int index = 0, x;
for(; cin >> x, x != -9999; )
arr[index++] = x;
return index;
}
int main()
{
int arr[100];
int n = input(arr);
for(int i= n-1; i>=0; --i)
{
if(i != n-1)
cout << " ";
cout << arr[i];
}
return 0;
}
6、输出数组元素值
#include <iostream>
using namespace std;
int input(int *arr){
int index = 0, x;
for(; cin >> x, x != -9999; )
arr[index++] = x;
return index;
}
void output(int *arr, int n){
for(int i= 0; i<n; ++i)
{
if(i)
cout << " ";
cout << arr[i];
}
}
int main()
{
int arr[100];
int n = input(arr);
output(arr, n);
return 0;
}
7、将数组元素逆序
#include <iostream>
using namespace std;
int input(int *arr){
int index = 0, x;
for(; cin >> x, x != -9999; )
arr[index++] = x;
return index;
}
void output(int *arr, int n){
for(int i= 0; i<n; ++i)
{
if(i)
cout << " ";
cout << arr[i];
}
}
void reserve(int *arr, int n){
for(int i=0, j=n-1; i<j; ++i, --j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
int main()
{
int arr[100];
int n = input(arr);
reserve( arr, n);
output(arr, n);
return 0;
}
8、求数组元素的和
#include <iostream>
using namespace std;
int input(int *arr){
int index = 0, x;
for(; cin >> x, x != -9999; )
arr[index++] = x;
return index;
}
int addArr(int *arr, int n){
int sum = 0;
for(int i=0; i<n; ++i)
sum += arr[i];
return sum;
}
int main()
{
int arr[100];
int n = input(arr);
cout << addArr(arr, n) << endl;
return 0;
}
9、求字符串的长度的函数
#include <iostream>
using namespace std;
int stringLength(char *p){
int i = 0;
while(p[i])
i++;
return i;
}
int main()
{
char str[100];
cin >> str;
cout << stringLength(str) << endl;
return 0;
}
10、字符串转大写
#include <iostream>
using namespace std;
void upper(char *p){
while(*p){
if(*p>='a'&&*p<='z')
*p -= 32;
p++;
}
}
int main()
{
char str[200];
cin >> str;
upper(str);
cout << str << endl;
return 0;
}
11、字符串复制函数
#include <iostream>
using namespace std;
void mystrcpy(char s1[],char s2[]);
int main()
{
char s1[100], s2[100];
cin.getline(s1, 100);
mystrcpy(s2,s1);
cout << s2 << endl;
return 0;
}
void mystrcpy(char s1[],char s2[]){
while(*s1++ = *s2++);
}
12、字符串比较函数
#include <iostream>
using namespace std;
int compare(char*, char*);
int main()
{
char s1[200], s2[200];
cin >> s1 >> s2;
cout << compare(s1,s2) << endl;
return 0;
}
int compare(char *s1, char *s2)
{
int i, ret = 0;
while( ! (ret = *( unsigned char *)s1 - *(unsigned char *)s2) && *s2)
s1++, s2++;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return ret;
}
第5周 中级练习
1、比较字符串(不区分大小写),比较不应修改字符串,可以用2个变量对两个字符串的字母取值,转为小写,比较
#include <iostream>
using namespace std;
int compare(const char*, const char*);
int main()
{
char str1[100], str2[100];
cin >> str1 >> str2;
cout << compare(str1,str2) << endl;
return 0;
}
int compare(const char *dst, const char *src)
{
int ch1, ch2, ret = 0;
do
{
if ( ((ch1 = (unsigned char)(*(dst++))) >= 'A') &&(ch1 <= 'Z') )
ch1 += 0x20;
if ( ((ch2 = (unsigned char)(*(src++))) >= 'A') &&(ch2 <= 'Z') )
ch2 += 0x20;
} while ( ch1 && (ch1 == ch2) );
if ( ch1-ch2 < 0)
ret = -1 ;
else if ( ch1-ch2 > 0 )
ret = 1 ;
return ret;
}
2、二分法解方程
#include <iostream>
#include <cmath>
using namespace std;
double fun(double x){
return 2*x*x*x - 4*x*x + 3*x - 6;
}
int main()
{
double left, right, middle, eps;
cin >> left >> right >> eps;
do
{
middle = (left+right)/2;
if(fun(middle)*fun(left)>0)
left = middle;
else
right = middle;
}
while(fabs(fun(middle))>=eps);
cout << middle << endl;
return 0;
}
3、牛顿法解方程,求导,3*a*x*x + 2*b*x + c
#include <iostream>
using namespace std;
double fun(double x){
return x*x*x + 2*x*x + 3*x + 4;//系数a,b,c,d
}
double fun1(double x){
return 3*x*x + 4*x + 3; //3*a*x*x + 2*b*x + c
}
double fabs(double x){
*(((int *) &x) + 1) &= 0x7fffffff; //最高位, 置0
return x;
}
int main()
{
double x0, eps;
cin >> x0 >> eps;
while(fabs(fun(x0))>eps)
x0 -= fun(x0)/fun1(x0);
cout << x0 << endl;
return 0;
}
4、输入、排序、查找
#include <iostream>
using namespace std;
int input(int *arr){ //输入
int x, index = 0;
for( ;cin >> x, x != -9999; )
arr[index++] = x;
return index;
}
void insertSort(int *arr, int n){//插入排序
int i, j, t;
for (j=1; j<n; j++ ) {
t = arr[j];
for ( i=j; i>0 && arr[i-1]>t; i-- )
arr[i] = arr[i-1];
arr[i] = t;
}
}
int findX(int *arr, int n, int x){//二分查找
int left = 0, right = n-1, mid = -1;
while(left<=right)
{
mid = (right-left)/2 + left; //防溢出
if(arr[mid]>x)
right = mid - 1;
else if(arr[mid]<x)
left = mid + 1;
else
break;
}
if(left>right) mid = -1;
return mid;
}
void find5X(int *arr, int n){ //查找5个元素
int x;
for(int i=0; i<5; ++i)
{
cin >> x;
cout << findX(arr, n, x) << endl;
}
}
int main()
{
int arr[100], n;
n = input( arr );
insertSort( arr, n );
find5X( arr, n );
return 0;
}
5、单词排序,用不到复制、大小写转换函数
#include <iostream>
using namespace std;
void insertSort(char **arr, int n);
int compare(const char *dst, const char *src);
int main()
{
char **str = new char*[100];
for(int i=0; i<100; ++i)
str[i] = new char[20];
int n;
cin >> n;
for(int i=0; i<n; ++i){
cin >> str[i];
}
insertSort( str, n );
for(int j=0; j<n; ++j)
cout << str[j] << endl;
return 0;
}
void insertSort(char **arr, int n){//插入排序
int i, j, t;
for (j=1; j<n; j++ ) {
char *t = arr[j];
for ( i=j; i>0 && 1 == compare(arr[i-1],t); i-- )
arr[i] = arr[i-1];
arr[i] = t;
}
}
int compare(const char *dst, const char *src)
{
int ch1, ch2, ret = 0;
do
{
if ( ((ch1 = (unsigned char)(*(dst++))) >= 'A') &&(ch1 <= 'Z') )
ch1 += 0x20;
if ( ((ch2 = (unsigned char)(*(src++))) >= 'A') &&(ch2 <= 'Z') )
ch2 += 0x20;
} while ( ch1 && (ch1 == ch2) );
if ( ch1-ch2 < 0)
ret = -1 ;
else if ( ch1-ch2 > 0 )
ret = 1 ;
return ret;
}
6、识别数字,数字逐字累加后乘以符号存储数字;还可以数字累加后存储数字,符号也可以存储
#include <iostream>
using namespace std;
void solution(char *p)
{
int i, arr[256], index = 0;
int flag = 0, sum = 0, sign = 1;
for(i=0; p[i]; ++i)
{
if( p[i]>='0' && p[i]<='9' )
{
sum = sum*10 + p[i] - '0';
if( i && p[i-1] == '-' )
sign = -1;
flag = 1;
continue;
}
if(flag)
{
arr[index++] = sum*sign;
sign = 1; //符号置 1
sum = 0; //sum置 0
flag = 0; //数字标记置 0
}
}
if(flag){ //字符串最后为数字
arr[index++] = sum*sign;
}
for(i=0; i<index; ++i)
{
if(i)
cout << " ";
cout << arr[i];
}
}
int main()
{
char str[256];
cin.getline(str,256);
solution(str);
return 0;
}
#include <iostream>
using namespace std;
typedef struct {
short tag;//判断类型
union {
int num;
char ch;
}u; //联合体
}SignedNumber;
void solution(char *p)
{
SignedNumber arr[128]; //结构体数组
int index = 0;
int flag = 0, sum = 0;
for( ; *p; p++)
{
//与数字相关
if( *p>='0' && *p<='9' )
{
sum = sum*10 + *p - '0';
flag = 1;
continue;
}
if(flag)
{
arr[index].u.num = sum;
arr[index++].tag = 0;
sum = 0;
flag = 0;
}
//符号相关
if(*p=='-' && *(p+1) && *(p+1)>='0'&&*(p+1)<='9'){
arr[index].u.ch = *p;
arr[index++].tag = 1;
}
}
if(flag){ //字符串最后是数字
arr[index].u.num = sum;
arr[index++].tag = 0;
}
for(int i=0; i<index; ++i)
{
if(i && !arr[i-1].tag) //前面的元素是数字打印空格
cout << " ";
if(!arr[i].tag){
cout << arr[i].u.num;
}
else if(arr[i+1].u.num){//0前不打印符号
cout << arr[i].u.ch;
}
}
}
int main()
{
char str[256];
cin.getline(str,256);
solution(str);
return 0;
}
第5周 编程作业
1、编写字符串反转函数mystrrev
#include <iostream>
using namespace std;
void mystrrev(char str[]);
int main()
{
char s[100];
cin.getline(s, 100);
mystrrev(s);
cout << s << endl;
return 0;
}
void mystrrev(char str[])
{
int i, j, len = 0;
while(str[len]) len++;
for(i=0, j=len-1; i<j; ++i, --j)
{
char t = str[i];
str[i] = str[j];
str[j] = t;
}
}
2、编写一组求数组中最大最小元素的函数
#include <iostream>
using namespace std;
int imax(int array[], int count);
int imin(int array[], int count);
int main()
{
int arr[100];
int n;
cin >> n;
for(int i=0; i<n; ++i)
cin >> arr[i];
cout << imax(arr, n) << endl;
cout << imin(arr, n) << endl;
return 0;
}
int imax(int array[], int count){
int max = array[0];
for(int i=1; i<count; ++i)
if(max<array[i])
max = array[i];
return max;
}
int imin(int array[], int count){
int min = array[0];
for(int i=1; i<count; ++i)
if(min>array[i])
min = array[i];
return min;
}
3、编写函数判断一个整数是否为素数,高效的算法是用一个数组存储素数,被素数整除的不是素数
#include <iostream>
using namespace std;
int isprime(int a);
int main()
{
int a, flag = 0;
for(; cin >> a, a; ){
if(isprime(a)){
if(flag) cout << " ";
cout << a;
flag = 1;
}
}
return 0;
}
int isprime(int a){
int ret = 1;
if(a==1) ret = 0;
for(int i=2; i<=a/i; ++i){
if(a%i==0){
ret = 0;
break;
}
}
return ret;
}
4、编写函数去除字符串中包含的非字母字符(不包括空格),并将小写字母转换成大写字母
#include <iostream>
using namespace std;
void upperStr(char*);
int main()
{
char str[200];
cin.getline(str, 200);
upperStr(str);
cout << str << endl;
return 0;
}
void upperStr(char* str){
char *p = str;
while(*p){
if(*p>='a'&&*p<='z')
*str++ = *p - 32;
else if(*p>='A'&&*p<='Z'||*p == ' ')
*str++ = *p;
p++;
}
*str = *p;
}
5、编写函数计算一个英文句子中的单词个数,忽略非字母,发现字母计数,忽略字母,重复这个过程;一层循环,二个 if
#include <iostream>
using namespace std;
int countWords(char*);
int main()
{
char str[500];
cin.getline(str, 500);
cout << countWords(str) << endl;
return 0;
}
int countWords(char* p){
int count = 0, flag = 1;//如果只一个字母
for( ; *p; p++){
if(!(*p>='a'&&*p<='z'||*p>='A'&&*p<='Z')){
flag = 1; //之后是字母
continue; //没有字母
}
if(flag){
count++;
flag = 0;
}
}
return count;
}
第6周 基础练习
1、递归计算n!
#include <iostream>
using namespace std;
int fact( int n){
if(n==1||n==0)
return 1;
return n*fact(n-1);
}
int main()
{
int n;
cin >> n;
cout << fact( n ) << endl;
return 0;
}
2、递归计算1+2+3+…+n
#include <iostream>
using namespace std;
int sum( int n){
if(n==0) //n 为 0 和为 0
return 0;
if(n==1)
return 1;
return n+sum(n-1);
}
int main()
{
int n;
cin >> n;
cout << sum( n ) << endl;
return 0;
}
3、递归求数组元素的最大值
#include <iostream>
using namespace std;
int arrMax( int *arr, int n){
int max;
if(n==1)
return arr[0];
max = arrMax(arr, n-1);
if(arr[n-1]>max)
max = arr[n-1];
return max;
}
int main()
{
int n;
int arr[100];
cin >> n;
for(int i=0; i<n; ++i)
cin >> arr[i];
cout << arrMax( arr, n ) << endl;
return 0;
}
4、递归求数组元素的和
#include <iostream>
using namespace std;
int arrSum( int *arr, int n){
int sum;
if(n==0)
return 0; //n为0时返回0
if(n==1)
return arr[0];
sum = arrSum(arr, n-1);
sum += arr[n-1];
return sum;
}
int main()
{
int n;
int arr[100];
cin >> n;
for(int i=0; i<n; ++i)
cin >> arr[i];
cout << arrSum( arr, n ) << endl;
return 0;
}
5、递归求Fibonacci序列的第n项
#include <iostream>
using namespace std;
int Fibonacci( int n){
if(n==0)
return 0;
if(n==1)
return 1;
return Fibonacci(n-1) + Fibonacci(n-2);
}
int main()
{
int n;
cin >> n;
cout << Fibonacci( n ) << endl;
return 0;
}
6、递归逆序数组元素
#include <iostream>
using namespace std;
void reverse(int *arr, int i, int j){
if( i < j ){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
reverse(arr, i+1, j-1);
}
}
int main()
{
int n;
int arr[100];
cin >> n;
for(int i=0; i<n; ++i)
cin >> arr[i];
reverse(arr,0,n-1);
for(int i=0; i<n; ++i){
if(i) cout << " ";
cout << arr[i];
}
cout << endl;
return 0;
}
7、输入输出数组元素的函数重载
#include <iostream>
#include <cmath>
using namespace std;
int input( int *ai );
int input( double *ad );
void print( int *ai, int ni );
void print( double *ad, int nd );
int main()
{
int ai[100];
double ad[100];
int ni, nd;
ni = input( ai );
nd = input( ad );
print( ai, ni );
print( ad, nd );
return 0;
}
int input( int *ai ){
int i = 0, x;
for(; cin >> x, x != -9999;)
ai[i++] = x;
return i;
}
int input( double *ad ){
int i = 0;
double x;
for(; cin >> x, fabs(x - (-9999))>1e-7; )
ad[i++] = x;
return i;
}
void print( int *ai, int ni ){
for(int i=0; i<ni; ++i)
{
if(i) cout << " ";
cout << ai[i];
}
cout << endl;
}
void print( double *ad, int nd ){
for(int i=0; i<nd; ++i){
if(i) cout << " ";
cout << ad[i];
}
cout << endl;
}
8、逆序函数重载
#include <iostream>
#include <cmath>
using namespace std;
int input( int *ai );
int input( double *ad );
void print( int *ai, int ni );
void print( double *ad, int nd );
void reverse( int *ai, int ni );
void reverse( double *ad, int nd );
int main()
{
int ai[100];
double ad[100];
int ni, nd;
ni = input( ai );
nd = input( ad );
reverse( ai, ni );
reverse( ad, nd );
print( ai, ni );
print( ad, nd );
return 0;
}
int input( int *ai ){
int i = 0, x;
for(; cin >> x, x != -9999;)
ai[i++] = x;
return i;
}
int input( double *ad ){
int i = 0;
double x;
for(; cin >> x, fabs(x - (-9999))>1e-7; )
ad[i++] = x;
return i;
}
void print( int *ai, int ni ){
for(int i=0; i<ni; ++i)
{
if(i) cout << " ";
cout << ai[i];
}
cout << endl;
}
void print( double *ad, int nd ){
for(int i=0; i<nd; ++i){
if(i) cout << " ";
cout << ad[i];
}
cout << endl;
}
void reverse( int *ai, int ni ){
int i, j;
for(i=0, j = ni-1; i<j; ++i, --j){
int t = ai[i];
ai[i] = ai[j];
ai[j] = t;
}
}
void reverse( double *ad, int nd ){
int i, j;
for(i=0, j = nd-1; i<j; ++i, --j){
double t = ad[i];
ad[i] = ad[j];
ad[j] = t;
}
}
9、数组元素求和函数的重载
#include <iostream>
#include <cmath>
using namespace std;
int input( int *ai );
int input( double *ad );
int mysum( int *ai, int ni );
double mysum(double *ad, int nd );
int main()
{
int ai[100];
double ad[100];
int sumi;
double sumd;
int ni, nd;
ni = input( ai );
nd = input( ad );
sumi = mysum( ai, ni );
sumd = mysum(ad, nd );
cout << sumi << " " << sumd << endl;
return 0;
}
int input( int *ai ){
int i = 0, x;
for(; cin >> x, x != -9999;)
ai[i++] = x;
return i;
}
int input( double *ad ){
int i = 0;
double x;
for(; cin >> x, fabs(x - (-9999))>1e-7; )
ad[i++] = x;
return i;
}
int mysum( int *ai, int ni ){
int sum = 0;
for(int i=0; i<ni; ++i)
sum += ai[i];
return sum;
}
double mysum(double *ad, int nd ){
double sum = 0.0;
for(int i=0; i<nd; ++i)
sum += ad[i];
return sum;
}
10、交换两个元素值的重载函数
#include <iostream>
//#include <cstring>
using namespace std;
void swap( int &a, int &b);
void swap( double &a, double &b);
void swap ( int *a, int n, int *b, int m);
void swap ( char *a, char *b);
void print(int *arr, int n);
int main()
{
int a, b;
double da, db;
int aa[100], ab[100];
char s1[100], s2[100];
int i, n, m;
cin >> a >> b;
cin >> da >> db;
cin >> n;
for(i=0; i<n; i++){
cin >> aa[i];
}
cin >> m;
for(i=0; i<m; i++){
cin >> ab[i];
}
cin >> s1 >> s2;
swap( a, b );
swap( da, db );
swap( aa, n, ab, m );
swap( s1, s2);
cout << a << " " << b << endl;
cout << da << " " << db << endl;
print( aa, m ); //交换
print( ab, n );
cout << s1 << " " << s2 << endl;
return 0;
}
void swap( int &a, int &b){
int t = a;
a = b;
b = t;
}
void swap( double &a, double &b){
double t = a;
a = b;
b = t;
}
void swap ( int *a, int n, int *b, int m){
int i;
int count = n<m ? n : m;
for(i=0; i<count; ++i){
int t = a[i];
a[i] = b[i];
b[i] = t;
}
if(n<m){
for(; i<m; ++i)
a[i] = b[i];
}
if(n>m){
for(; i<n; ++i)
b[i] = a[i];
}
}
void swap ( char *a, char *b){
/* char *t = new char[100];
strcpy( t, a );
strcpy( a, b );
strcpy( b, t );*/
for(int i=0; a[i] || b[i]; ++i){
char t = a[i];
a[i] = b[i];
b[i] = t;
}
}
void print(int *arr, int n){
for(int i=0; i<n; ++i){
if(i) cout << " ";
cout << arr[i];
}
cout << endl;
}
第6周 中级练习
1、递归插入排序
#include <iostream>
using namespace std;
int input(int *a);
void Insert( int *a, int n ); //插入
void InsertSort( int *a, int n ); //递归插入
void print(int *arr, int n);
int main()
{
int data[100];
int n;
n = input( data );
InsertSort( data, n );
print( data, n);
return 0;
}
int input(int *a){
int i = 0, x; // i = 0;
for( ; cin >> x, x != -9999; )
a[i++] = x;
return i;
}
void print(int *arr, int n){
for(int i=0; i<n; ++i){
if(i) cout << " ";
cout << arr[i];
}
cout << endl;
}
void Insert( int *a, int n )//把数组a的第n个数插入前n-1个数中
{
int i = n-1; //插入前n-1个元素中
int key = a[n]; //保存插入元素
while( (i>=0) && (key<a[i]) )
{
a[i+1] = a[i]; //前面元素后移
i--;
}
a[i+1] = key; //找到位置
}
void InsertSort( int *a, int n )
{
if( n>0 )
{
InsertSort( a, n-1 ); // n 递减
Insert( a, n-1 );
}
}
2、递归求两个数的最大公因数
#include <iostream>
using namespace std;
int gcd( int a, int b, int n ){
if(n==1||a%n==0 && b%n==0)
return n;
return gcd( a, b, n-1 );
}
int main()
{
int a, b;
cin >> a >> b;
int n = a<b ? a : b;
cout << gcd( a, b, n ) << endl;
return 0;
}
3、全排列
#include <iostream>
using namespace std;
void print(int array[], int end);
void swap(int &a, int &b);
void permute(int array[], int begin, int end);
int main()
{
int array[100];
int n;
cin >> n;
for(int i=0; i<n; ++i)
array[i] = i+1;
permute( array, 0, n-1 );
return 0;
}
void permute(int array[], int begin, int end)
{
if (begin == end)
{
print(array, end);
}
else
{
for (int j = begin; j <= end; ++j)
{
swap(array[j], array[begin]);
permute
(array, begin+1, end);
swap(array[j], array[begin]);
}
}
}
void print(int array[], int end)
{
for (int i = 0; i <= end; ++i)
{
if(i) cout << " ";
cout << array[i];
}
cout << endl;
}
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
4、递归构造可重复字符串
#include <iostream>
#include <cstring>
using namespace std;
void solution(int pos, char *p, int m, int n)
{
if( pos == n ){
cout << p << endl;
return ;
}
for(int i='A'; i<'A'+m; i++)
{
p[pos] = i;
solution( pos+1, p, m, n );
}
}
int main()
{
int m, n;
cin >> m >> n;
char *p = new char [n+1];
p[n]='\0';
solution( 0, p, m, n );
delete []p;
return 0;
}
5、自然数的拆分
#include <iostream>
using namespace std;
int n;
int a[10001] = {1};
int print( int );
int search( int s, int t );//回溯算法
int main()
{
cin >> n;
search( n, 1 ); //将要拆分的数n传递给s
return 0;
}
int search(int s,int t)
{
int i;
for(i=a[t-1]; i<=s; i++)
if(i<=n) //当前数i要大于等于前1位数,且等于n
{
a[t] = i; //保存当前拆分的数i
s -= i; //s减去i,s的值继续拆分
if(s==0) print(t); //s==0 拆分结束输出结果
else search( s, t+1 ); //s>0,继续递归
s += i; //回溯:加上拆分的数,以便产分所有可能的拆分
}
return 0;
}
int print(int t)
{
cout << n << "=";
for(int i=1;i<=t;i++)
{
if(i==t)
{
cout << a[i];
cout << endl;
}
else cout << a[i] << "+";
}
}
第6周 编程作业
1、递归猴子摘桃
#include <iostream>
using namespace std;
int monkeyandPeak(int k,int n);
int main()
{
int n = 10;
cin >> n;
int count = monkeyandPeak(1,n);
cout << count << endl;
return 0;
}
int monkeyandPeak(int k,int n){
if(n==1) return k;
/* k = monkeyandPeak(2*(k+1),n-1);
return k; */
return monkeyandPeak(2*(k+1),n-1);
}
2、编写内联函数求矩形的面积和周长
#include <iostream>
using namespace std;
inline void fun(int length, int width){
cout << length*width << " " << 2*(length+width) << endl;
}
int main()
{
int length, width;
cin >> length >> width;
fun(length, width);
return 0;
}
3、编写重载函数显示字符串
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
void print_spaced(char* str);
void print_spaced(string str);
int main()
{
char str1[100];
string str2;
cin >> str1 >> str2;
print_spaced( str1 );
print_spaced( str2 );
return 0;
}
void print_spaced(char* str){
for(int i=0; i<strlen(str); ++i)
{
if(i) cout << " ";
cout << str[i];
}
cout << endl;
}
void print_spaced(string str){
for(int i=0; i<str.length(); ++i)
{
if(i) cout << " ";
cout << str[i];
}
cout << endl;
}
4、排序函数重载
#include <iostream>
using namespace std;
void sort(int &a, int &b);
void sort(int &a, int &b, int &c);
void sort(int &a, int &b, int &c, int &d);
void Insert( int *a, int n );
void sort( int *a, int n );
void print(int *arr, int n);
int main()
{
int a,b,c,d;
int data[100];
int k,n,i;
cin >> k;
switch(k)
{
case 1:
cin >> a >> b;
sort( a, b );
cout <<a << " " << b <<endl;
break;
case 2:
cin >> a >> b >> c;
sort( a, b, c);
cout << a << " " << b << " " << c << endl;
break;
case 3:
cin >> a >> b >> c >> d;
sort( a, b, c, d );
cout << a << " " << b << " " << c << " " << d << endl;
break;
case 4:
cin >> n;
for(i=0; i<n; i++)
{
cin >> data[i];
}
sort( data, n );
print( data, n);
break;
}
return 0;
}
void sort(int &a, int &b){
if(a < b)
{
int t = a;
a = b;
b = t;
}
}
void sort(int &a, int &b, int &c){
sort(a,b);
sort(a,c);
sort(b,c);
}
void sort(int &a, int &b, int &c, int &d){
sort(a,b,c);
sort(a,d);
sort(b,d);
sort(c,d);
}
void print(int *arr, int n){
for(int i=0; i<n; ++i){
if(i) cout << " ";
cout << arr[i];
}
cout << endl;
}
void Insert( int *a, int n )//把数组a的第n个数插入前n-1个数中
{
int i = n-1; //插入前n-1个元素中
int key = a[n]; //保存插入元素
while( (i>=0) && (key>a[i]) )
{
a[i+1] = a[i]; //前面元素后移
i--;
}
a[i+1] = key; //找到位置
}
void sort( int *a, int n )
{
if( n>0 )
{
sort( a, n-1 ); // n 递减
Insert( a, n-1 );
}
}
5、编写递归函数来使字符串逆序
#include <iostream>
#include <cstring>
using namespace std;
void reverse(char *str, int i, int j){
if( i < j ){
char ch = str[i];
str[i] = str[j];
str[j] = ch;
reverse(str, i+1, j-1);
}
}
int main()
{
char str[100];
cin.getline(str,100);
int len = strlen(str);
reverse(str,0,len-1);
cout << str;
return 0;
}
第7周 基础练习
1、两个数的排序
#include <iostream>
using namespace std;
void sort(int *a, int *b){
if( *a > *b ){
int t = *a;
*a = *b;
*b = t;
}
}
int main()
{
int a, b;
cin >> a >> b;
sort( &a, &b );
cout << a << " " << b << endl;
return 0;
}
2、三个数的排序
#include <iostream>
using namespace std;
void sort(int *a, int *b);
void sort(int *a, int *b, int *c);
int main()
{
int a, b, c;
cin >> a >> b >> c;
sort( &a, &b, &c );
cout << a << " " << b << " " << c << endl;
return 0;
}
void sort(int *a, int *b){
if( *a > *b ){
int t = *a;
*a = *b;
*b = t;
}
}
void sort(int *a, int *b, int *c){
sort(a,b);
sort(a,c);
sort(b,c);
}
3、返回数组的统计值(最大、最小、平均值、标准差)
#include <iostream>
#include <cmath>
using namespace std;
int input(double *a);
void statistics(double a[],int n,double *max,double *min,double *avg,double *stdev);
int main()
{
double a[100];
double max, min, avg, stdev;
int n = input( a );
statistics(a,n,&max,&min,&avg,&stdev);
cout << max << " " << min << " " << avg << " " << stdev << endl;
return 0;
}
int input(double *a){
int n = 0;
double x;
for( ; cin >> x, fabs(x+9999)>1e-6; )
a[n++] = x;
return n;
}
void statistics(double a[],int n,double *max,double *min,double *avg,double *stdev){
double sum1 = a[0], sum2 = 0.0;
*max = *min = a[0];
for(int i=1; i<n; ++i){
if(a[i]>*max)
*max = a[i];
if(a[i]<*min)
*min = a[i];
sum1 += a[i];
}
*avg = sum1/n;
for(int i=0; i<n; ++i){
sum2 += (a[i]-*avg)*(a[i]-*avg);
}
*stdev = sqrt(1.0/n*sum2);
}
4、通过指向函数的指针调用函数
#include <iostream>
#include <cmath>
using namespace std;
double x2(double x);
double mysin(double x);
int main()
{
double (*f)(double);
double x;
cin >> x;
f = x2;
cout << f(x) << " ";
f = mysin;
cout << f(x) << endl;
return 0;
}
double x2(double x){
return x*x;
}
double mysin(double x){
return 2*sin(2*3.14*2*x+3.14);
}
5、计算任意一元函数值的通用函数
#include <iostream>
#include <cmath>
using namespace std;
double x2(double x);
double mysin(double x);
double anyfun(double (*f)(double),double x);
int main()
{
double x;
cin >> x;
cout << anyfun(x2,x) << " ";
cout << anyfun(mysin,x) << endl;
return 0;
}
double x2(double x){
return x*x;
}
double mysin(double x){
return 2*sin(2*3.14*2*x+3.14);
}
double anyfun(double (*f)(double),double x){
return f(x);
}
6、计算函数在指定区间的近似平均值
#include <iostream>
#include <cmath>
using namespace std;
double funavg(double (*f)(double x), double a,double b,int n);
int main()
{
const int n = 1000;
double a, b;
cin >> a >> b;
cout << funavg( exp, a, b, n ) << " ";
cout << funavg( sin, a, b, n ) << " ";
cout << funavg( cos, a, b, n ) << endl;
return 0;
}
double funavg(double (*f)(double x), double a,double b,int n){
double h = (b-a)/n, sum = f(a);
double x = a;
for(int i=1; fabs(b-x)>1e-6; ++i){
x = a+i*h;
sum += f(x);
}
return sum/(n+1);
}
第7周 中级练习
1、指针实现向量的内积计算
#include <iostream>
#include <cmath>
using namespace std;
int input(double *a);
double solution(double *a, double *b, int n);
int main()
{
double a[100], b[100];
int n = input( a );
input( b );
cout << solution( a, b, n ) << endl;
return 0;
}
int input(double *a){
double *t = a, x;
for( ; cin >> x, fabs(x+9999)>1e-6; )
*a++ = x;
return a - t;
}
double solution(double *a, double *b, int n){
double sum = 0.0;
for(int i=0; i<n; ++i)
sum += (*a++) * (*b++);
return sum;
}
2、使用指针的插入排序
#include <iostream>
using namespace std;
int input(int *a);
void InsertSort(int *arr, int n);
int main()
{
int a[100];
int n = input( a );
InsertSort( a, n );
for(int i=0; i<n; ++i){
if(i) cout << " ";
cout << *(a+i);
}
return 0;
}
int input(int *a){
int *t = a, x;
for( ; cin >> x, x != -9999; )
*a++ = x;
return a - t;
}
void InsertSort(int *arr, int n)
{
int i;
for(i=1; i<n; ++i){/*第0个元素有序,从第1个元素向右无序*/
int j=i-1,key=*(arr+i);/*保存第i个元素,左边的元素i-1*/
while(j>=0 && key<*(arr+j)){/*保存的元素key与之前的元素从右向左逐个比较*/
*(arr+j+1)=*(arr+j);/*移动(向后赋值)*/
j--;
}
*(arr+j+1)=key;/*j--退出,恢复正确值j+1*/
}
}
3、指针实现成绩排序
#include <iostream>
using namespace std;
struct Student{
int no;
int achievement;
};
int input(Student *s);
void BubbleSort(Student *a,int left, int right);
int main()
{
Student s[100];
int n = input( s );
BubbleSort( s, 0, n-1 );
for(int i=0; i<n; ++i){
cout << (s+i)->no << " " << (s+i)->achievement << endl;
}
return 0;
}
int input(Student *s){
Student *t = s;
int x, y;
for( ; cin >> x >> y, x != 0; ){
s->no = x;
s->achievement = y;
s++;
}
return s - t;
}
/*冒泡排序--递归*/
void BubbleSort(Student *a,int left, int right)
{
if(left<right){
int j;
Student t;
for(j=right; left<j; j--){
if((a+j-1)->achievement>(a+j)->achievement)/*相邻比较*/
t=*(a+j),*(a+j)=*(a+j-1),*(a+j-1)=t;
}
BubbleSort(a,j+1,right);/*递归*/
}
}
4、计算函数在某点的近似导数
#include <iostream>
#include <cmath>
using namespace std;
#define DELTA 0.001 //德尔塔
double solution(double (*fun)(double x), double x){
return ((*fun)(x+DELTA)-(*fun)(x-DELTA))/(2*DELTA); //导数公式
}
int main()
{
double x;
cin >> x;
cout << solution(sin,x) << " ";
cout << solution(cos,x) << " ";
cout << solution(sin,x)+solution(cos,x) << endl;
return 0;
}
5、计算函数在指定区间的近似积分
#include <iostream>
#include <cmath>
using namespace std;
#define N 100 // δ = (b-a)/n, n=100
double solution(double (*fun)(double x), double a, double b){
double sum = 0.0;
for(int i=0; i<N; ++i)
sum += fun(a+i*(b-a)/N);
return sum*(b-a)/N;
}
int main()
{
double a, b;
cin >> a >> b;
cout << solution(sin,a,b) << " ";
cout << solution(cos,a,b) << " ";
cout << solution(sin,a,b)+solution(cos,a,b) << endl;
return 0;
}
第7周 编程作业
1、编写函数重置两个变量的值
#include <iostream>
#include <cmath>
using namespace std;
void reset(int *a, int *b);
int main()
{
int a, b;
cin >> a >> b;
reset( &a, &b );
cout << a << " " << b << endl;
return 0;
}
void reset(int *a, int *b){
*a = (*a+*b)/2.0 + 0.5;
*b = *a;
}
2、编写函数对数组中的元素求和
#include <iostream>
#include <cmath>
using namespace std;
int input( int *array);
void add_array(int a, int *sum);
int main()
{
int array[100], sum = 0;
int n = input( array );
for(int i=0; i<n; ++i)
add_array(array[i], &sum);
cout << sum << endl;
return 0;
}
int input( int *array){
int x, i = 0;
for( ; cin >> x, x != -1; )
array[i++] = x;
return i;
}
void add_array(int a, int *sum){
*sum += a;
}
3、数组清零
#include <iostream>
using namespace std;
int input( int *array);
void solution( int *array, int n);
void output(int *p, int count);
int main()
{
int a[100], * p= a, n;
int count = input( p );
cin >> n;
solution( p, n );
output(p, count);
return 0;
}
void solution( int *array, int n){
for( int i=0; i<n; ++i )
array[i] = 0;
}
int input( int *array){
int x, i = 0;
for( ; cin >> x, x != -1; )
array[i++] = x;
return i;
}
void output(int *p, int count){
for(int i=0; i<count; ++i)
{
if(i) cout << " ";
cout << p[i];
}
cout << endl;
}
4、使用函数指针切换加密方法
#include <iostream>
using namespace std;
void caesar(char s[]);
void oddeven(char s[]);
void cipher(void (*f)(char s[]),char s[]);//形参为指向函数的指针,对应实参可为相应格式的函数名。
int main()
{
char str[256];
int n;
cin >> str >> n;
switch(n){
case 1: cipher( caesar, str ); break;
case 2: cipher( oddeven, str ); break;
}
return 0;
}
void caesar(char s[]){
for(int i=0; s[i]; ++i)
{
char ch = 'a';
if(s[i]>='a' && s[i]<='z'){
s[i] -= 32; //转大写
ch = 'A';
}
else{
s[i] += 32; //转小写
}
s[i] = ( s[i] + 3 - ch ) % 26 + ch;
}
cout << s << endl;
}
void oddeven(char s[]){
char str[256], index1 = 0, index2 = 0, i;
for(i=0; s[i]; ++i){
if(i%2) //下标为奇数的保存到str
str[index1++] = s[i];
else //下标为偶数的保存到s
s[index2++] = s[i];
}
for(i=0; i<index1; ++i)
s[index2++] = str[i]; //把奇数的复制到s
cout << s << endl;
}
void cipher(void (*f)(char s[]),char s[]){
f(s);
}
5、编写求函数区间平均值的通用函数
#include <iostream>
using namespace std;
int a, b, c, m;
int func1(int x);
int func2(int x);
int avg( int (*f)(int),int x1,int x2);
int main()
{
int x1, x2;
cin >> a >> b >> c;
cin >> m;
cin >> x1 >> x2;
cout << avg( func1, x1, x2 ) << endl;
cout << avg( func2, x1, x2 ) << endl;
return 0;
}
int func1(int x){
return a*x*x+b*x+c;
}
int func2(int x){
int ret = 1;
for(int i=0; i<m; ++i)
ret *= x;
return ret;
}
int avg( int (*f)(int),int x1,int x2){
int sum = 0;
for(int i=x1; i<=x2; ++i){ //x1,x2 区间
sum += f(i);
}
return sum/(x2-x1+1);
}
第8周 基础练习
1、使用指针输出数组元素
#include <iostream>
using namespace std;
int main()
{
const int N = 20;
int *arr = new int[N]; //没有判断申请空间是否成功
int *p = arr;
int x, i = 0;
for( ; cin >> x, x != 9999 && i<N ; i++ )
*p++ = x;
p = arr;
/* for(int j=0; j<i; ++j)
{
if(j) cout << " "; //判断若干次
cout << *p++;
}
cout << endl;*/
if(i) { //判断一次
cout << *p++;
while(--i)
cout << " " << *p++;
cout << endl;
}
return 0;
}
2、通过指针输入输出数组元素的函数
#include <iostream>
using namespace std;
int input(int *p); //输入,返回输入的元素个数
void print(int *p,int n); //显示数组元素,n为元素个数
int main()
{
const int N = 100;
int *arr = new int[N];
int n = input( arr );
print( arr, n );
return 0;
}
int input(int *p){
int x, i = 0;
for( ; cin >> x, x != 9999; ++i )
*p++ = x;
return i;
}
void print(int *p,int n){
if(n) {
cout << *p++;
while(--n)
cout << " " << *p++;
cout << endl;
}
}
3、指针实现字符串复制函数
#include <iostream>
using namespace std;
char * mystrcpy(char *s1,char *s2); //将s2中的内容复制到s1中,返回s1首地址
int main()
{
char s1[100], s2[100];
cin >> s2;
cout << mystrcpy(s1,s2) << endl;
return 0;
}
char * mystrcpy(char *s1,char *s2){
char *s = s1;
while( *s1++ = *s2++ );
return s;
}
4、指针实现字符串比较,不区分大小写
#include <iostream>
using namespace std;
int mystrcmp(char *s1,char *s2);
int main()
{
char s1[100], s2[100];
cin >> s1 >> s2;
cout << mystrcmp(s1,s2) << endl;
return 0;
}
int mystrcmp(char *s1,char *s2)
{
int ch1, ch2, ret = 0;
do
{
if ( ((ch1 = (unsigned char)(*(s1++))) >= 'A') &&(ch1 <= 'Z') )
ch1 += 0x20;
if ( ((ch2 = (unsigned char)(*(s2++))) >= 'A') &&(ch2 <= 'Z') )
ch2 += 0x20;
} while ( ch1 && (ch1 == ch2) );
if ( ch1-ch2 < 0)
ret = -1 ;
else if ( ch1-ch2 > 0 )
ret = 1 ;
return ret;
}
5、通过指针访问结构体变量
#include <iostream>
using namespace std;
struct PERSON{
char name[40], gender[10];
int age;
};
int main()
{
PERSON one;
PERSON *p = &one;
cin >> p->name >> p->gender >> p->age;
cout << p->name << " " << p->gender << " " << p->age << endl;
return 0;
}
6、通过指针访问结构体数组
#include <iostream>
#include <cstring>
using namespace std;
struct PERSON{
char name[40], gender[10];
int age;
};
int main()
{
PERSON aclass[50];
PERSON *p = aclass;
int n = 0; //
cin >> p->name >> p->gender >> p->age;
while(strcmp(p->name,"0") && strcmp(p->gender,"0") && p->age)
{
n++;
p++;
cin >> p->name >> p->gender >> p->age;
}
p = aclass+n-1;
while( p>=aclass ){
cout << p->name << " " << p->gender << " " << p->age << endl;
p--;
}
return 0;
}
7、动态申请变量,别忘了释放内存
#include <iostream>
using namespace std;
int main()
{
int *a = new int;
int *b = new int ;
int *c = new int;
cin >> *a >> *b >> *c;
cout << (*a+*b+*c) << endl;
delete a, b, c;
return 0;
}
8、动态申请数组
#include <iostream>
using namespace std;
int main()
{
double x, *p, *q;
int n, k = 0;
cin >> n;
q = p = new double[n];
for( ; cin >> x, x != 9999; k++)
*q++ = x;
q = p+k-1;
cout << *q--;
while( q>=p )
cout << " " << *q--;
cout << endl;
delete []p;
return 0;
}
9、动态申请结构体数组
#include <iostream>
#include <cstring>
using namespace std;
struct PERSON{
char name[40], gender[10];
int age;
};
int main()
{
int i, n;
PERSON *t, *p;
cin >> n;
t = p = new PERSON[n];
cin >> t->name >> t->gender >> t->age;
for( i=0; strcmp(t->name,"0") && strcmp(t->gender,"0") && t->age; ++i ){
t++; //开始输入的不是 "0", t++ , 再次输入
cin >> t->name >> t->gender >> t->age;
}
t = p+i-1;
while( t>=p ){
cout << t->name << " " << t->gender << " " << t->age << endl;
t--;
}
delete []p;
return 0;
}
10、动态申请结构体数组空间和结构体数组复制
#include <iostream>
#include <cstring>
using namespace std;
struct PERSON{
char name[40], gender[10];
int age;
};
int main()
{
int i, n;
PERSON *t, *p;
cin >> n;
t = p = new PERSON[n];
cin >> t->name >> t->gender >> t->age;
for( i=0; strcmp(t->name,"0") && strcmp(t->gender,"0") && t->age; ++i ){
t++; //开始输入的不是 "0", t++ , 再次输入
cin >> t->name >> t->gender >> t->age;
}
t = p+i-1;
PERSON *t1, *p1;
t1 = p1 = new PERSON[i];
while(t>=p) *t1++ = *t--;
t1 = p1; //p1已经是逆序的
while( t1<p1+i ){ //不越界, 小于p1+i
cout << t1->name << " " << t1->gender << " " << t1->age << endl;
t1++;
}
delete []p;
delete []p1;
return 0;
}
第8周 中级练习
1、IP地址转换1
#include <iostream>
using namespace std;
void InitBinStr(char *BinStr);
void NumToBinStr(char *BinStr, int n, int index);
void solution( const char *IpStr, char *BinStr );
int main()
{
char IpStr[33],BinStr[33];
cin >> IpStr;
InitBinStr( BinStr );
solution( IpStr, BinStr );
return 0;
}
void InitBinStr(char *BinStr){
char *p = BinStr; //为了更好理解 其实形参可以直接使用p
for(int i=0; i<32; ++i) //赋值
*p++ = '0';
*p = '\0'; //保存二进制的字符数组,最后有个字符串结束符
}
void NumToBinStr(char *BinStr, int n, int index){
while(n){
BinStr[index--] = n%2 + '0';
n /= 2;
}
}
void solution( const char *IpStr, char *BinStr ){
const char *p = IpStr; // 为了更容易书写
for(int n=0,index=7; index<32; p++ )
{
if(*p && *p != '.')//读数字
{
n = n*10 + *p - '0';
continue;
}
NumToBinStr(BinStr,n,index);//遇到'.'或字符串读完 转换二进制
index += 8; //步长8
n = 0; //数字归零
}
cout << BinStr << endl;
}
2、IP地址转换2
#include <iostream>
using namespace std;
int solution( const char * );
int main()
{
char BinStr[33];
cin >> BinStr;
cout << solution( BinStr );
for(int i=8; i<32; i+=8)
cout << "." << solution( BinStr+i );
return 0;
}
int solution( const char *p ){
int t = 8, n = 0;
while(t--)
n += (*p++ - '0') << t;
return n;
}
#include <iostream>
using namespace std;
void solution( const char *BinStr );
int main()
{
char BinStr[33];
cin >> BinStr;
solution( BinStr );
return 0;
}
void solution( const char *BinStr ){
const char *p = BinStr; // 为了更容易书写
for(int n=0,t=8,cnt=0; cnt<4; p++ )
{
if(t--)//读数字
{
n += (*p - '0') << t;
continue;
}
if(cnt) cout << ".";
cout << n;
cnt++;
p--; //t==0的时候p多++一次
t = 8;
n = 0; //数字归零
}
}
#include <iostream>
using namespace std;
void solution( char *IpStr, const char *BinStr );
int main()
{
char IpStr[33],BinStr[33];
cin >> BinStr;
solution( IpStr, BinStr );
return 0;
}
void NumToIpStr(char *IpStr,int n)
{
static int index = 0;
static int cnt = 0;
if(n==0){
IpStr[index++] = '0';
}
char tmp[3];
int i = 0;
while(n){
tmp[i++] = n%10 + '0';
n /= 10;
}
while(i--)
IpStr[index++] = tmp[i];
if(++cnt<4){
IpStr[index++] = '.';
}
else{
IpStr[index] = '\0';
}
}
void solution( char *IpStr, const char *BinStr ){
const char *p = BinStr; // 为了更容易书写
for(int n=0,t=8,cnt=0; cnt<4; p++ )
{
if(t--)//读数字
{
n += (*p - '0') << t;
continue;
}
NumToIpStr(IpStr,n);
cnt++;
p--; //t==0的时候p多++一次
t = 8;
n = 0; //数字归零
}
cout << IpStr << endl;
}
3、找数据
#include <iostream>
using namespace std;
void solution(char *p)
{
int i, index = 0;
int flag = 0, sum = 0, sign = 1;
int dot = 0;
for(i=0; ; ++i)
{
if( p[i]>='0' && p[i]<='9'|| p[i]=='.' )
{
if( p[i] == '.' ){
dot = 1;
continue;
}
if(dot){ //记录小数点之后的位数
dot *= 10;
}
sum = sum*10 + p[i] - '0';
if( i && p[i-1] == '-' )
sign = -1;
flag = 1;
continue;
}
if(flag)
{
if(dot){
cout << 1.0*(sum*sign)/dot+9 << endl;
}
else{
cout << sum*sign+9 << endl;
}
sign = 1; //符号置 1
sum = 0; //sum置 0
flag = 0; //数字标记置 0
dot = 0;
}
if(!p[i])
break; //最后是数字可以输出
}
}
int main()
{
char str[256];
cin.getline(str,256);
solution(str);
return 0;
}
#include <iostream>
using namespace std;
struct IntAndDoubleArr{
bool tag;
union{
double num1;
int num2;
}u;
};
void solution(char *p)
{
IntAndDoubleArr arr[256];
int i, index = 0;
int flag = 0, sum = 0, sign = 1;
int dot = 0;
for(i=0; ; ++i)
{
if( p[i]>='0' && p[i]<='9'|| p[i]=='.' )
{
if( p[i] == '.' ){
dot = 1;
continue;
}
if(dot){ //记录小数点之后的位数
dot *= 10;
}
sum = sum*10 + p[i] - '0';
if( i && p[i-1] == '-' )
sign = -1;
flag = 1;
continue;
}
if(flag)
{
if(dot){
arr[index].tag = true;
arr[index++].u.num1 = 1.0*(sum*sign)/dot+9;
}
else{
arr[index].tag = false;
arr[index++].u.num2 = sum*sign+9;
}
sign = 1; //符号置 1
sum = 0; //sum置 0
flag = 0; //数字标记置 0
dot = 0;
}
if(!p[i])
break;
}
for(i=0; i<index; ++i)
{
if(arr[i].tag)
cout << arr[i].u.num1 << endl;
else
cout << arr[i].u.num2 << endl;
}
}
int main()
{
char str[256];
cin.getline(str,256);
solution(str);
return 0;
}
4、指针实现矩阵相加
#include <iostream>
using namespace std;
void solution( int *, int *, int, int );
int main()
{
int i, j, k, index;
cin >> i >> j;
int *arr1 = new int[i*j];
int *arr2 = new int[i*j];
for( k=0,index=0; k<i*j; ++k )
cin >> arr1[index++];
for( k=0,index=0; k<i*j; ++k )
cin >> arr2[index++];
solution( arr1, arr2, i, j );
return 0;
}
void solution( int *arr1, int *arr2, int i, int j)
{
for( int k=0; k<i*j; ++k )
{
if( k && k%j==0 ) cout << endl;
else if( k && k%j) cout << " ";
cout << (*arr1++) + (*arr2++);
}
cout << endl;
}
5、指针实现矩阵相乘
#include <iostream>
using namespace std;
/***
1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘;
2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数;
3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和;
***/
void solution( int *, int *, int, int, int );
int main()
{
int row1, column1, k, index;
cin >> row1 >> column1;
int *arr1 = new int[row1*column1];
for( k=0,index=0; k<row1*column1; ++k )
cin >> arr1[index++];
int row2, column2;
cin >> row2 >> column2;
int *arr2 = new int[row2*column2];
for( k=0,index=0; k<row2*column2; ++k )
cin >> arr2[index++];
//solution( arr1, arr2, row1, column1, row2, column2 ); //row2==column1
solution( arr1, arr2, row1, column1, column2 );
return 0;
}
void solution( int *arr1, int *arr2, int row1, int column1, int column2 )
{
int *t1, *t2, k, row, column, sum = 0;
for( row=0; row<row1; row++ ) // row1
{
for( column=0; column<column2; column++ ) // column2
{
t1 = arr1 + row * column1;
t2 = arr2 + column;
sum = 0;
for( k=0; k<column1; k++ )
{
sum += (*t1) * (*t2);
t1 += 1; //arr1数组的行
t2 += column2; //arr2数组的列
}
if(column) cout << " ";
cout << sum;
}
cout << endl;
}
}
第8周 编程作业
1、输出数字的英文名称
#include <iostream>
using namespace std;
const char * digitName(int n);
int main()
{
int n;
cin >> n;
cout << digitName( n ) << endl;
return 0;
}
const char * digitName(int n){
const char *digitName[] = {"zero","one", "two", "three", "four", "five", "six",
"seven", "eight", "nine", "ten", "eleven", "twelve"};
return digitName[n];
}
2、去除字符串首尾多余的空格
#include <iostream>
using namespace std;
int main( )
{
char str[100];
cin.get(str,100);
char *p = str, *q = str;
while( *p != '#' ) p++;
while( *--p == ' ' );
*(p+1) = '#';
*(p+2) = '\0';
p = str;
while( *p == ' ') p++;
while( *q++ = *p++);
cout << str << endl;
return 0;
}
3、遍历二维数组
#include <iostream>
using namespace std;
int main()
{
int **a; //指向指针的指针
int n, m;//n行 m列
int i, j;
int sum = 0;
cin >> n >> m; //输入行数和列数
//申请空间
a = new int * [n]; //n个 int 指针 数组
for( i=0; i<n; i++ ) //n个大小为m的一维数组
{
a[i] = new int[m]; //1个大小为m的一维数组,a[i]是int指针
}
//输入数据
for( i=0; i<n; i++ )
{
for( j=0; j<m; j++ )
{
//cin>>a[i][j];//输入
cin>> *(*(a+i)+j);//同上a相当于行指针
sum += *(*(a+i)+j);
}
}
cout << sum << endl;
/* //输出数据
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
//cout<<a[i][j]<<"\t";//输出
cout<< *(*(a+i)+j)<<"\t";
}
cout<<endl;
} */
//释放申请的空间!!!
for(i=0;i<n;i++) //释放n个大小为m的一维数组
{
delete []a[i];
}
delete []a;//释放int指针数组
return 0;
}
4、动态申请大数组
#include <iostream>
using namespace std;
int *new_array(int n);
void init_array(int *p, int n,int c);
int main()
{
int n, c;
cin >> n >> c;
int *p = new_array( n );
init_array( p, n, c);
for( int i=0; i<n; ++i )
{
if(i) cout << " ";
cout << *p;
}
delete []p;
return 0;
}
int *new_array(int n){
int *p = new int[n];
return p;
}
void init_array(int *p, int n,int c){
for( int i=0; i<n; ++i )
*p++ = c;
}
5、矩阵对角线元素之和
#include <iostream>
using namespace std;
int main()
{
int n, sum = 0;
cin >> n;
int *p = new int[n*n];
for( int i=0; i<n*n; ++i )
{
cin >> *p;
if(i%(n+1)==0) sum += *p;
}
cout << sum << endl;
delete []p;
return 0;
}
6、十进制点分IP转换为32位二进制IP,IP合法性是没有连续的 '.'
#include <iostream>
using namespace std;
void InitBinStr(char *BinStr);
void NumToBinStr(char *BinStr, int n, int index);
void solution( const char *IpStr, char *BinStr );
int main()
{
char IpStr[33],BinStr[33];
cin >> IpStr;
InitBinStr( BinStr );
solution( IpStr, BinStr );
return 0;
}
void InitBinStr(char *BinStr){
char *p = BinStr; //为了更好理解 其实形参可以直接使用p
for(int i=0; i<32; ++i) //赋值
*p++ = '0';
*p = '\0'; //保存二进制的字符数组,最后有个字符串结束符
}
void NumToBinStr(char *BinStr, int n, int index){
while(n){
BinStr[index--] = n%2 + '0';
n /= 2;
}
}
void solution( const char *IpStr, char *BinStr ){
const char *p = IpStr; // 为了更容易书写
//for(int n=0,index=7,flag=0; index<32; p++ )
for(int n=0,index=7; index<32; p++ )
{
if(*p>='0' && *p<='9') //是数字
{
n = n*10 + *p - '0';
//flag = 1;
continue;
}
if(*(p+1)=='.'){ //经过测试题目要求的合法性是没有连续的'.'
cout<<"data error"<<endl;
return;
}
//还有数字是否超过255 字符串是否超短 超长的情况
/* if(*p && *p!='.' || !flag || *(p+1)=='.'){ //不是数字也不是 '.' 或第一个就是'.' 或连续的'.'
cout<<"data error"<<endl;
return;
} */
NumToBinStr(BinStr,n,index);//遇到'.'或字符串读完 转换二进制
index += 8; //步长8
n = 0; //数字归零
}
/* if(*(p-1)){ //字符串超长
cout<<"data error"<<endl;
return;
} */
cout << BinStr << endl;
}
#include <iostream>
using namespace std;
void InitBinStr(char *BinStr);
void NumToBinStr(char *BinStr, int n, int index);
void solution( const char *IpStr, char *BinStr );
int main()
{
char IpStr[33],BinStr[33];
cin >> IpStr;
InitBinStr( BinStr );
solution( IpStr, BinStr );
return 0;
}
void InitBinStr(char *BinStr){
char *p = BinStr; //为了更好理解 其实形参可以直接使用p
for(int i=0; i<32; ++i) //赋值
*p++ = '0';
*p = '\0'; //保存二进制的字符数组,最后有个字符串结束符
}
void NumToBinStr(char *BinStr, int n, int index){
while(n){
BinStr[index--] = n%2 + '0';
n /= 2;
}
}
void solution( const char *IpStr, char *BinStr ){
const char *p = IpStr; // 为了更容易书写
for(int n=0,index=7; index<32; p++ )
{
if(*p>='0' && *p<='9') //是数字
{
n = n*10 + *p - '0';
continue;
}
if(*(p+1)=='.'){ //经过测试题目要求的合法性是没有连续的'.'
cout<<"data error"<<endl;
return;
}
NumToBinStr(BinStr,n,index);//遇到'.'或字符串读完 转换二进制
index += 8; //步长8
n = 0; //数字归零
}
cout << BinStr << endl;
}
第13周 编程作业
5、读文件中的字符并排序输出
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int s[256] = { 0 }; //256下标代表字符
char a;
while (n--) { //输入并排序
cin >> a;
s[a]++;
}
int flag = 0;
for(int i = 0; i<256; i++){ //按题目要求格式输出
if(s[i]){
n = s[i];
while(n--){
if(flag) cout << " ";
cout << char(i);
flag++;
}
}
}
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
char s[100] = { 0 };
int k = 0;
char a;
while (n--) {
cin >> a;
s[k++] = a;
}
sort(s, s + k);
for (int i = 0;i < k;i++) {
if(i) cout << " ";
cout << s[i];
}
return 0;
}
#include <iostream>
#include <fstream>
using namespace std;
/*
5
Z Y X A C
*/
int main()
{
int t,n;
cin >> n;
t = n;
char s[256] = { 0 };
char a;
int flag = 0;
//写到文件A.txt
ofstream out; //
out.open("A.txt"); //
while (t--) {
cin >> a;
if(flag) out << ' ';
out << a; //
flag++; //
}
out.close();
//读A.txt排序
ifstream in;
in.open("A.txt");
while(in){
in >> a;
if(in){
s[a]++; //排序到数组
}
}
in.close();
//写到文件B.txt
out.open("B.txt"); //
flag = 0;
for(int i = 0; i<256; i++){ //按题目要求格式输出
if(s[i]){
n = s[i];
while(n--){
if(flag){
out << ' ';
cout << ' ';
}
out << char(i);
cout << char(i);
flag++;
}
}
}
out.close();
return 0;
}