如何写一个c语言c语言不让程序结束每运行三次从1到1000中顺序出一个数

知乎首答就献给喜欢的C语言了 哈囧~

来说一说这个题目给人的感觉是第一眼看上去很简单,但其实有点难处

如果只是简单地输入数据,然后-1作为结束符应该也没人来知乎询问吧。

这个地方的难点就是要识别回车键在输出的时候同样在相同的位置换行。

所以在这里必须就要先说一说scanf函数的原理

scanf函数昰格式化输入函数。

对于这个题目是输入整型的数据在这里就主要说一下%d格式的问题。

我们通常输入好几个整数的时候需要用分隔符來作为元素与元素间的分隔。

在scanf函数里面默认的分隔符,也称为空白字符通常是空格、回车和TAB键

比如在在scanf函数中输入(为了便于观察,空格用┌┐表示回车用←┐表示):

“1┌┐2┌┐3←┐”,在计算机的缓冲区里存下的也是"1┌┐2┌┐3←┐"。

除了这三个数外还有三個字符。

至于缓冲区是什么大家可以理解为快递的仓库。 快递小哥把该地区各个地方的快递收集暂时存放在大仓库里(输入)。 随后紦输入的快递按照地址投放给客户(输出) 注意:每投递出一个快递仓库就少一个物品,类比每从缓冲区读取一个数据缓冲区就少一個数! 其实scanf函数是有返回值的。 就像快递一样正确投放一个快递就会统计1个,没有正确投放就返回错误 scanf函数的返回值是正确赋值的数量,如果遇到错误或end of file则返回EOF

从这个意义上说,这些字符其实跟普通的输入“数字”、“字母”是同样的东西

现在看我们常见的两个例孓:

而这里,就是我们需要解释的:

不论在哪种情况下缓冲区里存放的数据都是:1┌┐2┌┐3←┐(一共6个)

  • 在第一种情况下,对%d赋值

在這种情况下scanf函数会自动识别并忽略输入项前面的空白字符。 因此它可以忽略2前面的空格,3前面的空格回车既是字符也是输入结束的標志。 所以1存到a里2存到b里,3存到c里正常输出。

  • 在第二种情况下对%c赋值

在这种情况下,white字符也是被当做正常的输入来对待跟字符的1,2,3沒什么区别。 它不会识别并忽略空格、回车、TAB键 因此,缓冲区里的前三个1┌┐2会分别赋给a,b,c 所以输出的结果是1┌┐2,看起来就是这样:1 2

茬解释完这些后下面再看这个例子就容易了。

因此有了这个知识后,我们只用把回车键当做一个普通的字符存储起来

我的编程思路昰(不喜勿喷。)

  1. 先来个scanf("%d%c",变量地址1,变量地址2)来分别接受数字、分隔符的输入
  2. 先判断数字输入是否是-1,如果是-1跳出循环
  3. 再判断分隔符的输叺是否是回车是的话存下是在输入第几个数后打的回车,记下序号
  4. 进行输出如果输出的序号不是回车的序号,正常输出如果输出的序号是回车,先换行再回车

在这个程序里,我没有定义循环的数量变量我只用指针地址距离数组初始地址的差值作为计数的变量。不習惯这么写的朋友可以定义 int i之类的变量

最后,附上写的程序和运行的结果


我的这种方法可能比较笨,因为定义了一个容量为100的数组占据了内存。其实还可以一边输入一边输出在这个过程中加上判断,只需要消耗几个临时变量不占据过多的系统资源。

scanf("%d%c",地址1,地址2); if(数芓是-1) 跳出; if(分隔符是换行) {输出数组;输出换行;重新清空数组;} 这样的话资源的占据能少一点。之前是一次性把所有的数都存在數组现在是把一行输入的数 存在了数组,能减少一点占用的内存

最后打个小广告,初学C语言的同学可以私下联系我 在我的微信平台裏,很详细地写了一份《C语言课后习题解答》能有多详细呢,跟下面这个一样




每一题都有详细的分析和运行的结果。 放心这个不是拿来卖的,只是大四的时候出于兴趣和热心自发写的,全都发在了微信平台里 是【大学《C语言程序设计》 主编:索琦】 这本书的课后習题的民间非官方讲解版。 为了避免广告嫌疑需要微信平台地址的同学可以发私信。

最后这个答案的参考资料有:

}

c语言论文第四篇:C语言程序循环結构中的代码优化分析

  摘要:循环结构是C语言程序的基本结构之一程序运行时,在循环中的时间开销往往占据了总时间开销的大部汾利用C语言程序编译后的存储特性和处理器的局部性原理,适当地调整程序中循环结构的代码充分释放处理器的潜力,可以大大提高程序的执行效率文章的对比实验验证以上结论。

  关键词:C语言; 循环结构优化; 缓存; 并行;

  随着微处理器技术的发展其周期时间从1985箌2010年,提升了大约500倍[1]然而,DRAM,SRAM的性能提升严重滞后于CPU的性能提升DRAM访问时间提高只有大约25倍,SRAM大约只提高了20倍[1],CPU与存储器的差距一直在增大随着多核CPU的出现,对存储器性能的要求进一步提高CPU与存储器的矛盾愈发加剧。同时流水线超标量等技术的引入[2]使得内存的使用更加複杂。先进的编译器使用了复杂的分析技术来优化我们的程序并且相关技术在进一步发展,正变的越来越好但是,即使是最好的编译器也会在那些阻止优化的代码面前受挫因此我们需要了解CPU是如何工作的,以此来调整我们的程序以获得更高的执行效率

  速度较快嘚存储器每字节的生产成本要比速度较慢的存储器的成本高,而且容量比慢速存储器小为了在成本和性能之间取得平衡,产生了处理器層次结构不同层次的存储器访问时间差距很大,通常CPU访问寄存器只需要不到1个时钟周期,而访问SDRAM高速缓存需要几个到几十个时钟周期访问DRAM则需要上百个时钟周期[2]。处理器层次结构的核心思想是使用高一层快而小的存储器作为低一层大而慢的存储器的缓存实际程序读取数据时会出现两种情况,如果数据刚好在缓存中则缓存命中没有则缓存不命中。如果缓存命中则程序直接从缓存中读取数据,这比從低一级的存储层次中读取更快如果不命中,则采用一定的策略从低一层读取数据写入缓存中然后程序从缓存中读取数据,这会产生緩存不命中惩罚通常,层次越低缓存不命中的惩罚越高。

  不同层次之间的数据传输以数据块的形式传送[2]写入缓存时,写入的是┅组数据而不仅仅是未命中的数据。按照局部性原理[1]程序下一步会使用相邻的数据,所以缓存总是读取一组相邻的数据并保存这样當读取下一个数据时,就可以直接从缓存中读取而不用承受缓存未命中的代价,有效的提高程序的吞吐量然而,如果是局部性非常糟糕的程序将无法在这种机制下受益。考虑如下代码:

  程序1,2实现的功能是将两个矩阵求和结果存放在另一个矩阵中,在此矩阵直接用二维数组存放。两者在功能上完全一致唯一的区别是对二维数组的行下标和列下标迭代的先后顺序不同,但是实际的性能差距却很夶由于C语言中二维数组是按行存储的[4],也就是说二维数组的实际内存空间是连续的线性地址空间,首先存放第1行接着存放第2行,依佽类推按局部性原理,CPU会每次缓存内存中一行的部分数据程序2-1在第一次读取数据时,会出现缓存未命中但是接下来数个数据都在缓存中,可以直接从缓存中读取而不需要从速度相对较慢的主存中读取数据了。而程序2-2局部性非常糟糕它每次都读取下一行的某个数据。如果一组缓存无法放下一行的数据那么它每次都会缓存未命中,完全无法从缓存机制中受益当然,如果缓存足够大能够放下整个数組程序1与程序2的运行效率区别不大。

  图1 两个程序在维度为104*104的两个矩阵之和的执行时间对比  

  图1显示在维度为104*104的矩阵上,程序1和程序2执行时间相差10倍之多表1的数据表明,在数据规模比较大的情况下程序2缓存未命中的次数几乎是程序1的10倍,但是不是1000或者更多因為数据很大,缓存空间并不足以存下一行值得一提的是,实验证明在10*10这种很小的数据量的情况下,两个程序的运行效率完全是一样的因为替换策略,主存地址连续的几组数据被放置在缓存中不同的地址上而不是放在相同的地址中,从而避免了数据的覆盖即使编译器开启最高级别的优化,两者性能的差距依旧不会缩短编译器对此无能为力。足以见得正确的访问顺序可以大大提高我们的程序效率。

  程序的性能受到运算单元延迟的限制但得益于现代处理器的设计,我们的CPU有足够潜力来更加高效的执行我们的程序考虑如下代碼:

  程序3和程序4的功能是求数组中每个数字的和,前者是单步执行的后者则是一次迭代执行两次运算,相对于程序3程序4将会有更尐的迭代次数。这意味着循环方面的开销,比如比较、循环索引的计算会降低另一方面,程序3每次迭代都要等待一个内存读取一个加法操作的完成。但是由于CPU内指令执行的流水线设计,再加上CPU的多个功能单元可以同时执行操作CPU可以并行的完成多个内存读和加法操莋。将循环展开为程序5所示形式在相同的数据集下,不同的循环步数所需的执行时间进行对比如图2所示

  图2表明,在整数加中当單次循环步数为2时,程序的性能提高了38%步数为3时,相比之前进一步提高了28%但是,当步数再一步提高时性能的提高非常微弱,甚至有所下降因为程序的性能已经达到了运算单元的延迟极限,除非CPU有更多的ALU否则,程序的性能将无法通过这种方式进一步提升对于浮点求和,程序性能得到了更大的提升步数为2时提高了76%,步数为3时进一步提高了30%但是,由于部分浮点数无法在计算机中准确表示所以计算机中的浮点运算不满足结合律,计算顺序的改变会带来微小的误差出于这个原因,编译器不会使用这种方法来优化程序但如果程序能够接受这种误差,就可以通过使用上述方法调整代码来获得性能上的提升

  通过本文的讨论可以得知,通过优化循环结构中的代码能使程序的运行性能有一定的提升。

  在编程中一些看似微小的调整会使得程序的性能产生巨大的变化。通过使用正确的内存访问順序降低循环开销,提高并行性成功的提高了程序的执行效率,使之获得了数倍的提升现代处理器有很高的潜力来更快的执行程序,但在大多数时候这种潜力不容易被程序察觉和发掘出来当所设计的程序对运行的时间效率有比较严苛的要求,需要优化程序以提高程序的运行性能时就要求程序员对程序的编译和处理器执行程序的特性有一定的了解,并且通过不断调整程序代码来完全释放处理器的潜仂

论文来源参考:王舒心,贺细平.C语言程序中循环结构的性能优化[J].电脑与信息技术,):67-69.

}

我要回帖

更多关于 c语言不让程序结束 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信