**

C语言学习小结

**
这学期学了C语言,对C语言有了一个简单的了解与初步的认识。首先从程序结构的使用与学习开始学起,到后来数组、函数的初步了解,能够开始解决一些简单的C语言问题,但是要想深入解决一些难题,还要等到下学期学习算法及函数、指针的深入才能做到得心应手。这学期只是认识阶段,下学期的任务很重,C语言的学习道路才刚刚开始,一切都是任重而道远。
这次博客根据之前的几次博客做一些补充及注意问题,另外列举一些例题来加深对知识点的使用。
一、首先从输入输出写起,scanf()型要注意取地址符的使用,不要漏掉,但是输入字符数组时,字符串名称前是不加的,例:scanf(“%s”,字符串名称)。
printf()型输出可以规定其输出格式,此时较cout型输出简单,例:对double型变量a保留3位小数输出,用printf()型为printf(“%.3lf\n”,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语言解决更多的问题。