C语言博客作业--数据类型

一、PTA实验作业

题目1:打印菱形图案

1. 本题PTA提交列表

2. 设计思路

定义整型变量n存放输入总行数,i控制部分行数,j控制空格数量,k控制'*'数量,half存放中间行数,划分上下部分
输入一个奇数n
half=(n+1)/2;//half存放中间行数,用来划分上下部分 
如果(n!=1)
   上半部分:
         i=1;i<=half;i++
                j=n-2*i+1;j>=1;j--,输出空格
                     k=1;k<=2*i-1;k++,输出‘*’
                      换行
   下半部分:
          i=1;i<=(n-1)/2;i++ 
               j=1;j<=2*i;j++,输出空格
                   k=n-2*i;k>=1;k--),输出‘*’
                 如果(i!=(n-1)/2)则换行,最后一行不再换行
否则 输出"* "

3.代码截图

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

部分正确:这题上半部分规律很快就找到图形也输出正确了,但是下半部分调试了好久才做出来。比照了上次做的那道不完全相同的菱形题,但是上次那题的下半部分也没有完全理解清楚,一直找不到下半部分空格数和行数的规律。想接着上面的行数按对称找规律结果一直输出成,后来下半部分i从1开始结果输出成

少了一个空格,j改成从1开始答案对。

题目2:掉入陷阱的数字

1. 本题PTA提交列表

2. 设计思路

定义变量one存放个位数的数值,N为输入数据,sum为各位数之和,a存放前一个数,i存放第几个数,number存放运算后结果
输入N
i=1;i!=0;i++
     a=N备份N
     while(N)
         one=N%10;先取出个位
         N=N/10;再划掉个位
         sum+=one;最后求各位累加和,循环直到N为0
     number=sum*3+1;操作产生的新数字number 
     输出第几个数和运算后结果
     if(number==a),退出循环
          N=number;//新一轮N为number 
          sum=0使其初始化
     

3.代码截图

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

一开始这样写输出结果不对,调试发现大循环这样判断有问题,询问同学后改成for语句的循环,先判断完两数是否相同,相同则退出循环,不同则给N赋新值的思路。

题目3:切分表达式——写个tokenizer吧

1. 本题PTA提交列表

2. 设计思路

定义数组长度,为41!
定义i,j控制循环
定义item存放下标i的值
gets(ch);  //输入字符串 
for(i=0;ch[i]!='\0';i++){
    if(ch[i]>='0'&&ch[i]<='9'){  //是数字时
       tem=i; //储存下标i的值 
       while('0'<=ch[i]&&ch[i]<='9'||ch[i]=='.')i++; 
          for(j=item;j<i;j++)printf("%c",ch[j]);//可连续输出数字!
           i--;
          输出完最后一个数字后换行
    else if(ch[i]=='-'){//'-'时
       if('0'<=ch[i-1]&&ch[i-1]<='9'||ch[i+1]=='('){
        printf("%c\n",ch[i]);}   //减号
       else printf("%c",ch[i]);} //负号
    else  if(ch[i]=='+') { //'+'时
      if(i==0)printf("%c",ch[i]);  //第一个符号为‘+’,一定为正号
        else printf("%c\n",ch[i]); } //加号
    else{printf("%c\n",ch[i]);//输出括号   	

3.代码截图

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

写了好几个小时的这个代码(错误)在检验的时候换行还是有问题,PTA总是显示多种错误很崩溃,实在是不太会,最后上网找了答案。一开始只知道这个循环(如下图)大概的目的是实现多个数字的连续输出,一步步调试发现i++在统计有几个数字并输出,方法特别巧妙。提交代码最后一个测试点还是不过,问了班级大佬直到问题在数组长度的定义上,长度上界要到41否则ch[i+1]就无法判断,越界很危险,上界定义应该要大些。(注意!),修改后终于通过。

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

三、本周学习总结

1.你学会了什么?

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

  • 定义:数组类型 数组名[数组长度];数组长度是一个常量
  • 初始化:类型名 数组名 [数组长度]={初值表},例如inta a[10]={1,2,3,4,5,6,7,8,9,10};特别的,静态存储的数组如果没有初始化,系统自动给所有的数组元素赋0

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

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

1.3 为什么用数组?

  • 在程序中使用数组,可以让一批相同类型的变量使用同一个数组变量名,用下标来互相区分,他的优点是表达简洁,可读性好,便于数据的重用。

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

  • 选择法:
    1.int a[n];//先给数组赋值,数组长度为n
    2.for(k=0;k<n-1;k++) index=k;最小值下标为k循环第三步
    3.for(i=k++;i<n;i++)循环第四步
    4.如果a[i]小于最小值,则最小值与下标为k的值交换
    5.输出数组

  • 冒泡法:两两比较待排序的数,发现两个次序相反即进行交换,直到没有反序为止。
    1.定义变量int a[10],i,j,k
    2.for(i=0;i<10;i++) 依次输入数据存入数组
    3.for(i=0;i<9;i++) 循环第四步
    4.for(j=0;j<10-i;j++)循环
    5.if(a[j]>a[j+1]) 则交换这两个数即k=a[j];a[j]=a[j+1];a[j+1]=k;
    6.for(i=0;i<10;i++) 依次输出a[10]中每个数

  • 直接插入法:
    1.先给数组赋值,n为数组长度
    2.for(k=0;k<n-1;k++) index=k;最小值下标为k循环第三步
    3.for(i=k++;i<n;i++)循环第四步
    4.如果a[i]小于最小值,则最小值与下标为k的值交换
    5.输出数组

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

  • 二分法:
    1.确定该区间的中点位置
    2.将待查的K值与a[mid]比较
    3.若相等,则查找成功
    4.若a[mid]>K,则新的查找区间是a[1-(mid-1)]
    5.若a[mid]<K,则新的查找区间是a[(mid+1)-n]

  • 顺序查找:从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较。若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。

  • 区别:当查找数列是有序的话,使用二分查找法可以极大的减少搜索时间,提高效率;顺序查找法可以查找无规律的数列,但是需要耗费大量的时间和内存逐个搜索关键词。

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

  • 定义:二维数组定义的一般形式是: 类型说明符 数组名[常量表达式1][常量表达式2],其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。(行列)
  • 初始化:二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。

1.7 矩阵转置怎么实现?方阵中:下三角、上三角、对称矩阵的行标i列标j的关系?请说明。

矩阵转置:以主对角线为对称轴,将所有元素互换位置

  • //求a的转置矩阵,结果存于b中。
    int i,j;
    int a[c][d], int b[d][c];//c,d为任意值
    for(i = 0; i <c; i ++)
    for(j = 0; j < d; j ++)
    b[j][i] = a[i][j];//转置运算。

  • 下三角:i>=j

  • 上三角:i<=j

  • 对称矩阵:i==j

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

  • 二维数组一般应用在二维表和矩阵中.

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

  • 对输入一串字符,字符切分或者算字符个数的题不熟悉,这类型的题经常要写好几个小时,思路不清晰,可能还需要多写一些这类题来熟悉套路
  • 数组运用还是不太熟练,这周的PTA题目有的开始想要用数组写,但是写着写着经常进入死循环又找不到错误,又换成不用数组的方式写
  • 位运算符还不熟悉,每次都要看书参考
  • 二维数组和函数的调用还不熟悉,课堂上的互动那题函数调用了过多变量,效率低
  • 解题的时候速度很慢,思路不清晰,考试的时候时间掌握不好,写不完题目,并且对于选择基础题的很多知识点很模糊,需要好好熟悉掌握知识点
  • 对于数组的三种排列方法还不是特别理解
  • 刚接触不太会写伪代码
posted @ 2017-11-26 14:16  evfun  阅读(294)  评论(7编辑  收藏  举报