打印

小菜菜准备学C

小菜菜准备学C

恭喜楼主,系统奖励 3 金币
我是一个小菜菜,呵呵,对计算机根本不精通,在一个县城里上班,业余时间想学学C,也没有老师教,今天从我弟弟家里借了一本 c基础的书,我现在有电脑了,朋友给攒的,我挣了一年的钱呢,就卖了,家里人都挺反对的,但是我挺羡慕编写程序的人的,而且,我弟弟前几天教我装系统了,我准备用电脑学点东西,所以我选择了c,说他是最基础的,今天我看了10页书,晚上,白天还得上班,晚上看的,刚和哥们烧烤完,我还是提前回家看的,呵呵,我准备戒掉打麻将,专心学C ,先表一下决心。努力学习,水滴石穿,要有水滴石穿的精神,加油,虽然你在一个县城,但是你可以上网,就可以和打击沟通,现在书店什么书都有卖的,我要自学成才。加油。

TOP

鸿运当头,恭喜您获得 3 金币
今天我学习了第一章和第二章,知道了c的很多知识,比如,c程序的组成,包括定义数据结构和定义过程两部分,c是由main函数开始的,c可以有很多函数,也可以用系统函数,也可以自己构造函数,还知道了c的数据结构,比如int,float  char  等,明天晚上,或者白天我会继续学好它的,当然也不能耽误自己的本职工作,恩,加油

TOP

鸿运当头,恭喜您获得 2 金币
今天是公元5月24日
  
  小菜菜上班暂时没有事情做,就看了会书。看到了if语句, if语句就是条件语句,用它加上一个表达式就可以判断事情比如

   if 肚子饿

      吃饭。


    else

           不吃。

   而且还看了if和else的搭配问题,比如

      if(x>=0)

         if (x>0)

            a=1;
            
        else
                  a=-1
问题是else 是接上边哪个if的,书上说,else只能和最近的if匹配,所以上边是和第二个if匹配的,如果想和第一个if匹配,就得写成:

      if(x>=0)

        { if (x>0)

            a=1;}
            
        else

加一个大括号就可以了,呵呵,我聪明吧,而且我还想到一种方法,就是加一个空的else 和第二个if匹配,呵呵,刚才就研究这么多,不过我已经可以用if写程序了,下面就写一个在两个数中求最大数的程序。

    main()
   {
     int a,b;
     scanf("%d%d",&a,&b)
     if(a>b)
      printf("%d",a);
     else
     printf("%d",b);
   }

TOP

公元5月24日

   下班了,去菜市场买的芹菜,刚吃完,小萝卜下来了,我现在正吃小萝卜呢,就是红皮的那种,昨天研究c到了半夜12点半,一会我得休息了。
   学c算法很重要呀,我就是数学不行,有的时候算法不会,今天看了书很长见识呀。一个是求最大公约数,用辗转相除法,这个比较难还没弄明白呀,我弄明白了如何判断素数和和数,素数就是除了1和它本身没有其他约数的数,其实用电脑判断我觉得挺难的,不过书上的算法很简捷明了,用1,到它的一半,循环去除它,如果没有余数,就是和数,否则就是素数,错了,是用2,从2开始循环到它的一半,用这些数分别去除它,看看是否除的开,当然了,要是人作,这是个笨方法,人肉眼一看,就知道哪个数是不是素数,但是计算机循环是计算机的常处,你让它循环几千次它也不累。我写的程序如下。

   int sushu(int m)
{
   int i;
   for(i=2;i<=m/2;i++)]
   {
     if (m%i==0)
      return(1);
      else
     return(0);
    }
}
main()
{
  int m;
  scanf("%d",&m);
  printf("%d\n",sushu(m));
}
细想想如果别人不告诉你求素数是这个算法,你就是一辈子也想不出来呀,数学知识还得补习呀,真的。

TOP

公元5月24日下午

  下午也没什么事情,我用讯雷下载了一些C的教程,感觉还是很冗长,下午我把中午弄出来的哪个判断一个数是否是素数的例子丰富了,就是显示一个和数所有因数,这个程序在TC上调试成功了,这是我动手改的第一个书上的例子,形成于思,毁于随,我想我会成功的,恩,加油,现在把源代码写下来,

     main()
   
     {
       int m,i;
       scanf("%d",&m);
       for(i=2;i<m/2;i++)
          if(m%i==0)
          printf("%d",i);
    }

    还要先要对输入的数进行判断,就是必须得是正整数。所以开始要加一个if(m>0),然后执行,这样就可以依次输出一个数的所有因数,当然为了显示的整齐美观,可以在百分之D后变加入
%c。  学习中加入自己的东西,敢于疑问,才可以,你要努力,加油!!!下边,我要做一个对我来说有一点难度的算法问题,先把题目写在下边,看看晚上之前我能不能作出来,其实我做素数就是为了这道题作的,这道题时我在网上找到的,下面我就开始做了,大家见证,争取晚上之前,我作出来 ,先把它贴出来:
一个数如果恰好等于它的因子之和,这个数就成为“完数”。

例如, 6 的因子为 1 , 2 , 3 ,而 6=1+2+3 ,

因此 6 就是“完数”。编程序找出 1000 之内的

所有完数,并按下列格式输出其因子:

6=1+2+3 

呵呵,下午可能班上会有事情,我会努力去做的,等我的好消息
公元5月24日下午

  终于,在我的神机妙算下,解决了这道题目,刚才脑子有点疼,下楼绕了一圈,单位有点小事情,解决完了,回来把这道题详细算了一下,经过了从大处着眼的考虑,终于解决了该道题,并且,让我学会了一个解题方法,就是做什么事情都要先把程序的主干把握清楚。这也归功于这几天看书的结果,把原题复制如下:

  例如, 6 的因子为 1 , 2 , 3 ,而 6=1+2+3 ,

因此 6 就是“完数”。编程序找出 1000 之内的

所有完数,并按下列格式输出其因子:

6=1+2+3 
经过我刚才在TC下边的调试,得出的结果就是有3个数符合要求,6,28,和496,不知道我的结论是否正确,希望大家给我校正。

  我先把原程序写下来:
  
    main()
  {
    int a[100],j,i,sum=1,k=0,v;
    for(j=6;j<=1000;j++)
    {
      for(i=2;i<=j/2;i++)
       if(j%i==0)
         {
           sum=sum+i;
           a[k]=i;
           k++;
          }
        }
      if(j==sum)
        {
          printf("%d=1",j);
          for(v=0;v<k;v++)
           printf("+%d",a[v]);
           printf("\n");
         }
        sum=1;
        k=0;
}
}
这是我这几天独立完成的写出的最长的代码了,本来上午就想解决这道题,但是它涉及到素数,合数,还有因数等数学知识,所以我先从简单的问题入手,找到问题的症结所在,慢慢的,才有这道题的成功,我觉得我是做对了。

   我个人认为算法问题很重要,先从大处着眼,慢慢往上填写,最重要,
   首先,这道题要找到一个数的所有因数,好办,就和素数一个方法,然后,他要求所有因数的和,好办,迭代就可以了,SUM=SUM+I,就可以了,然后再判断和是否是和原来的值相等,相等就输出,但是输出模式要求很高,所以我用了一个数组,存贮所有的因子,用的时候,循环输出,这样就可以了,做这个程序容易出错的地方,我觉得有三点,就是循环完一个数的时候,SUM,I的值得归位,为下个数作准备,一直到1000,还有就是数组下标的时候,复职以后才使K++,所以到后来,K的值比数字的下标要多一个,要在循环里边抛出去,
也就是 for (v=0;v<k 注意不是,v小于等于K所以,这块当时我忽略了,不过后来我改掉了,就是最后一个负值完以后,还得执行一边K++ ,所以,这点需要注意,不知道你们看我做程序对不对,晚上,我要进一步的总结,这道题给我的经验,而且我准备向下一道题发起挑战,加油。

  快下班了,我们5点下班,回家以后晚上我要出去走走,不过我不会偷懒的,呵呵,
公元5月25日

   今天上午单位没什么事情,我又可以研究c 了,呵呵,下午就有事情了,下午领导来联查,又搞形式主义,呵呵,昨天看了我的那个判断素数的程序,发现了一个错处。
  main()
{
   int m,i;
   scanf("%d",&m);
   for(i=2;i<=m/2;i++)
   if(m%i==0)
   printf(" it is heshu\n")
   这里出了问题,就是如果没有余树为零,那么该数肯定是和数,如果后面这样接
  else
  printf("it is sushu");
毛病就出在这里,因为循环还没有结束,算法是从2 到原数的一半分别循环去除原数,看看是否有余树,所以你这次循环可能走的分支是else ,下次循环可能就是if 后变的,那么你就会输出很多的是素数,是和数,所以,判断的唯一入口或者说唯一的逻辑值就是等于0 ,可以跟踪一个变量,把这个变量赋于初值,然后如果等于零,就让变量变一个值,然后通过判断这个变量来判断是否是素数还是和数,这样就对了,昨天的理解很肤浅了。

    今天准备研究哥德巴赫猜想用C实现,刚才草草写了一个算法,不知道对不对,先做一下,算法分析,一会在去机子上调试,因为我现在用的是XP,所以还得去其他办公室的98上调试TC,在XP下调试TC觉得很不舒服,呵呵,先把我的想法写下来,可能会有点乱。

    一个大偶数,都可以写成两个素数之和。也就是要求,用scanf接收一个偶数,然后输出m=a+b 的形式,当然后变两个数都必须是素数,
  我是这样想的,用scanf接受一个偶数之后,找出所有小于这个偶数的所有素数,然后用这个偶数m 去减这个素数,在判断如果差还是素数,则输出,如果不是,用另外一个素数在尝试,直到不大于这个偶数了,
   程序分为,第一步,找出小于M的所有素数,
a=0;b=0
scanf一个M
    for(i=3;i<=m;i++)
     {
       for(j=2;j<=i/2;j++)
        if(i%j==0)
          a=1
        if(a==0)
   也就是如果这个时候从3到M之间找
出一个素数,也就是当A得零的时候,那么,求差
      n=m-i;
    在判断N是不是素数;
     for(j=2;j<=n/2;j++)
     if (n%j==0)
      b=1;
     if (b==0)
    printf("%d=%d+%d",m,i,n);
    如果没有,进入下一次循环,别忘记把该归位的变量,归位。
   b=0;a=0;
我日 又出现一个自己发 自己顶的  晕死:Q
Como se llama, bonita, mi casa, su casa

TOP

哥德巴赫猜想那道程序我已经调试成功了,呵呵,测试了好多偶数,原来好多偶数可以写成好多素数之和呀,但是上边的算法分析有点不对,但是是个小错误,在调试的时候已经纠正了,就是

判断第一个数是素数的时候,都是如果后边的,直到显示出结果来,我把我的原代码粘贴出来,大家可以看看对不对
main()
{
int cha,m,a=0,b=0,i,j;
scanf("%d",&m);
for(i=3;i<=m;i++)
  {
  for(j=2;j<=i/2;j++)
   if(i%j==0)
    a=1;
  if(a==0)
  {
   cha=m-i;
    if(cha>1)
    { for(j=2;j<=cha/2;j++)
      if(cha%j==0)
       b=1;
      if(b==0)
    printf("%d=%d+%d\n",m,i,cha);
    }
    }
   a=0;
   b=0;
  }
}
真累呀,一边上班一边自学,不过人总要有点追求,对吧,要坚持,加油!!,不要退缩,不要被环境左右,大家一起努力!!!

TOP

鸿运当头,恭喜您获得 1 金币
树欲静而风不止,今天来了很多给我介绍对象的,也许是星期天的缘故吧,所以就中止了学C的路程,不过下午我又学了点,呵呵,
  今天我知道了一个概念,就是数决结构和算法,呵呵,下边我就把我作的几道题写出来

  第一,兔子繁殖问题
其实就是一个规律的数列,找出规律,让你求第N项,就如同以前学习的等差数列一样,

  1,1,2,3,5,8,13,21

呵呵,让你求,如果你求第N项,很难吧,我记得好像考公务员很多这样的数列题,可惜那个时候我不会C 呀

   a1=1,  a2=2,  a3=a1+a2;

也就是说 ,每次循环都是后两个数相加
  a3=a1+a2
  这是第一次循环,第二次,就是
a4=a2+a3,当然要是循环,我们不可能这样写,我们可以利用赋值的方法导一下变量,导是倒爷的导呵呵,
  就是
   a1=a2;
   a2=a3;
然后显示a3,当然了,循环一次,出a3,循环n次,就出n+2项了,所以求第n项,就循环n-2次就行了,程序就形成了
main()
{
int n,a=1,b=1,i,c;
scanf("%d",&n);
for(i=1;i<=n-2;i++)
{
   c=a+b;
   a=b;
   b=c;
  }
  pritnf("%d",c);
}
下面来研究一个更难的数列,呵呵,是个母牛,第四个年头开始每年下一个,呵呵
1,1,1,2,3,4,6,9,
呵呵,这个题更绕脑子呀
a1=1, a2=1,  a3=1, a4=2, a5=3
规律就是:
a4=a1+a3
a5=a2+a4
a6=a3+a5
a4=a1+a3
   a1=a2
   a2=a3
   a3=a4
循环结束,第一次求出第四项的直,循环N次求出n+4项目的直,求第n项的话,就让他循环n-4次,就可以了。
下面解决爱因斯坦的阶梯问题:
x%2=1
x%3=2
x%5=4
x%6=5
x%7=0
求X,呵呵,这道题目有点难,可以利用书上说的穷举法来作,就是让循环起来,一个一个尝试,尝试到了满足的条件就,退出。
x%2=1
x%3=2
x%5=4
x%6=5
x%7=0
可以想象x是7的倍数,而且是基数,循环的范围就可以缩小导,x=7,
x=x+14
在这样一个范围哪循环
if(x%3==2 && x%5==4 && x%6==5)
printf("%d",x);
break
前边加一个while(1)
然后用break 退出就行了,
刚才我学习了这个数列的两个问题,和一个阶梯问题,一共三个问题,前两个问题用了迭代方法,最有一个用了穷举法。
下面我重点研究一下打印九九表的问题,它主要是一个多重循环,脑瓜透支了,一会去看看湖南卫士去,呵呵
明天在研究吧

TOP


当前时区 GMT+8, 现在时间是 2008-11-22 14:18 苏ICP备06039509号 当当网

Designed By 17DST Discuz! Support Team | Discuz!支持团队