zoukankan      html  css  js  c++  java
  • C语言学习小结

    **

    C语言学习小结

    **
    这学期学了C语言,对C语言有了一个简单的了解与初步的认识。首先从程序结构的使用与学习开始学起,到后来数组、函数的初步了解,能够开始解决一些简单的C语言问题,但是要想深入解决一些难题,还要等到下学期学习算法及函数、指针的深入才能做到得心应手。这学期只是认识阶段,下学期的任务很重,C语言的学习道路才刚刚开始,一切都是任重而道远。
    这次博客根据之前的几次博客做一些补充及注意问题,另外列举一些例题来加深对知识点的使用。
    一、首先从输入输出写起,scanf()型要注意取地址符的使用,不要漏掉,但是输入字符数组时,字符串名称前是不加的,例:scanf(“%s”,字符串名称)。
    printf()型输出可以规定其输出格式,此时较cout型输出简单,例:对double型变量a保留3位小数输出,用printf()型为printf(“%.3lf ”,a);用cout型则为cout<<setprecision(3)<<fixed<<a<<endl;当然此处都应用了换行符,这两类的换行也是不同的。
    另外scanf-printf要比cin-cout执行效率高。读写速度要快得多。
    二、对于取整问题,有时会涉及到向上取整或者向下取整,根据具体问题具体分析。ceil()属于向上取整,floor()属于向下取整。
    三、对于域宽的控制,可以使用setw()来控制。
    四、嵌套循环时外循环控制行,内循环控制列,不要混淆。
    例:描述
    根据参数,画出矩形。
    输入
    输入一行,包括四个参数:前两个参数为整数,依次代表矩形的高和宽(高不少于3行不多于10行,宽不少于5列不多于10列);第三个参数是一个字符,表示用来画图的矩形符号;第四个参数为1或0,0代表空心,1代表实心。
    输出
    输出画出的图形。
    样例输入
    7 7 @ 0
    样例输出

    @@@@@@@
    @     @
    @     @
    @     @
    @     @
    @     @
    @@@@@@@
    
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int main()
    {
        int a,b,i,j,x;
        char ch;
        cin>>a>>b>>ch>>x;
        if(x==0)
        {
            for(i=1;i<=a;++i)
            {
                for(j=1;j<=b;++j)
                {
                    if((i==1)||(i==a)||(j==1)||(j==b))
                    {
                        cout<<ch;
                    }
                    else
                    {
                        cout<<" ";
                    }
                }
                cout<<endl;
            }
        }
       else
        {
            for(i=1;i<=a;++i)
            {
                for(j=1;j<=b;++j)
                cout<<ch;
                cout<<endl;
            }
        }
        cout<<endl;
       return 0;
    }
    

    根据以上例题可以得出循环嵌套中高和宽(行和列)的问题,当然对于上面的规律也可以一行一行来打出。例:

    for(i=1;i<=b;i++)
    	cout<<d;
    	cout<<endl;
    	for(j=1;j<=a-2;j++)
    	{
    		cout<<d;
    		for(h=1;h<=b-2;h++)
    		cout<<" ";
    		cout<<d<<endl;
    	}
    	for(m=1;m<=b;m++)
    	cout<<d;
    

    来代替以上打出空心的情形。所以解这种规律性问题的方法有很多,相信下学期接触算法之后就更能体会到不同规律、不同方法解题的情形。如果我们能找到好的方法、规律,将会对我们的编程语句大大简化。
    五、对于经典的数字反转问题,又可以说是倒置排序,就是用了很巧妙的方法来解题。
    例:

    m=0;
    while(n>0)   //while(n!=0)
    {
    m=m*10+n%10;
    n=n/10;
    }
    cout<<m;
    

    就将n的数字倒置了。例:123变为321.
    六、当然对于以上数字如果想要正序输出,例:123以空格为间隔正序输出得1 2 3
    例:

    int q,v;
    	for(int i=1;i<=b;i++)
    	{
    	    q=pow(10,b-i);
            v=c/q;
    	    c=c-v*q;
    	    cout<<v<<" ";
        }
        cout<<endl;
    

    其中b代表数字位数,可通过循环结构求出。
    七、对于数字的基础问题还有求素数、最小公倍数、最大公约数等。在求素数问题上,例:

    for(int i=2;i<n;i++)
    {
    if(n%i==0)
    break;
    cout<<i;
    }
    

    表示判断的n是否为素数,当然这样判断多组数据时容易超时,可以进行一点优化,改为

    a=sqrt(x);
    for(int i=2;i<=a;i++)
    {
    if(n%i==0)
    break;
    cout<<i;
    }
    

    对于最小公倍数,例:

    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m*n;i++)
    {
    if((i%m==0)&&(i%n==0))
    {
    cout<<i;
    break;
    }
    }
    

    相对来说容易想到,但是也容易超时,下面再写一下改进之后的:

    int a,b,i,t;
    cin>>a>>b;
    if(a<b)
    {
    	t=a;
    	a=b;
    	b=t;
    }
    for(i=a;i<=a*b;i+=a)
    if(i%b==0)
    break;
    cout<<i;
    

    这样就不用一一测试排查,只测试了a的倍数的数值,当然也可以测试b的,但是数据就相对增多了一些,所以对a,b的大小进行了比较,只测试数据大的。
    八、说起对比大小,这时就想到数字排序问题。在比较大小时,可以通过引入变量来排,也可以通过函数或者swap()换序解决。不过这些都只适用于两位数字大小比较。当排序时,可以考虑sort函数,简便不易超时,也可以使用冒泡法等方法解决。

    通过以上几个例子简单说明一下思维的重要性,这学期初步认识C语言,就是要了解思维规律、算法的奥妙,这学期只是为下学期做了一个铺垫,属于认识阶段。希望下学期能够学好函数、算法,灵活运用C语言,用C语言解决更多的问题。

  • 相关阅读:
    关于范型
    c#.net实体类序列化方法  为什么要序列化
    游标示例
    干掉switch语句
    java面向对象总结(一)
    Java泛型简明教程(转)
    java 成员变量、局部变量、静态变量
    Java 集合类图(转)
    java泛型(擦除)
    java垃圾回收
  • 原文地址:https://www.cnblogs.com/study-hard-forever/p/12130085.html
Copyright © 2011-2022 走看看