zoukankan      html  css  js  c++  java
  • C语言博客05--指针

    1.本章学习总结(2分)

    1.1 思维导图

    1.2 本章学习体会及代码量学习体会

    1.2.1 学习体会

    本周学习了指针,都说指针是C语言的灵魂,也是C语言区别于其他语言所独特的地方,学好指针的相关内容十分必要,但同时难度也更大,需要付出更多的时间去理解和熟练掌握。学习到指针部分之后明显感觉有点吃力,虽然也和前面的知识结合紧密,但是需要对指针的概念搞得很清楚,不然就会把地址和该地址所存的内容搞混。然后指针上完之后老师又教了结构体和文件相关的内容,真的要认真学习多花时间才能完全理解掌握。目前的自己觉得还是一直半解,蛮吃力的。
    在数据传递时,如果数据块较大,这时就可以使用指针传递地址而不是实际数据,即提高传输速度,又节省大量内存。
    指针为动态数据结构(如二叉树、链表)提供支持
    

    1.2.2 代码累计

    2.PTA总分(2分)

    2.1截图PTA中函数题目集的排名得分

    3.PTA实验作业(1分)

    3.1 PTA题目1

    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
    

    33.1.1 算法分析

    int main()
    {
    定义字符数组 str[500010];
    输入gets(str);
    定义长度变量len;
    len=strlen(str);
    定义i,j,count=0;
    定义flag=0;
    for i=len-1 to i>=0 do
        if  str[i]!=' '  then
        count++;//计算字符数  
        end if
        else if str[i]==' '&&count!=0  then
            for  j=i+1 to str[j]!=' '&&str[j]!=0  do
            输出字符
            end for
            for  j=i  to  j>=0  do
    	if  str[j]!=' ' then
    	break;
            end if
    	if  j==0  then
    	flag=1; 
    	end if//遍历后面是否还有字符 
    	if  flag==0  then
    	输出空格
    	count=0; 
    	end if
            end  for
    end  for
    for i=0  to i<count&&str[i]!=' '  do
    输出字符//由于最后一个单词末尾可能没有空格,所以单独考虑
    	
    	return 0;
     } 
    

    3.1.2 代码截图

    3.1.4 PTA提交列表及说明

    • Q1:开始有一个测试点最小值,前面有空格过不去
    • A1:后来发现若第一个单词后面有空格,输出也会带空格,出现格式错误,所以定义一个flag,并判断后面是否还有字符,若有字符则输出一个空格,没有字符即到了最后一个单词的输出,就不输出空格
    • Q2:
    • A2:其实开始时的代码写的比较复杂,然后最后一个测试点一直过不去,也没有找出解决办法,可能是输出出了问题?

    4.大作业(5分)

    题目:实现小学四则运算。

    在函数那章,我们已经实现小学四则运算这份作业,现在要求大家把之前设计函数升级改造,原来的函数大家都是用全局变量实现不同函数参数传递,这次作业要求改地址传递,减少全局变量的使用。
    

    4.1.改造函数介绍

    1.函数1

    伪代码
    int main()
    {
    	定义字符数组 exp[100]={0}; 
    	定义整型变量 level,amount,right;
    	定义浮点型变量 accuracy;
    	定义整型变量 youranswer=0,myanswer=0;
    	输出menu---------------------------简单四则运算训练系统------------------------------
                       欢迎进入训练
     
    	等级1:1位数的一步加减乘除计算训练
    等级2:2位数的2步加减运算
    等级3:3位数的2步加减运算
    请选择等级:             
    	输入level
    	while level!=1&&level!=2&&level!=3  
    	    fflush(stdin);//输入非法字符时清除缓冲区数据重新输入
        	    输出 输入错误,请重新输入
    
    	    输入level 
                    end while   
    	输入  请输入题目数量:   
                   while  !scanf("%d",&amount)  //判断是否输入非法字符
    	fflush(stdin);
        	输出 输入错误,请重新输入
    
                    end while
                   定义整型变量 n;
                   定义 flag=0;
                   for  n=0  to  n<amount&&flag==0  do
    		CreateExp(exp,level);  //建造题目
    		输入 youranswer 
    		myanswer=Answer(exp,level);
    		Judge(youranswer,myanswer);
    		输出  输入0继续,若退出输入1:
    		输入 flag 
    		while  flag!=0&&flag!=1
    		fflush(stdin);
    		输出  输入错误,请重新输入
    		输入 flag 
    		end while
    		if  flag==1 then  break;
    	end for 	
    	right=Judge(youranswer,myanswer);
    	accuracy=right*1.0/amount;
    	输出   正确率为%.2lf",accuracy
    	return 0;
    }
    


    2.函数2

    伪代码
    void CreateExp(char *exp,int level)                                                                  
    { 
        srand(time(NULL)); 
        定义整型变量 x,y,z;
        定义整型变量 ch1,ch2;
        if  level==1 then
    	ch1=rand()%4;
        else
    	ch1=rand()%2;
    	ch2=rand()%2;
        end if//生成运算符 
        switch(level)
        {
            case 1:
            	x=rand()%10;y=rand()%10;
    	itoa(x,exp,10); 将变量x的数据类型转为字符型
    	switch(ch1)
    		case 0:strcat(exp,"+");break;
    		case 1:strcat(exp,"-");break;
    		case 2:strcat(exp,"*");break;
    		case 3:strcat(exp,"/");break;
                    end switch
    	 strcat(exp,itoa(y,exp+3,10));
    	break;//一级
           case 2:
    	x=rand()%100;y=rand()%100;z=rand()%100;
    	itoa(x,exp,10);
    	switch(ch1)
    		case 0:strcat(exp,"+");break;
    		case 1:strcat(exp,"-");break;
                     end switch
    	 strcat(exp,itoa(y,exp+4,10));
    	 switch(ch2)
    		case 0:strcat(exp,"+");break;
    		case 1:strcat(exp,"-");break;
                    end switch
    	strcat(exp,itoa(z,exp+7,10));
    	 break;//二级 
           case 3:
    	x=rand()%1000;y=rand()%1000;z=rand()%1000;
    	itoa(x,exp,10);
    	switch(ch1)
    		case 0:strcat(exp,"+");break;
    		case 1:strcat(exp,"-");break;
                     end switch
    	 strcat(exp,itoa(y,exp+5,10));
    	 switch(ch2)
    		case 0:strcat(exp,"+");break;
    		case 1:strcat(exp,"-");break;
                    end switch
    	strcat(exp,itoa(z,exp+9,10));	
    	break;	//三级      
    end  switch
        strcat(exp,"=");
        puts(exp); 
    //生成exp
    


    构建表达式函数经老师指点后修改

    • 这样明显简便很多,之前的方法一直调用函数strcat和itoa函数,代码质量不高,效率很低

    3.函数3

    伪代码
    int Answer(char *exp,int level)
    {
    	定义整型变量 answer;
    	answer=*exp-'0';//将字符型转为整型
    	定义i;
    	for i=0  to  *(exp+i)!=0
    		if  *(exp+i)=='+'||*(exp+i)=='-'||*(exp+i)=='*'||*(exp+i)=='/'  then
    		    switch(*(exp+i))
    			    case '+':answer=add(answer,*(exp+i+1)-'0');break;
    			    case '-':answer=sub(answer,*(exp+i+1-'0'));break;
    			    case '*':answer=mul(answer,*(exp+i+1)-'0');break;
    			    case '/':answer=divide(answer,*(exp+i+1)-'0');break;
    		    end switch	
    		end if
                    end for	
    	return answer;
    int Judge(int youranswer,int myanswer)
    {
    	定义整型变量 right=0;
    	if  youranswer==myanswer  then
    		printf("答案正确!
    ");
    		right++;
    	else
    	               printf("答案错误,正确答案为%d
    ",myanswer);
    	end if
    	return right;
    }
    

    4.3 与原有函数代码比较

    函数1

    原函数

    原来的main函数实在是太太太长了,这里就不放上来了,总体就是不简练,没有分割不同功能的函数,而一味的都写在main函数中

    函数2


    原来只有四个简单的加减乘除函数,没有其他多余的函数分装

    • 不同: 原来的main函数中内容太多了,看起来有点乱,需要花费更多时间去分割每部分语句的功能,改造后main函数中只保留了主菜单部分,并且写了构建表达式,计算答案,判断正误三个函数。
    • 优点:main函数中没有太多的语句,只有主要功能的语句,这样程序看起来思路清晰很多。使用多个函数将功能分开,大大加强了程序的拓展性,对于以后对程序的进一步修改和增加功能非常有帮助。
    • 缺点:功能还有待完善,对于非法字符的处理可能也还有其他更好的方法。

    4.4 改进大作业总结:

    这次大作业主要就是加强了自己对于函数分装还有指针的运用,刚开始的方法虽然定义了指针但是感觉并没有完全用上,后来老师指导和参考同学的以后修改了,算是真正有用上指针了,这次的主要感受就是要加强自己在指针运用方法的练习,以及对于你想写怎么的程序有一个大致的规划,这对于后续的函数分装和程序的拓展性怎样非常重要,然后就是,继续加油吧~
  • 相关阅读:
    jQuery的end() 方法
    jQuery.extend 函数使用详解
    AutoMapper完成Dto与Model的转换
    IoC实践--用Unity实现MVC5.0的IoC控制反转方法
    IoC实践--用Autofac实现MVC5.0的IoC控制反转方法
    Unity依赖注入使用详解
    React+BootStrap+ASP.NET MVC实现自适应和组件的复用
    oracle基础开发工具及常用命令
    Cisco配置发送日志到日志服务器
    Redis讲解
  • 原文地址:https://www.cnblogs.com/zyxaa/p/10127069.html
Copyright © 2011-2022 走看看