6.1输入3个整数,按由小到大的顺序输出
#include <iostream>
using namespace std;
int main()
{void swap(int *p1,int *p2);
int n1,n2,n3;
int *p1,*p2,*p3;
cout<<"input three integers n1,n2,n3:";
cin>>n1>>n2>>n3;
p1=&n1;
p2=&n2;
p3=&n3;
if(n1>n2) swap(p1,p2);
if(n1>n3) swap(p1,p3);
if(n2>n3) swap(p2,p3);
cout<<"Now,the order is:"<<n1<<" "<<n2<<" "<<n3<<endl;
return 0;
}
void swap(int *p1,int *p2)
{int p;
p=*p1; *p1=*p2; *p2=p;
}
6.2输入3个字符串,按由小到大顺序输出
#include <iostream>
#include <cstring>
using namespace std;
int main()
{void swap(char *,char *);
char str1[20],str2[20],str3[20];
cout<<"input three line:"<<endl;
gets(str1);
gets(str2);
gets(str3);
if(strcmp(str1,str2)>0) swap(str1,str2);
if(strcmp(str1,str3)>0) swap(str1,str3);
if(strcmp(str2,str3)>0) swap(str2,str3);
cout<<endl<<"Now,the order is:"<<endl;
cout<<str1<<endl<<str2<<endl<<str3<<endl;
return 0;
}
void swap(char *p1,char *p2) /* 交换两个字符串 */
{char p[20];
strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);
}
#include <iostream>
#include <string>
using namespace std;
int main()
{void change(string &,string &);
string str1=" ",
str2=" ",
str3=" ";
char *p1=&str1[0],*p2=&str2[0],*p3=&str3[0];
cout<<"input three line:"<<endl;
gets(p1);
gets(p2);
gets(p3);
if(str1>str2)change(str1,str2);
if(str1>str3)change(str1,str3);
if(str2>str3)change(str2,str3);
cout<<endl<<"Now,the order is:"<<endl;
cout<<str1<<endl<<str2<<endl<<str3<<endl;
return 0;
}
void change(string &st1,string &st2) /* 交换两个字符串 */
{string st;
st=st1;st1=st2;st2=st;
}
6.3输入10个整数,将最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数
#include <iostream>
using namespace std;
int main()
{ void input(int *number);
void max_min_value(int *number);
void output(int *number);
int number[10];
input(number); // 调用输入10个数的函数
max_min_value(number); // 调用交换函数
output(number); // 调用输出函数
return 0;
}
void input(int *number) // 输入10个数的函数
{int i;
cout<<"input 10 numbers:";
for (i=0;i<10;i++)
cin>>number[i];
}
void max_min_value(int *number) // 交换函数
{ int *max,*min,*p,temp;
max=min=number;
for (p=number+1;p<number+10;p++)
if (*p>*max) max=p; // 将大数地址赋给 max
else if (*p<*min) min=p; // 将小数地址赋给 min
temp=number[0];number[0]=*min;*min=temp; // 将最小数与第一数交换
temp=number[9];number[9]=*max;*max=temp; // 将最小数与第一数交换
}
void output(int *number) // 输出函数
{int *p;
cout<<"now,they are: ";
for (p=number;p<number+10;p++)
cout<<*p<<" ";
cout<<endl;
return;
}
6.4有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。
#include <iostream>
using namespace std;
int main()
{void move(int *array,int n,int m);
int number[20],n,m,i;
cout<<"how many numbers?"; // 询问共有多少个数
cin>>n;
cout<<"input "<<n<<" numbers:"<<endl; // 要求输入n个数
for (i=0;i<n;i++)
cin>>number[i];
cout<<"how many places do you want move?"; // 询问后移多少个位置
cin>>m;
move(number,n,m); //调用move 函数
cout<<"Now,they are:"<<endl;
for (i=0;i<n;i++)
cout<<number[i]<<" ";
cout<<endl;
return 0;
}
void move(int *array,int n,int m) //使循环后移一次的函数
{int *p,array_end;
array_end=*(array+n-1);
for (p=array+n-1;p>array;p--)
*p=*(p-1);
*array=array_end;
m--;
if (m>0) move(array,n,m); //递归调用,当循环次数m减至为0时,停止调用
}
6.5有n个人围成一圈,顺序排号。从第一个人开始报数,反报到3的人退出圈子,最后留下的人原来排在第几号。
#include <iostream>
using namespace std;
#define max 15
int main()
{
int i,k,m,n,num[max],*p;
cout<<"input number of person: n="<<endl;
cin>>n;
p=num;
for(i=0;i<n;i++) //以1~n为序给每个人编号
*(p+i)=i+1;
i=0; //每次循环计数变量
k=0; //按123报数时的计数变量
m=0; //退出人数
while (m<n-1) //退出人数比n-1少(即未退出人数>1)
{
if (*(p+i)!=0)
k++;
if(k==3)
{
cout<<*(p+i)<<" "<<endl;//输出out的人编号
*(p+i)=0; //出圈人设为0
m++; //圈外人+1
k=0; //重新开始报数
}
i++; //向下移一位
if (i==n) //指针到最后一位时 重新赋值
i=0;
}
// while(*p==0)
// p++;
for (i=0;i<n;i++)
if(*(p+i)!=0)
cout <<"the last one is NO."<<*(p+i)<<endl;
return 0;
}
6.6写一函数,求字符串长度
#include <iostream>
using namespace std;
int main()
{int length(char *p);
int len;
char str[20];
cout<<"input string:";
cin>>str;
len=length(str);
cout<<"The length of string is "<<len<<endl;
return 0;
}
int length(char *p) //求字符串长度的函数
{int n;
n=0;
while (*p!='\0')
{n++;
p++;
}
return(n);
}
6.7有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串
#include <iostream>
using namespace std;
int main()
{void copystr(char *,char *,int);
int m;
char str1[20],str2[20];
cout<<"input string:";
gets(str1);
cout<<"which character do you want begin to copy?";
cin>>m;
if (strlen(str1)<m)
cout<<"input error!"<<endl;
else
{copystr(str1,str2,m);
cout<<"result:"<<str2<<endl;
}
return 0;
}
/*字符串部分复制函数*/
void copystr(char *p1,char *p2,int m)
{int n;
n=0;
while (n<m-1)
{n++;
p1++;
}
while (*p1!='\0')
{*p2=*p1;
p1++;
p2++;
}
*p2='\0';
}
6.8输入一行文字,找出其中大写字母小写字母空格数字其他字符各有多少
#include <iostream>
using namespace std;
int main()
{int upper=0,lower=0,digit=0,space=0,other=0,i=0;
char *p,s[20];
cout<<"input string:";
while ((s[i]=getchar())!='\n') i++;
p=&s[0];
while (*p!='\n')
{if (('A'<=*p) && (*p<='Z'))
++upper;
else if (('a'<=*p) && (*p<='z'))
++lower;
else if (*p==' ')
++space;
else if ((*p<='9') && (*p>='0'))
++digit;
else
++other;
p++;
}
cout<<"upper case:"<<upper<<endl<<"lower case:"<<lower<<endl;
cout<<"space:"<<space<<endl<<"digit:"<<digit<<endl<<"other:"<<other<<endl;
return 0;
}
6.9 3*3整型矩阵转置 (函数)
#include <iostream>
using namespace std;
int main()
{void move(int *);
int a[3][3],*p,i;
cout<<"input matrix:"<<endl;
for (i=0;i<3;i++)
cin>>a[i][0]>>a[i][1]>>a[i][2];
p=&a[0][0];
move(p);
cout<<"Now,matrix:"<<endl;
for (i=0;i<3;i++)
cout<<a[i][0]<<" "<<a[i][1]<<" "<<a[i][2]<<endl;
cout<<endl;
return 0;
}
void move(int *pointer)
{int i,j,t;
for (i=0;i<3;i++)
for (j=i;j<3;j++)
{t=*(pointer+3*i+j);
*(pointer+3*i+j)=*(pointer+3*j+i);
*(pointer+3*j+i)=t;
}
}
6.10 将一个5*5矩阵中最大的元素放在中心,四个角分别放四个最小号的元素(依次)
#include <iostream>
using namespace std;
int main()
{void change(int *p);
int a[5][5],*p,i,j;
cout<<"input matrix:"<<endl; //输入矩阵
for (i=0;i<5;i++)
for (j=0;j<5;j++)
cin>>a[i][j];
p=&a[0][0]; //使p指向0行0列元素
change(p); //调用函数,实现交换
cout<<"Now,matrix:"<<endl; //输出已交换的矩阵
for (i=0;i<5;i++)
{for (j=0;j<5;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
void change(int *p) //交换函数
{int i,j,temp;
int *pmax,*pmin;
pmax=p;
pmin=p;
//找最大值和最小值的地址,并赋给 pmax,pmin
for (i=0;i<5;i++)
for (j=i;j<5;j++)
{if (*pmax<*(p+5*i+j)) pmax=p+5*i+j;
if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;
}
temp=*(p+12); //将最大值与中心元素互换
*(p+12)=*pmax;
*pmax=temp;
temp=*p; //将最小值与左上角元素互换
*p=*pmin;
*pmin=temp;
pmin=p+1;
//将a[0][1]的地址赋给pmin,从该位置开始找最小的元素
for (i=0;i<5;i++) //找第二最小值的地址赋给 pmin
for (j=0;j<5;j++)
if (((p+5*i+j)!=p) && (*pmin > *(p+5*i+j)))
pmin=p+5*i+j;
temp=*pmin; //将第二最小值与右上角元素互换
*pmin=*(p+4);
*(p+4)=temp;
pmin=p+1;
for (i=0;i<5;i++) //找第三最小值的地址赋给pmin
for (j=0;j<5;j++)
if(((p+5*i+j)!=(p+4)) && ((p+5*i+j)!=p) &&(*pmin>*(p+5*i+j)))
pmin=p+5*i+j;
temp=*pmin; // 将第三最小值与左下角元素互换
*pmin=*(p+20);
*(p+20)=temp;
pmin=p+1;
for (i=0;i<5;i++) // 找第四最小值的地址赋给pmin */
for (j=0;j<5;j++)
if (((p+5*i+j)!=p) &&((p+5*i+j)!=(p+4)) && ((p+5*i+j)!=(p+20)) && (*pmin>*(p+5*i+j)))
pmin=p+5*i+j;
temp=*pmin; //将第四最小值与右下角元素互换
*pmin=*(p+24);
*(p+24)=temp;
}
6.11 在主函数中输入10个等长字符串,用另一函数排序。在主函数中输出
#include <iostream>
using namespace std;
int main()
{void sort(char (*p)[6]);
int i;
char str[10][6];
char (*p)[6];
cout<<"input 10 strings:"<<endl;
for (i=0;i<10;i++)
cin>>str[i];
p=str;
sort(p);
cout<<"Now,the sequence is:"<<endl;
for (i=0;i<10;i++)
cout<<str[i]<<endl;
return 0;
}
void sort(char (*s)[6])
{int i,j;
char temp[6],*t=temp;
for (i=0;i<9;i++)
for (j=0;j<9-i;j++)
if (strcmp(s[j],s[j+1])>0)
{strcpy(t,s[j]);
strcpy(s[j],s[+j+1]);
strcpy(s[j+1],t);
}
}
#include <iostream>
#include <string>
using namespace std;
int main()
{void sort(string *);
int i;
string str[10],*p=str;
cout<<"input 10 strings:"<<endl;
for (i=0;i<10;i++)
cin>>str[i];
sort(p);
cout<<"Now,the sequence is:"<<endl;
for (i=0;i<10;i++)
cout<<str[i]<<endl;
return 0;
}
void sort(string *s)
{int i,j;
string temp;
for (i=0;i<9;i++)
for (j=0;j<9-i;j++)
if (s[j]>s[j+1])
{temp=s[j];
s[j]=s[+j+1];
s[j+1]=temp;
}
}
6.12 字符串不等长
#include <iostream>
using namespace std;
int main()
{void sort(char *[]);
int i;
char *p[10],str[10][20];
for (i=0;i<10;i++)
p[i]=str[i]; //将第i个字符串的首地址赋予指针数组p的第i个元素
cout<<"input 10 strings:"<<endl;
for (i=0;i<10;i++)
cin>>p[i];
sort(p);
cout<<"Now,the sequence is:"<<endl;
for (i=0;i<10;i++)
cout<<p[i]<<endl;
return 0;
}
void sort(char *s[])
{int i,j;
char *temp;
for (i=0;i<9;i++)
for (j=0;j<9-i;j++)
if (strcmp(*(s+j),*(s+j+1))>0)
{temp=*(s+j);
*(s+j)=*(s+j+1);
*(s+j+1)=temp;
}
}
6.13 用矩形法求定积分的通用函数
#include <iostream>
#include <cmath>
using namespace std;
int main()
{float integral(float (*p)(float),float a,float b,int n);
float a1,b1,a2,b2,a3,b3,c,(*p)(float);
float fsin(float); // 对fsin函数作声明
float fcos(float); // 对fcos函数作声明
float fexp(float); // 对fexp函数作声明
int n=20;
cout<<"input a1,b1:"; //输入求sin(x)定积分的下限和上限
cin>>a1>>b1;
cout<<"input a2,b2:"; //输入求cos(x)定积分的下限和上限
cin>>a2>>b2;
cout<<"input a3,b3:"; //输入求 e^x 定积分的下限和上限
cin>>a3>>b3;
p=fsin;
c=integral(p,a1,b1,n); // 求出sin(x)的定积分
cout<<"The integral of sin(x) is :"<<c<<endl;
p=fcos;
c=integral(p,a2,b2,n); // 求出cos(x)的定积分
cout<<"The integral of cos(x) is :"<<c<<endl;;
p=fexp;
c=integral(p,a3,b3,n); // 求出 的定积分
cout<<"The integral of exp(x) is :"<<c<<endl;
return 0;
}
float integral(float (*p)(float),float a,float b,int n)
//用矩形法求定积分的通用函数
{int i;
float x,h,s;
h=(b-a)/n;
x=a;
s=0;
for (i=1;i<=n;i++)
{x=x+h;
s=s+(*p)(x)*h;
}
return(s);
}
float fsin(float x) // 计算sin(x) 的函数
{return sin(x);}
float fcos(float x) // 计算cos(x) 的函数
{return cos(x);}
float fexp(float x) // 计算exp(x)的函数
{return exp(x);}
6.14将n个数按输入时逆序排列
#include <iostream>
using namespace std;
int main()
{ void sort (char *p,int m);
int i,n;
char *p,num[20];
cout<<"input n:";
cin>>n;
cout<<"please input these numbers:"<<endl;
for (i=0;i<n;i++)
cin>>num[i];
p=&num[0];
sort(p,n);
cout<<"Now,the sequence is:"<<endl;
for (i=0;i<n;i++)
cout<<num[i]<<" ";
cout<<endl;
return 0;
}
void sort (char *p,int m)// 将n个数逆序排列
{int i;
char temp, *p1,*p2;
for (i=0;i<m/2;i++)
{p1=p+i;
p2=p+(m-1-i);
temp=*p1;
*p1=*p2;
*p2=temp;
}
}
6.15 有一个班4个学生,5门课。
求第一门课的平均分
找出两门以上课程不及格的学生,输出学号全部成绩平均成绩
找出平均成绩在90以上或全部成绩85以上的学生
#include <iostream>
using namespace std;
int main()
{void avsco(float *,float *);
void avcour1(char (*)[10],float *);
void fail2(char course[5][10],int num[],float *pscore,float aver[4]);
void good(char course[5][10],int num[4],float *pscore,float aver[4]);
int i,j,*pnum,num[4];
float score[4][5],aver[4],*pscore,*paver;
char course[5][10],(*pcourse)[10];
cout<<"input course:"<<endl;
pcourse=course;
for (i=0;i<5;i++)
cin>>course[i];
cout<<"input NO. and scores:"<<endl;
cout<<"NO.";
for (i=0;i<5;i++)
cout<<","<<course[i];
cout<<endl;
pscore=&score[0][0];
pnum=&num[0];
for (i=0;i<4;i++)
{cin>>*(pnum+i);
for (j=0;j<5;j++)
cin>>*(pscore+5*i+j);
}
paver=&aver[0];
cout<<endl<<endl;
avsco(pscore,paver); // 求出每个学生的平均成绩
avcour1(pcourse,pscore); // 求出第一门课的平均成绩
cout<<endl<<endl;
fail2(pcourse,pnum,pscore,paver); // 找出两门课不及格的学生
cout<<endl<<endl;
good(pcourse,pnum,pscore,paver); // 找出成绩好的学生
return 0;
}
// 求每个学生的平均成绩
void avsco(float *pscore,float *paver)
{int i,j;
float sum,average;
for (i=0;i<4;i++)
{sum=0.0;
for (j=0;j<5;j++)
sum=sum+(*(pscore+5*i+j)); //累计每个学生的各科成绩
average=sum/5; //计算平均成绩
*(paver+i)=average;
}
}
// 求第一课程的平均成绩
void avcour1(char (*pcourse)[10],float *pscore)
{int i;
float sum,average1;
sum=0.0;
for (i=0;i<4;i++)
sum=sum+(*(pscore+5*i)); //累计每个学生的得分
average1=sum/4; //计算平均成绩
cout<<"course 1: "<<*pcourse<<",average score:"<<average1<<endl;
}
// 找两门以上课程不及格的学生的函数
void fail2(char course[5][10],int num[],float *pscore,float aver[4])
{int i,j,k,labe1;
cout<<" ==========Student who failed in two courses ======= "<<endl;
cout<<"NO. ";
for (i=0;i<5;i++)
cout<<course[i]<<" ";
cout<<" average"<<endl;
for (i=0;i<4;i++)
{labe1=0;
for (j=0;j<5;j++)
if (*(pscore+5*i+j)<60.0) labe1++;
if (labe1>=2)
{cout<<num[i]<<" ";
for (k=0;k<5;k++)
cout<<*(pscore+5*i+k)<<" ";
cout<<" "<<aver[i]<<endl;
}
}
}
// 找成绩优秀学生(全部课程成绩在85分以上或平均成绩在90分以上)的函数
void good(char course[5][10],int num[4],float *pscore,float aver[4])
{int i,j,k,n;
cout<<" ======Students whose score is good======"<<endl;
cout<<"NO. ";
for (i=0;i<5;i++)
cout<<course[i]<<" ";
cout<<" average"<<endl;
for (i=0;i<4;i++)
{n=0;
for (j=0;j<5;j++)
if (*(pscore+5*i+j)>85.0) n++;
if ((n==5)||(aver[i]>=90))
{cout<<num[i]<<" ";
for (k=0;k<5;k++)
cout<<*(pscore+5*i+k)<<" ";
cout<<" "<<aver[i]<<endl;
}
}
}
6.16 输入一个字符串,将其中连续的数字作为一个整数,依次存放到数组a中,统计共有多少个整数,并输出这些数
#include <iostream>
using namespace std;
int main()
{char str[50],*pstr;
int i,j,k,m,e10,digit,ndigit,a[10],*pa;
cout<<"input a string:"<<endl;
gets(str);
cout<<endl;
pstr=&str[0]; //字符指针pstr指向数组str首元素
pa=&a[0]; //指针pa指向a数组首元素
ndigit=0; //ndigit代表有多少个整数
i=0; //i代表字符串中的第几个字符
j=0; //j代表连续数字的位数
while(*(pstr+i)!='\0')
{if((*(pstr+i)>='0') && (*(pstr+i)<='9'))
j++;
else
{if (j>0)
{digit=*(pstr+i-1)-48; //将个数位赋予digit
k=1;
while (k<j) //将含有两位以上数的其它位的数值累计于digit
{e10=1;
for (m=1;m<=k;m++)
e10=e10*10; //e10代表该位数所应乘的因子
digit=digit+(*(pstr+i-1-k)-48)*e10; //将该位数的数值累加于digit
k++; //位数k自增
}
*pa=digit; //将数值放在数组a中
ndigit++;
pa++; //指针pa指向a数组下一元素
j=0;
}
}
i++;
}
if (j>0) //以数字结尾字符串的最后一个数据
{digit=*(pstr+i-1)-48; //将个数位赋予digit
k=1;
while (k<j) // 将含有两位以上数的其它位的数值累加于digit
{e10=1;
for (m=1;m<=k;m++)
e10=e10*10; //e10代表位数所应乘的因子
digit=digit+(*(pstr+i-1-k)-48)*e10; //将该位数的数值累加于digit
k++; /*位数K自增*/
}
*pa=digit; //将数值放到数组a中
ndigit++;
j=0;
}
printf("There are %d numbers in this line. They are:\n",ndigit);
j=0;
pa=&a[0];
for (j=0;j<ndigit;j++) //打印数据
cout<<*(pa+j)<<endl;
cout<<endl;
return 0;
}
6.17 实现两个字符串的比较
#include <iostream>
using namespace std;
int main()
{int strcmp(char *p1,char *p2);
int m;
char str1[20],str2[20],*p1,*p2;
cout<<"input two strings:"<<endl;
cin>>str1;
cin>>str2;
p1=&str1[0];
p2=&str2[0];
m=strcmp(p1,p2);
cout<<"result:"<<m<<endl;
return 0;
}
int strcmp(char *p1,char *p2) // 字符串比较函数
{int i;
i=0;
while(*(p1+i)==*(p2+i))
if (*(p1+i++)=='\0') return(0); //全部字符相同时返回结果0
return(*(p1+i)-*(p2+i)); //不相同时返回结果为第一对不相同字符的ASCII码的差值
}
6.18 输入月份号,输出英文月名,用指针数组处理
#include <iostream>
using namespace std;
int main()
{char *month_name[13]={"illegal month","January",
"February","March","April","May","June","July","August",
"September","October", "November","December"};
int n;
cout<<"input month:"<<endl;
cin>>n;
if (((n>=1) && n<=12))
cout<<"It is "<<*(month_name+n)<<endl;
else
cout<<"It is wrong"<<endl;
return 0;
}
6.19 用指向指针的指针的方法对5个字符串排序并输出
#include <iostream>
using namespace std;
int main()
{void sort(char **p);
const int m=20; //定义字符串的最大长度
int i;
char **p,*pstr[5],str[5][m];
for (i=0;i<5;i++)
/*将第i个字符串的首地址赋予指针数组 pstr 的第i个元素*/
pstr[i]=str[i];
cout<<"input 5 strings:"<<endl;
for (i=0;i<5;i++)
cin>>pstr[i];
p=pstr;
sort(p);
cout<<"strings sorted:"<<endl;
for (i=0;i<5;i++)
cout<<pstr[i]<<endl;
return 0;
}
void sort(char **p) //冒泡法对5个字符串排序函数
{int i,j;
char *temp;
for (i=0;i<5;i++)
{for (j=i+1;j<5;j++)
{if (strcmp(*(p+i),*(p+j))>0) //比较后交换字符串地址
{temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
}
}
}
6.20用指向指针的指针的方法对n个整数排序并输出(排序单独写成函数)
#include <iostream>
using namespace std;
int main()
{void sort(int **p,int n);
int i,n,data[10],**p,*pstr[10];
cout<<"input n:";
cin>>n;
for (i=0;i<n;i++)
/*将第i个整数的地址赋予指针数组 pstr 的第i个元素*/
pstr[i]=&data[i];
cout<<"input "<<n<<" integer numbers:"<<endl;
for (i=0;i<n;i++)
cin>>*pstr[i];
p=pstr;
sort(p,n);
cout<<"Now,the sequence is:"<<endl;
for (i=0;i<n;i++)
cout<<*pstr[i]<<" ";
cout<<endl;
return 0;
}
void sort(int **p,int n)
{int i,j,*temp;
for (i=0;i<n-1;i++)
{for (j=i+1;j<n;j++)
{if (**(p+i)>**(p+j)) //比较后交换整数地址
{temp=*(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
}
}
}
}
int *p :一级指针,表示p所指向的地址里面存放的是一个int类型的值
int **p :二级指针,表示p所指向的地址里面存放的是一个指向int类型的指针(即p指向的地址里面存放的是一个指向int的一级指针)
例如:
int i=10; //定义了一个整型变量
int *p=&i; //定义了一个指针指向这个变量
int **p1=&p; //定义了一个二级指针指向p指针
那么取出10的值方式为:
printf(“i=[%d]\n”,*p);
printf(“i=[%d]\n”,**p1);
就突然开始 学不会 觉得很充实