C语言博客作业--数组

一、PTA实验作业

题目1:7-2 求整数序列中出现次数最多的数

1. 本题PTA提交列表

1233767-20171203223601272-2025411430.png

2. 设计思路


    定义number数组存放数字,count数组存放出现次数 
    定义i控制第一层循环,j控制第二层循环,N表示有N个数字,max为比较出现次数时候使用的最大值 
    for i=0 to <1000 {
        清零count[i]=0
    }
    while(输入N){
        for i=0 to <N {//按顺序取数 
            输入number[i] 
            for j=0 to <N {//和所有数比较
               如果出现了相同的数则给次数加上一次 
            }
        }
        for i=0 to <N {
            比较出count数组中最大的值 并将其赋值给max 
        } 
        输出出现次数最多的数和它出现的次数 
    }
    return 0; 

3.代码截图

1233767-20171203223611382-1816636015.png

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

  • 在统计数字出现次数的代码中不知道以什么作为结束的标志 解决办法:上网看了别人的代码,学习了 while(scanf("%d",&N)!=EOF)的写法 在条件中输入值 并且这个程序只执行一次

题目2:7-4 简化的插入排序

1. 本题PTA提交列表

1233767-20171203224054866-1360034093.png

1233767-20171203224103226-1804098905.png

2. 设计思路


         定义n表示输入的原数组数据个数,x表示要插入的数,i控制循环,count 在输出插入x的数据时起作用 
     定义数组a 
     输入n 
     for i = 0 to  n{
         输入a[i] 
     }
     输入x 

     如果要插入的数大于a[n-1]的话在输出a数组后 输出x 
        

     如果要插入的数小于a[0]的话在输出x后 输出a数组
        

     如果x在比a[0]大比a[n-1]小的情况下 
          for i = 0 to n
          {
             输出插入x前的数字 
             count递增1,与i同步 但不记录插入x的那一次 
             
             当a[i]>x时插入x 
           }
     
     for i = count to n
        输出插入x后的数字

3.代码截图

1233767-20171203232505257-2111707708.png

1233767-20171203232516085-1372926863.png

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

  • 刚刚开始的时候没有把比第一个小和比最后一个大的情况考虑进去 解决办法:通过添加两个分支判断解决了
  • 在用count计数时,把插入的那一次也记录进去,导致最后输出的数组缺少了比x大的那个数 解决办法:把count++写在if(a[i]<x)里

题目3:7-10 杨辉三角

1. 本题PTA提交列表

1233767-20171204025827622-1620846192.png

2. 设计思路


        定义a数组保存要输出的那一组数组,b数组则存上一组数组的数据 完成杨辉三角的计算 
    输入n行 
    a先赋值a[0]=1 b[0]=1;b[1]=1
    for i=1 to n{
        a[0]后的数组清零 
    }
    for i=2 to n{
        b[1]后的数组清零 
    }
    for i=0 to n{
        第一行输出一个1 
        第二行输出两个1 
        else {//之后行 
            a[i]=1;//这是第i+1行的第i+1个数字 
            for int j=1 to i{
                实现杨辉三角的本质 第i行第i个数字等于第i-1行的第i-1个数字与第i个数字的和 
            }
            for int j=0 to i {
                把这一行的数字交给b数组,方便下一行的计算 
            }
            for int j=0 to i{
                      输出a数组  
            }

3.代码截图

1233767-20171204025855247-171673738.png

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

  • 想了很久如何实现杨辉三角的本质 解决办法:在草稿纸上列出一部分杨辉三角,发现它的实质就是第i行第i个数字等于第i-1行的第i-1个数字与第i个数字的和,而要需要两行之间的变换,则需要两个数组
  • 三角成功打印,但是数据不对 解决办法:数据比正确的大得多,而且很怪,最后发现在开始没给两个数组清零,在开头用两个循环实现清零

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

1233767-20171204114330216-400407299.png

三、同学代码结对互评

1.互评同学名称

梁志湖

2.我的代码、互评同学代码截图

1233767-20171204073357372-1815127966.png

1233767-20171204073408013-1911940285.png

3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。

  • 志湖同学运用了一个二维数组,而我运用了两个一维数组
  • 在定义数组方面,我用了两个循环来初始化,志湖同学仅用了一条 int a[10][10]={0},就做到了,比较简洁。
  • 总体上来说此类有规律得表格打印问题,用二维数组来实现会比较直观,所以我认为志湖同学这题得做法比我好,就是如果再加上一些注释就更好了。

四、本周学习总结

1.你学会了什么?

1.1 C中如何存储字符串?

字符串是以ASCII字符NUL结尾的字符序列。ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中。不过,并非所有的字符数组都是字符串,字符数组可能没有NUL字符。字符数组也用来表示布尔值等小的整数单元,以节省内存空间。

1.2 字符串的结束标志是什么,为什么要结束标志?

'\0' 没有结束标志可能会使字符串发生越界

1.3 字符串输入有哪几种方法?

scanf("%s",ch1);

gets(str1);
不同:scanf不能接受空格、制表符Tab、回车等;
而gets能够接受空格、制表符Tab和回车等;
相同:字符串接受结束后自动加'\0'

1.4 数字字符怎么转整数,写个伪代码?

    定义字符型 op
    输入数字字符
    输出("%d",ch-'0');

1.5 16进制、二进制字符串如何转10进制?写伪代码?


   定义a[];
   输入数据
   定义变量result=0
   定义字符型数据char ch
   当ch=getchar()!=\0时
         result=result*10+ch-'0'
   输出result

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

  • 经常忘记的点,我打上来再复习一遍吧
    a=++n 表示n=n+1 a=n
    a=n++ 表示a=n n=n+1
    a=--n 表示n=n-1 a=n
    a=n-- 表示a=n n=n-1
    单独的n++先表示n后加一 单独的++n先加一后带入运算

  • pta方面,此次数组不会做的题太多了,很多题都不知道如何运用之前学的知识来解决,很多都是在编译器里就输出不对的,更不要说复制到pta上通过测试了,很多编译器上对的,拿到pta也只是部分正确,说明自己考虑问题不全面。

3.期中考试小结

3.1 你认为为什么没考好?

  • 时间分配:都是顺着题目做,导致到编程题时候已经没有时间,有之前编过的题也只能是因为没有时间交了白卷
  • 基础理论:一些导论课的基础,还有一些c的理论基础,都不太清楚,很模糊,比如进制间的转换
  • 熟练程度:熟练度低,导致读题目程序慢,进而做题速度也慢,正确率也低。

3.2 罗列错题。

  • 选择题:5.以下均为合法标识符的是
    A.do xyz _printf B.3aa _tt IF C.void ff s_v D._pi IF big_tree
    错选B 正确D 分析:对基础的知识不了解,标识符不能以数字开头

  • 程序分析输出结果题:大部分是没有分析过程扣分

  • 阅读程序填空:第七空没有掌握正确的字符型数据输入getchar() ==> ch=getchar()

  • 程序设计题:第三题


#include<stdio.h>
double fact( int x);
int main(){
    int result;
    int n,m;
    scanf("%d%d",&m,&n);
    result=fact(n)/(fact(m)*fact(n-m));
    printf("result = %d",result);
}
double fact( int x){
    double number=1;
    int i;
    for(i=1;i<=x;i++){
        number=number*i;
    }
    return number;
}

此次的程序设计由于没有时间几乎白卷,写了的题也思路混乱。

3.3 下半学期要怎么调整C的学习?

  • 扎实基础,能解决一个问题是一个问题,尽量做到把一个方面或一个问题的东西吃透,不然考到明明有印象又做不出来。
  • 和其他学科的时间分配调整好,因为c是比较基础的语言,之后其他语言的学习也都是在c的基础上,所以学好c比较重要,在不影响其他学科的基础上多花时间在c上吧。
  • 多花时间完成预习作业,预习作业比较重要,要是某一个单元的预习作业水了,那么接下来的听课就受影响,这个单元的学习也受比较大的影响。

转载于:https://www.cnblogs.com/Littleweii/p/7967677.html

1. 顺序存储结构中数据中数据元素之间逻辑关系是由( )表示的,链接存储结构中的数据元素之间的逻辑关系是由( )表示的。 A.线性结构 B.非线性结构 C.存储位置 D.指针 2. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不能为空 C. 一个无限序列,可以为空 D. 一个无限序列,不能为空 3. 已知一维数组A采用顺序存储结构,每个元素占用4个存储单元,第9个元素的地址为144,则第一个元素的地址是( )。 A. 108 B. 180 C. 176 D. 112 4. 在单链表中删除指针p所指结点的后继结点,则执行( )。 A. p->next= p->next->next B. p->next= p->next C. p= p->next->next D. p= p->next; p->next= p->next->next 5. 若某链表最常用的操作是在最后一个结点之后插入一个结点删除最后一个结点,则采用( )存储方式最节省时间。 A. 单链表 B. 双链表 C. 带头结点的双循环链表 D. 单循环链表 6.二维数组A[7][8]以列序为主序的存储, 计算数组元素A[5][3] 的一维存储空间下标 k=( )。 A. 38 B. 43 C. 26 D. 29 二、完成下列填空题(每空3分,共9分)。 1.在顺序表L中第i个位置上插入一个新的元素e: Status ListInsert_Sq(SqList &L , int i , ET e){ if ( iL.length+1) return ERROR; if(L.length >= L.listsize){ p=(ET*)realloc(L.elem,(L.listsize+10)*sizeof(ET)); if (p==NULL) exit(OVERFLOW); L.elem=p; } for( j=L.length ; j>=i ; --j ) L.elem[j]=L.elem[j-1] ; L.elem[j]=e ; ++L.length ; return OK; } 2. 删除双向链表中p所指向的节点算法: status delete(DuLinkList L, DuLinkList p) { if (p= =L) return ERROR; else { p->prior->next=p->next; p->next->prior=p->prior ; } free(p); return OK; } 三、编程题(共27分)。 1. (共12分)用顺序表表示集合,设计算法实现集合的求差集运算,要求不另外开辟空间。 顺序表的存储结构定义如下: #define Maxsize 100 typedef struct { ElemType data[MaxSize]; // ElemType表示不确定的数据类型 int length; // length表示线性表的长度 }SqList; 将如下函数,伪码补充完整(8分),代码前先用文字描述自己的算法思想(4分)。 文字描述算法:略(4分) void Difference(SqList A, SqList B) {//参考代码如下如下(8分) for (i=0;i<A.length;i++) for(j=0;j<B.length;j++) if(A.data[i]==B.data[j]) { A.data[i]=’#’; break; } for (k=0,i=0;inext == L) return; p = L; while (p->next != L)   { if (p->next->data != e) P = p->next; else { q = p->next;p->next = q->next; free(q);} } } 时间复杂度分析:(2分) 时间复杂度为O(n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值