精华内容
下载资源
问答
  • //将数字转换成字符,存于buffer中 _itoa(i+1,buffer,10); point=numpoint.GetAt (i); dc.TextOut (point.x ,point.y ,buffer); } } 由于每创建一个输入结点,就要相应地记录一个序号。这个序号的位置点...
  • BFS和DFS算法分析对比优化

    千次阅读 2010-07-10 20:16:00
    不幸的是,出于保密的需要,该部门用于输入密码的键盘是特殊设计的,键盘上没有数字键,而只有以下六个键:Swap0, Swap1, Up, Down, Left, Right,为了说明这6个键的作用,我们先定义录入区的6个位置的编号,从左至...

    noi2001两道题看最优化问题BFSDFS算法的优化

     

     

    NOI2001聪明的打字员

      阿兰是某机密部门的打字员,她现在接到一个任务:需要在一天之内输入几百个长度固定为6的密码。当然,她希望输入的过程中敲击键盘的总次数越少越好。
    不幸的是,出于保密的需要,该部门用于输入密码的键盘是特殊设计的,键盘上没有数字键,而只有以下六个键:Swap0, Swap1, Up, Down, Left, Right,为了说明这6个键的作用,我们先定义录入区的6个位置的编号,从左至右依次为123456。下面列出每个键的作用:
    Swap0
    :按Swap0,光标位置不变,将光标所在位置的数字与录入区的1号位置的数字(左起第一个数字)交换。如果光标已经处在录入区的1号位置,则按Swap0键之后,录入区的数字不变;
    Swap1
    :按Swap1,光标位置不变,将光标所在位置的数字与录入区的6号位置的数字(左起第六个数字)交换。如果光标已经处在录入区的6号位置,则按Swap1键之后,录入区的数字不变;
    Up
    :按Up,光标位置不变,将光标所在位置的数字加1(除非该数字是9)。例如,如果光标所在位置的数字为2,按Up之后,该处的数字变为3;如果该处数字为9,则按Up之后,数字不变,光标位置也不变;
    Down
    :按Down,光标位置不变,将光标所在位置的数字减1(除非该数字是0),如果该处数字为0,则按Down之后,数字不变,光标位置也不变;
    Left
    :按Left,光标左移一个位置,如果光标已经在录入区的1号位置(左起第一个位置)上,则光标不动;
    Right
    :按Right,光标右移一个位置,如果光标已经在录入区的6号位置(左起第六个位置)上,则光标不动。
    当然,为了使这样的键盘发挥作用,每次录入密码之前,录入区总会随机出现一个长度为6的初始密码,而且光标固定出现在1号位置上。当巧妙地使用上述六个特殊键之后,可以得到目标密码,这时光标允许停在任何一个位置。
    现在,阿兰需要你的帮助,编写一个程序,求出录入一个密码需要的最少的击键次数。

     

    输入文件(clever.in
    文件仅一行,含有两个长度为6的数,前者为初始密码,后者为目标密码,两个密码之间用一个空格隔开。

     

    输出文件(clever.out
    文件仅一行,含有一个正整数,为最少需要的击键次数。

     

    输入样例
    123456 654321

     

    输出样例
    11

     

     

     

     

     

     

    样例说明:
    初始密码是123456,光标停在数字1上。对应上述最少击键次数的击键序列为 

     

     

     

     
    最少的击键次数为11

     

     

    NOI2001试题:炮兵阵地
    cannon.pas/c/cpp

     

       司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由NM列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击 范围如图中黑色区域所示:


     

      如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
    现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。

     

    输入文件(cannon.in
    文件的第一行包含两个由空格分割开的正整数,分别表示NM
    接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。
    N≤100
    M≤10

     

    输出文件(cannon.out
    文件仅在第一行包含一个整数K,表示最多能摆放的炮兵部队的数量。

     

    输入样例
    5 4
    PHPP
    PPHH
    PPPP
    PHPP
    PHHP

     

    输出样例
    6

     

    noi2001两道题看最优化问题BFSDFS算法的优化

      

      关于最优化问题的搜索算法优化,下面以NOI2001的两道题为例分别分析。
    Clever一题看BFS算法的优化。由于约束条件复杂,我们很难找到好的启发式搜索方法,所以可以确定这题要用BFS算法来解决。状态的过多不但造 成了空间的浪费,由于状态数多往往是搜索树节点分支过多造成的,BFS算法的速度也要受到极大的影响。新的状态表示只有区区276480种状态,使用 hash表就能够很圆满地解决了。
    BFS
    优化总结。相对于DFS来说,BFS更强调理论上的状态总数,对于实际搜索时的状态总数要求不高。最后,BFS算法的一个很大速度依赖来自状态标记数组。在状态能够装得下的条件下,利用快速的数组或hash表访问来提高BFS的速度必不可少。
    Cannon一题看DFS算法的优化。对于DFS算法,由于只要求最优解,最重要的优化办法就是定界。剪枝在本题的解决中并未起到最大的作用,但是对 于任何一道DFS题不剪枝都将是失败的,所以我们还是需要对本题进行剪枝。众所周知,局部搜索的复杂度相对于全局搜索极小,符合我们的要求。
    DFS
    优化总结。从上面的分析可以看出,DFS算法由于其本身的特点,在空间上没有太大的要求,优化主要集中在时间压缩方面。预处理也是DFS算法优化的一个重要方面。

     

    【关键字】

     

      最优化问题,BFSDFSNOI,状态表示,hash表,队列,搜索树,剪枝,分支定界,局部搜索,预处理,无后效性,时间复杂度,空间复杂度。

     

    【概述】

     

      最优化问题在现实生活中意义很大。但由于这些问题的规模往往较大,无法人工解决,常需要借助于计算机程序。在竞赛中,为了较全面地考察选手的素质,最优化问题也经常出现。由于最优化问题没有固定的解法,所以它对选手的分析能力与算法能力都有很高的要求。
    最优化问题最完美的解决方法当然是将指数级复杂度的工作量降到On^p)(p为常数)内。比如经典的动态规划算法、网络流算法、贪心算法等等。但是还 有许多最优化问题无法用这些高效率算法解决,或者在赛场上由于时间或其他方面的限制选手无法在特定环境下找到套用这些算法的正确途径,这是搜索算法就成为 了正确解决问题的唯一工具。众所周知,搜索算法实际上是穷举所有可能的状态以得到最优解的""算法,伴随着的往往是令人无法忍受的时间或空间复杂度。这 时就需要选手举有很强的优化能力,利用强有力的剪枝等技术在不牺牲正确性的条件下提高搜索的效率,以在较短的时间、较小的空间内解决问题。
    搜索算法主要有BFSDFS两种,即广度优先搜索与深度优先搜索。两种搜索算法的特点各不相同,优化的角度也各不相同。下面以NOI2001的两道题为例分别分析。

     

    【从Clever一题看BFS算法的优化】

     

      BFS算法又称广度优先算法,是按层扫描搜索树来得到最优解的搜索算法。代表题目如NOI2001Clever

    〖题目描述〗
    给出一个六位数,要求对其进行最少的操作后得到一个新的给出的六位数。一次操作可以是以下六种操作中的一种:将光标(表示六个数字中当前被操作的数的位 置)向左或右移动一位;将首数与光标所在的数交换且光标位置不变;将尾数与光标所在的数交换且光标位置不变;将光标指向的数加1或减1
    输入原始六位数与目标六位数,输出最少的操作次数。设开始时光标在最左边,操作结束时光标允许在任意位置。

    〖基本算法〗
    本题是典型的搜索题,因为约束条件复杂多样,很难存在什么好的贪心算法;而且存在交换操作,也不存在无后效性与最优子结构性质,无法用动态规划来解决。在这种情况下,我们当机立断地选择了搜索算法。
    仔细分析一下本题状态数,数字的可能性有10^6种,还有光标的6种可能,共6000000个状态,如果选择DFS算法,在出第一个解之前,我们根据什 么决定搜索的深度呢??总不能说,所有状态都访问过了,所以不搜了--那么搜索深度至少有30000层啊。由于操作复杂,我们也很难找到好的启发式搜索方 法,所以可以确定这题要用BFS算法来解决。

    进一步,由于本题的操作具有明显的可逆性,可以考虑使用效率更高的双向搜索。双向搜索的数据结构与算法流程如下:
    1
    .初始化;
    分别建立2个空队列AB,将原始状态(光标置于1)入队A,目标状态下对应光标的6个位置的6种不同末状态入队B。在内存允许的情况下,建1个记录 状态是否被2个队访问过的标记数组(每个状态只需要2bit的存储空间),并分别为队A与队B内的状态做标记。清初始步数p0
    2
    .如果队B内的新状态未被队A访问过,将p1,扩展BFS搜索树A
    对队A内现在headtail的所有状态扩展下一步,如果未与前面A内出现过的状态重复,则依次加入到tail后面。完成后将head指向tail后一位,tail指向队尾。另:新状态即队内headtail的所有状态。
    3
    .如果队A内的新状态未被队B访问过,将p1,扩展BFS搜索树B;否则到第5步;
    扩展搜索树B的算法参见第2步。
    4
    .回到第2步;
    5
    .打印p并结束程序。
    经测试可以发现,虽然双向搜索可以在题目要求的时间内出解,但是速度极慢,而且空间占用极大,普通的Pascal IDE根本无法满足程序的内存需求。虽然可以进行优化,但无论怎样也无法从根本上改善双向搜索算法的效率。连效率高过BFS算法数倍的双向搜索都如此,看 来本题使用普通的搜索架构是无法解决的。我们必须建立一种新的搜索方式。

    〖算法优化〗
    容易看出,本题的状态数 太多是造成BFS算法与双向搜索算法效率低下的罪魁祸首。状态的过多不但造成了空间的浪费,由于状态数多往往是搜索树节点分支过多造成的,BFS算法的速 度也要受到极大的影响。要提高算法的效率,如何压缩状态是最大的关键。事实上,状态的压缩就是对题目的搜索约束条件的合理简化。所以,我们首先必须对6种 操作有一个充分的认识,然后考虑以下的优化。
    一个简单的剪枝是:对于1个原始数,我们要不不改变它的值--即不对它进行UpDown操作, 要不只改变一次,这一次是指若干次连续的UpDown操作,此次操作后再也不对它的值进行改变。这个剪枝是很容易想到的,但是作用不够大,因为如果一个 数还没有改变过,那么我们在每一次光标移动到它上面是都要决定是否改变,改变成什么值。而且上面的判断会给搜索造成巨大的麻烦,直接后果就是程序难写,痛 苦的反复检查大大降低了原本就很慢的速度。

    那么,在这个剪枝上我们真的没有文章可做了吗??不是的。再深入地思考一下,我们会发现原 来UpDown操作在整个操作过程中的顺序是无关紧要的。如果在最优方案中某个原始数的值有改变,我们只要保证在最后一次光标停止在它上面的时候一次性 进行UpDown操作,将其变为目标状态中对应的数就行了。这样,我们实际上在一开始就"瞄准"了每一个数最后的位置与大小,我们所要做的就是在该改变 大小的原始数均有被光标访问过的前提下将原始的123456的位置关系变为我们"瞄准"的位置关系就行了。比如说将数456789变成987654,最优 方案实际上可以描述为:开始"456789"的位置关系被固定地表示为123456,即"4"是第1个数,"5"是第2个数,……最终的"987654" 的位置关系为563421,即"9"是原来的第5个数"8""8"为原来的第6个数"9""7"为原来的第3个数"6""6"为原来的第4个数 "7""5"为原来的第2个数"5""4"为原来的第1个数"4"。这样除了最后在第56位上的"5""4"外,最终数的前4位都经过了变化,即 要求光标必须曾经访问过原来的第5634个数。
    现在,我们又有了一个新的状态表示方案:P_XXXXXX_??????P表示光标的 当前位置,XXXXXX表示现在的状态相对于原来6个数的位置关系,??????是一个二进制数,反映当前状态每个位置上的数是(1)否(0)被光标访问 过。举个例子,原始状态被固定地表示为1_123456_100000,经过以下2个操作(RightSwap0)后变成 2_213456_110000。大家可以看到,这种状态表示方法忽略了UpDown操作。这是因为一旦"瞄准"了最终状态,UpDown操作的最少 总次数就已经定了,不需要我们在状态表示中赘述。
    现在算一算状态数吧:P6种可能,XXXXXX6的全排列,共P66=720种可 能,??????是六位二进制数,共2^6=64种方案。状态总数为6*720*64=276480,不到原来状态数的二十分之一!!不要忘记,由于光标 访问过的数是有增无减地,所以二进制数??????1的个数至少是1,随着搜索的进行有增无减,所以实际上有可能出现的状态数只有5605种!!这样, 我们只需要用1BFS算法就能够在不到1s的时间内算出原始状态到所有状态的最短距离了!!而这里却不能使用双向搜索,因为光标访问过的位置的变化是不 可逆的。至于这区区276480种状态的标记数组的存储,使用hash表就能够很圆满地解决了。

    最后,我们来研究最优解的确定。我们 知道,目标六位数与原始六位数对应的位置关系只有P66=720种。而对于每种对应关系,除了光标位置有6种外,由于每个原始数的最终值都确定了, 它们的UpDown的最短编辑距离也就确定了,剩下的就是满足该改的数必须被光标访问过这一条件。其实这很简单,无非是求所有制定的位为1的六位二进制 数,复杂度为On)。这样,我们用几重循环就能检查目标六位数所可能对应的所有末状态,而检查的过程只不过是对一个hash表的某个制定元素返回值取 min,复杂度为On)。这样的检查,相对于全面的BFS来,其时间是远远不能相比的。
    按照此优化重写的程序,速度固定在CII800+fp1s左右,大大低于题目要求的时限。而且空间占用小,甚至有可能使用640K的内存就能放下(以速度为代价放弃标记数组或按位压缩hash表),时空比俱佳。本题得到了圆满地解决。
    那么,为什么这样的优化能大大提高算法的效率呢??很重要的一个原因,就是由于UpDown操作的剥离,每个节点的分支数从原来的6个减少到了现在的 4个,大大缩小了搜索树的体积,提高了速度。还有一点,剥离UpDown操作也是搜索层数减少了,又大大压缩了搜索树,提高了程序效率。

    BFS优化总结〗
    从上面的例子中我们可以看到,BFS算法并非总比不上双向搜索。它具有更大的优化空间,不像双向搜索编程繁琐,优化的空间不大。BFS的优化主要集中在压缩状态与分离约 束条件上,hash表是BFS经常使用的优化策略。相对于DFS来说,BFS更强调理论上的状态总数,对于实际搜索时的状态总数要求不高。最后,BFS算 法的一个很大速度依赖来自状态标记数组。在状态能够装得下的条件下,利用快速的数组或hash表访问来提高BFS的速度必不可少。
    另外,减少每个状态节点的分支是搜索优化中必不可少的一环,不论BFS还是DFS都一样。下面我们再从NOI2001的另一道题Cannon来看看这个优化的重要性。

     

    【从Cannon一题看DFS算法的优化】


    DFS
    算法又称深度优先算法,是按深度遍历搜索树以得到最优解或可行解(的个数)的搜索算法。下面以NOI2001Cannon一题为例子,分析一下用DFS算法求最优解的一般优化策略。

    〖题目描述〗
    对于一个给定的n*m棋盘,某些格子不允许放置棋子,每个棋子的攻击范围为以自己为中心的边长为2的十字。求能放置最多的不受其他棋子攻击的棋子的最优方案。

    〖基本算法〗
    容易想到的带简单的分支定界的DFS搜索算法流程如下:
    1
    . 初始化;
    建立记录每个格子被攻击情况的n*m数组A,清A[i,j]0,清障碍格子A[i,j]1。建立记录放置棋方案的n*m数组B,清B[i,j]0。置最优解p0
    2
    . 搜索;
    对于当前格,分为放与不放棋子2种状况;如放置棋子,则将相应的A数组内元素加1,置相应的B数组内元素为1;判断当前已放棋子数加上以后最多能放的棋子数是否大于p,是则继续搜索。
    3
    . 搜索底部检查;
    当搜索到达底部时,检查当前已放棋子数是否大于p,是则为p赋新值。
    4
    .打印p并结束程序。
    上述算法的判断以后最多能放的棋子是根据一个棋子占4格的平均情况估算的,很夸大。因此搜索的效率很低,除了许多无用解,速度使人无法忍受。

    〖算法优化〗
    对于DFS算法,由于只要求最优解,最重要的优化办法就是定界。本题主要的定界是定当前解的上界。首先,我们需要借助一些贪心的思想,让程序能够很快得 到最优解或较优解。怎么做呢??很简单,就是让程序尽量先搜当前格放置棋子的情况,这样就能尽量早地出较优解,给后面的分支定界留下了足够大的优化空间。
    接下来就是剪枝了。剪枝在本题的解决中并未起到最大的作用,但是对于任何一道DFS题不剪枝都将是失败的,所以我们还是需要对本题进行剪枝。本题的一个 主要剪枝就是:要求放置棋子过程中决不能留下一个完整的"",即上下左右都被占领或攻击,自己安然无恙的空位。因为很明显的,这样得到的最优解在这个眼 填上棋子后一定变成了更优的,所以这种解必须剪掉。其他剪枝的作用就不大了,比如说如果出现连续2行的空白就可以使用分治法……等等,不一而足,但都没有 这个剪枝与下面的定界有力,反而增加了编程复杂度,这里就不再介绍了。
    然后是最重要的--定当前解的最优上界。换句话说,就是计算剩下的还未 检查过的格子最多还能放多少个棋子。如果即使这样总放置的棋子数还是达不到已知的最优解的棋子数,当前棋盘的搜索显然没有建设性,不必继续了。当然,如果 有一种特殊的快速的算法能够直接求出准确的当前解最优上界,我们根本就无需搜索了--直接用这种算法求空白棋盘的"最优上界"不就行了?!所以这个计算只 能是大致的估算。估算的结果不能太小,否则会剪掉不该剪掉的解;又不能太大,否则就像原始的基本程序一样没有效率。与此同时,估算函数的复杂度也是影响搜 索速度的一个重要环节。如果一味地追求估算的准确而采用复杂度大估算函数,甚至会因为估算的规模超过了剪枝的规模而弄得得不偿失。
    本题我们使 用的估算函数,是局部搜索。怎么说呢??我们要看到本题估算结果的可重复利用性,即:在剩下的未检查的格子较多情况下,已检查的棋盘的棋子放置策略对未检 查棋盘的微小影响不会过多地干扰到剩余棋盘的最优上界。也就是说,如果棋盘有1000行,在检查了前200行后,对于任意的当前解,后800行的最优上界 基本上是不变的。这是因为每个棋子最多只能影响到周围5*5范围内的棋子,即具有一定的无后效性。
    那么,我们能不能预先算出每个剩余棋盘的大 致最优上界,以供搜索时直接调用呢??答案是肯定的。如前所述,由于本题具有一定的无后效性,加上优化算法本身要求的最优上界只是一个估计值,所以完全可 以进行数据的重复使用。这样一来,我们只需找出一个复杂度远小于搜索的预处理算法以确定每个剩余棋盘的最优上界就行了。这里我们可以使用局部搜索算法。众 所周知,局部搜索的复杂度相对于全局搜索极小,符合我们的要求。更重要的一点就是局部搜索还可以利用更早的预处理数据,实现递归的优化。这样定下来的搜索 算法流程如下:
    1
    . 搜索最后1行的最优解max[1]
    2
    . 利用max[i]搜索最后i+1行的最优解max[i+1]
    3
    . 返回第2步,直到i=n
    注意,上面只提到利用最后i行的最优解,是因为过分地分割棋盘并没有太大的意义。另外还因为本题的m规模很小(m<=10),我们实际上可以预先 算出每行放置棋子的所有可能状态(不超过60种),搜索时直接按行搜索,这样事实上利用了双层嵌套搜索的思想,又大大提高了程序的速度效率。
    经过测试,这时的搜索+优化算法已经达到了本题的标准算法--动态规划的时间水平,应付题目时限内的测试数据更是绰绰有余了。本题已经圆满地得到了解决。

    DFS优化总结〗
    从上面的分析可以看出,DFS算法由于其本身的特点,在空间上没有太大的要求,优化主要集中在时间压缩方面。DFS算法是遍历整棵搜索树的算法,在时间 复杂度上没有BFS的先天优势,只有靠后天的优化。DFS算法解决最优化问题的优化主要包括以下三个方面:一,剪枝。二,定界。三,预处理。可以看到,在 本题的优化过程中,我们十分强调预处理,就是因为预处理的数据能够重复使用,不需要很大的复杂度就能够达到减少搜索树节点的分支的目的。
    DFS
    最优化问题算法的最根本优化方法就是搜索算法本身的优化。比如说,双重嵌套搜索,启发式搜索,可变深度搜索等等。这些优化的效果往往十分惊人,但都 需要对题目有深刻的分析与理解。这对选手的分析能力与算法能力的要求都很高,也就无怪乎竞赛老要考最优化问题了--这的确是最能全面反映选手素质的考察手 段。
    搜索算法的优化算法还有很多,也还有许多问题正待解决。未来,最优化搜索算法优化的路还很长。我们都将面对越来越大的挑战。学无止境,只有不断思考,不断创新,才能拥有自己的风格,才能开发出一块属于自己的新天地。
    让我们前行。

     

    展开全文
  • 9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。 10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text....
  • 实际上 由于 P1.1 高电平输出电阻为 10K,起到输出限流的作用,所以流过 LED 的电流小于(5V-1V)/10K = 0.4mA。只要 P1.1 输出低电平 GND,实际小于 0.3V,LED 就不能导通,结果 LED 不亮。 开关双键的输入:输入先...
  • b=t这种形式,但是答案没有正确,两个数字并没有交换,我也没有用到调用函数里面的p和q,而是自己重新定义了两个整数,所以整个代码里指针好像没有发挥什么作用,所以答案是错误的。然后看了室友的代码,才把p和...

    一、PTA实验作业

    题目1:两个4位正整数的后两位互换

    1. 本题PTA提交列

    1233806-20171216220551686-492239282.jpg

    2. 设计思路

    1233806-20171216222321249-1155632838.jpg

    3.代码截图

    1233806-20171216222420593-134561832.jpg

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

    刚开始想到的交换是令t=a;a=b;b=t这种形式,但是答案没有正确,两个数字并没有交换,我也没有用到调用函数里面的p和q,而是自己重新定义了两个整数,所以整个代码里指针好像没有发挥什么作用,所以答案是错误的。然后看了室友的代码,才把p和q用上,然后参考了她的交换法,如下图所示:可是我不懂这个交换为什么用-和+来换。我发现我改成这样也没有正确,原因是我多加了p=&number1这个,指针指向一个地址我还不太会用
    1233806-20171217145353686-1241428064.jpg

    题目2:求出数组中最大数和次最大数

    1. 本题PTA提交列

    1233806-20171217145536905-851652181.jpg

    2. 设计思路

    1233806-20171217160216983-299406657.jpg

    3.代码截图

    1233806-20171217160323858-358034074.jpg

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

    刚开始只用了一个循环,导致没有交换,原样输出。后来加了一个循环,但是没有注意第二个循环是从1开始,导致次大数和a[1]没有交换

    题目3: 找最大值及其下标

    1. 本题PTA提交列

    1233806-20171217172447655-1474754560.jpg

    2. 设计思路

    1233806-20171217175244889-386995370.jpg

    3.代码截图

    1233806-20171217175338077-2117074454.jpg

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

    没有给max赋值,输出的时候总是8,没有用到指针*b,position总是0

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

    1233806-20171217211004171-364190610.jpg

    三、阅读代码

    1233806-20171217183912046-1874842424.jpg

    该代码的功能是判断出回文字符串,优点是用的代码量少,清晰又简洁,巧妙的定义了strlen(s)

    1233806-20171217214431264-984122600.jpg

    四、本周学习总结

    1.自己总结本周学习内容

    本周学了结构,结构是一种允许程序员把一些数据分量聚合成一个整体的数据类型,它与数组的区别在于:数组中所有元素的数据类型必须是相同的,而结构中各成员的数据类型可以不同。

    结构的定义用struct,要用大括号括起来,以分号结束,大括号中以定义变量的形式列出各信息项。结构的嵌套定义,必须先定义成员的结构类型,再定义主结构类型。结构的定义有单独定义:先定义一个结构类型,再定义这种结构类型的变量;混合定义:在定义结构类型的同时定义结构变量 struct 结构名{ 类型名 结构成员名}结构变量表;无类型名定义:在定义结构变量是省略结构名struct { 类型名 结构成员名} 结构变量名表;

    结构变量的使用

    结构数组操作

    2.罗列本周一些错题

    1233806-20171217183107499-692656734.jpg

    1233806-20171217183121405-1222412491.jpg

    1233806-20171217183129514-349802678.jpg

    
    
    读入一行英文文本,将其中每个 
    
    单词的最后一个字母改成大写,然后输出此文本行 (这里的“单词”是指由空格隔开或句号结尾的字符串)
    
    注意:按照1,2,3,4顺序填空,不要写序号,空格或回车隔开。
    #include  "stdio.h"
    #include  "ctype.h"
    void up1st (_____2_______  )
    {
    
      int  k = 0 ;
       for ( ; ____3____ ;  p++ )
       {
         if ( k )
          {   if ( *p == ' ' || *p == '.' )
              {  
                 *(p -1 ) =______4________;
                 k=0;
              }
          }
          else 
            if ( *p != ' ' )  
                k = 1 ;
       }
          *( p-1 ) = toupper( *(p-1) ) ;
    }
    
    int main( )
    { 
       char  chrstr[81] ;
       
        printf( "\nPlease enter a string: " ); 
        ________1_____ ;
        printf( "\n\nBefore changing:\n  %s", chrstr );
        up1st( chrstr );
        printf( "\nAfter changing:\n  %s", chrstr );
    
    }
    
    
    
    参考答案
    
    
     gets(chrstr);
    
    char *p 
    
    *p
    
    toupper( *(p-1))
    
    我的作答
    
    
    int *toupper,int *p
    
    P=0;*p
    
    3、填空题
    
    分值10.0
    
    得分: 3.0 
    
    
    
    Fun函数用来删除字符串中所有空格, 
    
    如输入:  as df gghk lkj78, 
    
    则输出:  asdfgghklkj78        
    #include <stdio.h>
    #include <ctype.h>
    void Fun(char *str)
    {
       int i,j;
       i=j=0;
       while(____2_____)
       {
           if(str[i]!=' ')
               str[j++]=str[i];
           i++;
       }
       str[j]=___3____;
     }
    
    int main()
    {
      char str[81];
      int n;
      gets(str); 
      puts(str);
      _____1______;
      printf("*** str: %s\n",str);
    
    }
    
    
    
    参考答案
    
    
     Fun(str)
    
    str[i]
    
    '\0'
    
    我的作答
    
    
    str[i]=getchar()=='\0'
    
    str[i]
    
    n=0
    4、填空题
    
    分值10.0
    
    得分: 3.0 
    
    
    
    给定程序中,函数fun的功能是:将形参s所指字符串中的数字字符转换成对应的数值, 
    
    计算出这些数值的累加和作为函数值返回。 
    
    例如,形参s所指的字符串为:abs5def126jkm8, 
    
    程序执行后的输出结果为:22。
    #include  <stdio.h>
    #include  <string.h>
    #include  <ctype.h>
    
    int Fun(char  *s)
    { 
        int sum=0  ;
        while(___2___)
        {
            if(isdigit(*s))    /* if(*s>='0'&& *s<='9')*/
              _____3_________;
           s++;
        }
        return sum;
    
    }
    
    int main()
    {
       char  s[81];
       int  sum;
       printf("\nEnter a string:"); 
       gets(s);
       _____1______;
       printf("\nThe result is:  %d\n",sum);
      
    
    }
    
    
    
    
    参考答案
    
    
    sum=Fun(s)
    
    *s
    
    sum=sum+*s-'0'
    
    我的作答
    
    
    *s
    
    s=sum*32+s-'0'
    
    puts(s)

    转载于:https://www.cnblogs.com/danzhai/p/8047957.html

    展开全文
  • C#网站制作经典实操

    2018-05-29 19:46:49
    2.3.2 查看CSS样式作用结果 18 2.4 网页上加载图片或flash 18 2.4.1 准备图片flash文件 19 2.4.2 加载图片 19 2.4.2加载flash文件 21 小结 21 第3章 栏目页操作 21 3.1 建立栏目文件夹栏目管理页 21 3.1.1 建立...
  • 定义数字格式不同的是,这是修改值,而且定义数字格式是修改显示状态 【图表条件格式】:对图表的系列执行条件格式,可以设置2到3个条件,符合条件的系列值填充指定的颜色 【修改文件时间】:随心所欲修改文件的...
  • 定义数字格式不同的是,这是修改值,而且定义数字格式是修改显示状态 【图表条件格式】:对图表的系列执行条件格式,可以设置2到3个条件,符合条件的系列值填充指定的颜色 【修改文件时间】:随心所欲修改文件的创建...
  • Excel百宝箱9.0无限制破解版

    热门讨论 2012-02-03 19:05:29
    定义数字格式不同的是,这是修改值,而且定义数字格式是修改显示状态 【图表条件格式】:对图表的系列执行条件格式,可以设置2到3个条件,符合条件的系列值填充指定的颜色 【修改文件时间】:随心所欲修改文件的创建...
  • Excel百宝箱

    2012-10-27 17:09:21
    定义数字格式不同的是,这是修改值,而且定义数字格式是修改显示状态 【图表条件格式】:对图表的系列执行条件格式,可以设置2到3个条件,符合条件的系列值填充指定的颜色 【修改文件时间】:随心所欲修改文件的创建...
  • 自增列定义 属性 第章视图 视图的作用 视图的定义 视图的删除 视图的查询 视图数据的更新 第章嵌入式 前缀和终结符 宿主变量 输入和输出变量 指示符变量 服务器登录与退出 登录服务器 退出服务器 ...
  • Excel百宝箱8.0

    2011-06-07 21:32:17
    【字符分离计算】:批量地对单元格进行文本、数字分离,还可以计算取出的表达式 【删除空单元格】:删除选区的空单元格,后面的数据自动上升 【转置选区】:将选区行列调换 【按倒置】:将选区的数据横向倒置 ...
  • oracle数据库经典题目

    2011-02-17 15:05:20
    7. 简述PL/SQL程序结构各个部分的作用。 答案: PL/SQL程序的基本单元是语句块,所有的PL/SQL程序都是由语句块构成的,语句块之间可以相互嵌套,每个语句块完成特定的功能。  声明部分:以关键字DECLARE开始,...
  • EXCEL百宝箱8.0终极版

    2011-11-05 16:48:02
    【字符分离计算】:批量地对单元格进行文本、数字分离,还可以计算取出的表达式 【删除空单元格】:删除选区的空单元格,后面的数据自动上升 【转置选区】:将选区行列调换 【按倒置】:将选区的数据横向倒置 ...
  • 可以选择作用对象是当前表还是所有工作表。恢复时也只要瞬间完成(不到1秒) 【文本、数字分离与计算】批量地对单元格进行文本、数字分离,还可以计算取出的表达式 【删除空单元格】删除选区中空单元格,下面的单元...
  • 数据库基础

    2012-09-22 16:27:04
    §1.9 伪列及伪表 46 §1.10 使用SQL Worksheet工作 46 第二章 查询基础 50 §2.1 SELECT语句 50 §2.2 SQL中的单记录函数 50 §2.2.1 单记录字符函数 50 §2.2.2 单记录数字函数 56 §2.2.3 单记录日期函数 62 §...
  • Excel新增工具集

    2011-12-20 09:30:27
    Microsoft Office Excel 新增系列工具 帮 助 文 件 一、必要条件: 请确认您安装了Microsoft Office Excel2003、...2、某重复数据标注与整行删除:在每行指定的各单元格中查找重复数据(同相的文本或数字),...
  • excel的使用

    2012-11-25 17:06:01
    以绘制y=|lg(6+x^3)|的曲线为例,其方法如下: 在某张空白的工作表中,先输入函数的自变量:在A的A1格输入"X=",表明这是自变量,再在A的A2以后的格内逐次从小到大输入自变量的各个值;实际输入的时候,通常...
  • 概要设计说明书模板

    热门讨论 2011-10-25 12:55:15
    用矩阵形式标明《软件需求规格说明书》中出的各项功能需求与模块之间的对应关系。 外部接口 用户界面设计 基本原则 【说明】指出基本风格、屏幕总体布局和输入/输出的常规手段。 设计概述 【说明】本节的...
  • SQL沉思录(中文完整版)

    热门讨论 2013-02-18 18:25:55
    13.1.9 BIT标记、BOOLEAN其他计算 203 13.1.10 跨的属性分割 203 13.1.11 跨行的属性分割 203 13.1.12 跨表的属性分割 203 13.2 解决方法 204 13.2.1 基于游标的解决方案 204 13.2.2 半面向数据集的解决方案 ...
  • 253液晶分子排列的作用、种类分子排列方法70 254LCD的制作71 26LCD的各种驱动方式72 261各种驱动电极的结构72 262静态驱动74 263多路传输驱动74 264有源矩阵驱动76 27LCD的...
  • 技巧88 多数据合并成一 技巧89 运用文本运算符&或函数合并数据 技巧90 多行数据合并成一行 技巧91 行列区域直接转换 技巧92 多行多数据转为单列数据 技巧93 单列数据转为多行多数据 技巧94 ...
  • Oracle8i_9i数据库基础

    2010-03-03 14:16:58
    §1.9 伪列及伪表 46 §1.10 使用SQL Worksheet工作 46 第二章 查询基础 50 §2.1 SELECT语句 50 §2.2 SQL中的单记录函数 50 §2.2.1 单记录字符函数 50 §2.2.2 单记录数字函数 56 §2.2.3 单记录日期函数 62 §...
  • 3.2 名称的作用域 3.2.1 引用名称.  3.2.2 引用其他工作簿的名称 3.2.3 名称冲突 3.3 名称管理器 3.3.1 创建名称 3.3.2 编辑名称 3.3.3 删除名称 3.4 创建单元格和范围名称的快捷方法 3.4.1 “新建名称...
  • 12.4.1 测试嵌套表是否相等成员属性 12.4.2 检查元素是否是嵌套表的成员 12.4.3 执行高级集合操作 12.4.4 处理嵌套表中的重复数据 12.5 模式级别集合的维护 12.5.1 必需的权限 12.5.2 集合和数据字典 第13...
  • 3.2 名称的作用域 3.2.1 引用名称.  3.2.2 引用其他工作簿的名称 3.2.3 名称冲突 3.3 名称管理器 3.3.1 创建名称 3.3.2 编辑名称 3.3.3 删除名称 3.4 创建单元格和范围名称的快捷方法 3.4.1 “新建名称...
  • 在Oracle公司工作之前,Michael从Oracle 6开始分别担任过Oracle开发员、系统和业务分析员DBA。. Michael的著作还包括Oracle Dambase 10g Express Edition PHP Web Programming、Oracle Database 10g PL/SQL ...
  • 下面的例子使用了 FRAMESET 元素来定义页面中的三矩形。 , 50%, *"> COLS="25%,* " 垂直切割画面(如分左右两个画面),接受整数值、百分数, * 则代表占用馀下空 间。数值的个数代表分成的视窗数目且以逗号...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 224
精华内容 89
关键字:

列数字定义及作用