zoukankan      html  css  js  c++  java
  • C语言第六次作业--数据类型

    一、PTA实验作业

    题目1,简单计算器:

    1. 本题PTA提交列表

    2. 设计思路

    定义操作数num1,num2,结果result=0.运算符ch。
    输入num1
    while (ch=getchar())!='='
       输入num2
       switch(ch)
           + 运算 result=num1+num2 break
           - 运算 result=num1-num2 break
           * 运算 result=num1*num2 break
           / if num2==0,输出错误   break
             else 运算 result=num1/num2  break
           default 输出错误  break
       num1=result 再下一次循环
    输出num1
    

    3.代码截图

    4.本题调试过程碰到问题及PTA提交列表情况说明。

    1. 部分正确 :讨论ch等于'/'及非法符号时答案错误
    错误代码:

    case '/':                                  //当运算符为'/'时分出数位0的特殊情况 
     if(num2==0){
       printf("ERROR
    ");//若分母为0,输出错误 ,并跳出循环 
       break;
    }
    else{
       result=num1/num2;break; //否则正常运算 
    default:  printf("ERROR
    ");   break;		//除以上情况全部输出错误 
    
    • 调试过程:
      • 测试除数为0:

    我发现:当switch判断到是'/'号并且除数为0时,尽管已经输出错误信息“ERROR,但break只能结束上面的while循环,循环外面的输出num1的语句还是会执行,导致答案错误。

    - 测试非法符号:
    

    我发现:和上面那个是一样的,当输出错误信息“ERROR后,程序还在继续执行,并没有要停止导致答案错误。

    • 解决办法:意识到需要在输出错误信息后结束程序,我去百度怎样提前结束程序,将两个break都改成return 0就解决了这两个错误。而且我发现在switch语句中再加if语句时DEV它会自动在if语句内加上break.

    2. 部分正确 :最小表达式错误,即只有一个操作数并无运算的情况。

    错误代码:

        	num1=result;//把每一次的结果放入num1中进行下一次的运算 
    	}
    	printf("%d",result);  //输出结果 
        return 0;  
    
    • 调试过程:

      即当没有运算符时,程序不会进入进入while循环,导致输出result时结果为result的初始值0.

    • 解决办法:本来想在循环再加一句将num1的值赋给result的语句,后来想到既然num1里每次都存放着result来进入每一次的运算,那么结束时直接输出num1也是一样的效果。

    3. 本题小结
    return语句作用:

    return 0放在main函数里头的中间,程序就提前结束不执行往后的代码了;
    return语句在函数中的功能就是退出当前函数并提供一个返回值,函数被终止了,后面的语句就不会被执行了;
    如果主函数的类型是 int main(){},那么就需要 return 0;
    如果主函数的类型是 void main(){},那么就不需要返回值 ;
    上面的情况同样也适用于自定义的函数,但是自定义函数是返回一个具体变量或值。

    -- 引用自百度知道

    同时也搞清楚break的作用范围:

    break语句的调用,起到跳出循环或者分支语句作用。
    也就是说,break只有两种使用环境:
    1 用于循环体内,包括for, while和do-while循环,作用为跳出break所在循环体。注意,如果是循环嵌套,而break出现在内层,那么只能跳出内层循环,无法跳出外层循环。
    2 用于开关语句,即switch - case语句,起到跳出开关语句作用。用于switch嵌套时,与上述循环嵌套效果相同,只可以跳出所在开关语句。

    -- 引用自百度知道

    题目2:判断合法标识符

    1. 本题PTA提交列表

    2. 设计思路

    主函数:
    定义数组a[80].i循环变量,repeat次数。
    输入repeat
    for i=1 to i<=repeat
    共repeat次
       gets()读入一行字符串。
       调用all(a) if 返回值为1 输出YES
                  else 输出NO
    
    int all(char a[ ])自定义判断函数:
    定义m循环变量
    if (a[0] !(下划线,字母)) 返回0
    else
       for i=1 to a[i]!='00'
          if (a[i] !(下划线,字母,数字) 返回0
       i++
       直到a[i]='00' 返回1
    

    3.代码截图:

    4.本题调试过程碰到问题及PTA提交列表情况说明。

    1. 运行超时:刚开始没用数组,感觉是因为这个导致没在规定时间内运行结束,所以后面使用了数组。
    2. 答案错误:其实这题兜兜转转用了好多种方法,最后我使用了数组与函数结合的方法解决,这里面最复杂的问题是讨论遇到空格时的情况。

    • 调试过程:

    错误原因:当我输入有空格的字符时,它进入函数直到读到空格时返回0,输出了No,但是它下一次读入的是空格后的字符。

    解决办法:当得知是%s的问题以后,我去百度查资料怎样解决%s遇空格结束的问题,所以我将字符串的读取改为gets(),解决了这个问题。

    用scanf只能录入连续的字符串,遇到空格就结束,如果你要把空格也吞了,推荐用gets()就可把接收带空格的字符串,它遇回车才结束的。

    题目3:打印菱形图案

    1. 本题PTA提交列表

    2. 设计思路

    定义n,i放循环变量,space放空格,xing放*
    for i=1 to n/2+1 
    上半部分
        for space=1 to space<=n/2+1-i 
           输出空格。space++,end
        for xing=1 to xing<=2i-1
           输出*空格。xing++,end
    换行i++,end
    
    for i=1 to i<=n/2
    下半部分
        for space=1 to space<=i
           输出空格。space++,end
        for xing=1 to xing<=n-2i
           输出*空格。xing++,end
    换行i++,end
    

    3.代码截图:

    4.本题调试过程碰到问题及PTA提交列表情况说明。

    1. 部分正确 :图形不对称,只关注到星号后面要有空格,忽略了前面的空格并不是以一个为单位输出的

    • 调试过程:

    解决办法:将每次输出的空格改成两个空格。

    二、截图本周题目集的PTA最后排名。

    三、本周学习总结(3分)

    1.你学会了什么?

    1.1 一维数组如何定义、初始化?

    • 定义:确定数组变量名,数组元素的类型,数组大小。
    类型名  数组名  [数组长度];
    

    • 初始化:
    类型名  数组名[数组长度] = {初值表};
    

    1.2 一维数组在内存中结构?可画图说明。数组名表示什么?

    • 数组名是一个地址常量,存放数组内存空间的首地址。

    1.3 为什么用数组?

    • 数组是一组相同类型数据的有序集合,并且元素在其内存中连续存放。它的表达简洁,可读性好,便于使用循环结构。

    1.4 介绍选择法、冒泡法、直接插入排序如何排序?伪代码展示.

    • 选择排序法:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾(目前已被排序的序列)。以此类推,直到所有元素均排序完毕.
    1.定义循环变量i,j和总个数n,以及中间量k,temp.数组a[n]
    2.进入for(i = 0; i < n-1; i++)控制循环次数,n个数需要n-1次循环。
    3.k赋值为i,在进入内循环for (j=i+1; j < n; j++) ,循环内判断a[j] < a[k],若是则赋值k等于j.
    4.重复第3步,直到j=n.
    5.若k != i,temp赋值为a[k],a[k]赋值为a[i],a[i]赋值为temp,来交换a[k],a[i]的值。
    6.重复第2步,直到i=n-1,结束循环。
    
    • 冒泡排序法:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
    1.定义循环变量i,j,总个数n和数组a[n].中间量temp
    2.进入for(i=0;i<10-1;i++)控制循环次数,n个数需要n-1次循环。
    3.在进入内循环for(j=0;j<9-i;j++)每次比较n-i次,if判断a[j]>a[j+1],若为真,temp赋值为a[j],a[j]赋值为a[j+1],a[j+1]赋值为temp,来交换a[j],a[j+1]的值。
    4.重复第3步,直到j=9-i.结束内循环。
    5.重复第2步,直到i=10-i.结束循环输出数组内的数
    
    • 直接插入排序:从序列中第二个数开始,插入前面已经排好的序列中,形成一个新的排序好的序列,以此类推到最后一个元素。
    1.从第一个元素开始,temp=a[i],i为循环变量表示不断往后取数,并赋值给temp
    2.取出下一个元素,在已经排序的元素序列中从后向前判断,并利用j==1标记它的初始位置 
    3.找到新元素小于已排序的元素,即temp<a[j-1],就将已排序的该元素移到下一位置 ,将新元素插进去,j--
    4.重复步骤3,直到找到新元素大于或者等于已排序的元素的位置,即temp>=a[j-1] 
    5.将新元素插入到该位置中,将a[j-1]的值赋给a[j],将temp的值赋给a[j] 
    6.重复步骤2,直至将所有数据取完
    

    1.5 介绍什么是二分查找法?它和顺序查找法区别?

    • 二分查找法:取中间元素与查找元素进行比较,如果查找元素比中间元素大,则在中间元素右边查找,如果查找元素比中间元素小,则在中间元素的左边查找。
    • 顺序查找法:从表的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
    • 二分法的优点是比较次数少,查找速度快,平均性能好。缺点是要求查表为顺序表,插入、删除困难。

    1.6 二维数组如何定义、初始化?

    • 定义:
    类型名  数组名  [行长度]  [列长度];
    
    • 初始化:
      • 分行赋初值:
    类型名  数组名  [行长度]  [列长度] = {  {初值表0},······,{初值表k},······};
    
    • 顺序赋初值
    类型名  数组名  [行长度]  [列长度] = {初值表};
    

    1.7 矩阵转置怎么实现?

    int main()  
    {  
            int i, j, b[3][3];  
            int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};  
            printf("矩阵原型:
    ");  
            for(i = 0; i < 3; i++)  
            {  
                for(j = 0; j < 3; j++)  
                {  
                    b[j][i] = a[i][j];  
                    printf("%d ", a[i][j]);  
                }  
                printf("
    ");  
            }  
            printf("
    ");  
            printf("矩阵转置后:
    ");  
            for(i = 0; i < 3; i++)  
            {  
                    for(j = 0; j < 3; j++)  
                    {  
                        printf("%d ", b[i][j]);  
                    }  
                    printf("
    ");  
            }  
            getchar();  
            return 0;  
    }  
    

    1.8 二维数组一般应用在哪里?

    与矩阵有关的运算

    2.本周的内容,你还不会什么?

    详细罗列不明白地方,包括课堂派错题、PTA错题。

    • 课堂派:


    D选项错误:初始化列表的元素数目超过数组长度
    B选项中x是输出16进制的标识

    • 期中考:

    1.static有什么作用

    一、定义全局静态变量 :在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点:

    (1)在全局数据区内分配内存

    (2) 如果没有初始化,其默认值为0

    (3)该变量在本文件内从定义开始到文件结束可见

    二、定义局部静态变量:在局部静态变量前面加上关键字static,该局部变量便成了静态局部变量。静态局部变量有以下特点:

    (1)该变量在全局数据区分配内存

    (2) 如果不显示初始化,那么将被隐式初始化为0

    (3) 它始终驻留在全局数据区,直到程序运行结束

    (4)其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

  • 相关阅读:
    设计模式系列
    Python3 系列之 可变参数和关键字参数
    设计模式系列
    【HANA系列】SAP HANA ODBC error due to mismatch of version
    【FICO系列】SAP FICO FS00修改科目为未清项目管理
    【FIORI系列】SAP OpenUI5 (SAPUI5) js框架简单介绍
    【HANA系列】SAP HANA SQL获取当前日期加若干天后的日期
    【HANA系列】SAP HANA SQL获取本周的周一
    【HANA系列】SAP HANA SQL获取当前日期
    【HANA系列】SAP HANA SQL获取当前日期最后一天
  • 原文地址:https://www.cnblogs.com/lmb171004/p/7872640.html
Copyright © 2011-2022 走看看