指针是C的灵魂 1.没学指针以前用数组比较多,调用函数时直接把整个数组传过去,可是这样对性能影响比较大,学了指针直接传地址就能够了。 2.指针还能够实现子函数返回多个值;还能够利用指针能够实现动态内存分配。 3.指针直接对内存操做 ,效率高,指针还用于表示和实现各类复杂的结构,从而为编写出更加高质量的程序奠基基础。 4.可是指针编写的程序也更容易隐含各式各样的错误,一不当心就有可能引发程序崩溃。
PTA总分:110 分
给定一句英语,要求你编写程序,将句中全部单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,
其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每一个测试用例的输出占一行,输出倒序后的句子,而且保证单词间只有1个空格。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello算法
void strput(char *str) 定义输出函数 定义静态变量flag=0 定义字符指针temp = strchr(str,' ') //寻找空格地址 if temp 等于 NULL then if strlen(str)不为0 then //str长度为零不输出 flag=1; //若是字符串长度不为零 flag=1 输出str end if else strput(temp + 1) //递归 *temp = '\0' //把空格改成\0 if strlen(str)不为0而且flag等于1 then //若是字符串为0不输出 并根据flag的值选输出方式 输出" str" else 输出str end if end if 主函数 定义字符数组 str[500011] gets(str) //读取字符数组 strput(str) //调用输出函数
声明全局变量 n //n与难度有关 void CreateExp(int *result) { srand(time(NULL)) //随机种子 int ret //中转变量 char tistr[40]={0} //放式子 int num1,num2,num3 //放随机数 char ch1,ch2 //放运算符 随机数num1生成 //第一个数 itoa(num1, tistr, 10)//把num1接到tistr 运算符生成ret switch(ret) { case 0:ch1='+';break; case 1:ch1='-';break; case 2:ch1='*'; if(n==1000) ch1='+'; //为了给小学生减小压力,第三级没有乘除 break; case 3:ch1='/'; if(n==1000) ch1='-'; //为了给小学生减小压力,第三级没有乘除 break; } tistr[strlen(tistr)]=ch1; //放运算符 do { num2=rand()%n; //第二个数 if(num2!=0&&ch1=='/'&&num1!=0) //对除法作处理 (至关于第二个函数) { if(((num1%num2)!=0||num1<num2)) { num2=0; } } } while(num2==0); 而后重复生成 *(tistr+strlen(tistr))='=' *(tistr+strlen(tistr))=0 //式子生成结束 输出tistr } //结束函数
void ComputeExp(char *tistr,int *result) { 定义整型 num[3]={0} j=0 i 定义字符 ch1 ch2 for i=0 直到 tistr[i] 等于 '=' i++ //把放运算式子的字符串解开 { if tistr[i]>='0'&&tistr[i]<='9' then num[j]=tistr[i]-'0'+num[j]*10 //数字放到num数组 else then if(j==0) ch1=tistr[i]; //运算符放到 ch1 ,ch2 if(j==1) ch2=tistr[i]; j++; end if } end for switch(ch1) //对运算符进行判断 { case '+':*result=num1+num2;break; //进行对应的计算 case '-':*result=num1-num2;break; case '*':*result=num1*num2;break; case '/':*result=num1/num2;break; } switch(ch2) //解决优先级问题 (枚举) { case '+':*result=*result+num3;break; case '-':*result=*result-num3;break; case '*': if(ch1=='+') *result=num1+num2*num3; if(ch1=='-') *result=num1-num2*num3; if(ch1=='*') *result=*result*num3; if(ch1=='/') *result=*result*num3;break; //若是第一步是加或减,第二步的乘或除要先算 case '/': if(ch1=='+') *result=num1+num2/num3; if(ch1=='-') *result=num1-num2/num3; if(ch1=='*') *result=*result/num3; if(ch1=='/') *result=*result/num3; break; }
1.传的参数少了不用返回值; 2.处理除数更全面。 3.以前都是一个函数,封装以后更加容易理解,整个结构更加灵活。
1.包装后各个函数的干扰减小,代码结构也更加清晰,移值性强。 2.经过找百度学会了用箭头来选择,布局也更加协调。 3.以前我是不怎么细分函数的,就是以为比较方便,写起来也快,而后听取老师建议分装,而后发现分装好的函数没有以前这么绕,什么函数什么功能一目了然,对于写代码的人,找错只需盯一小函数,而不是一片代码,还要一条条理清楚,对于读代码的人,就是不用本身推理代码的功能,一个函数一个功能,条理清晰。(很差的习惯尽可能纠正,毕竟一个大项目不可能一我的完成,团队合做对代码的分装要求就比较高了) * 最后上几个截图