zoukankan      html  css  js  c++  java
  • 重新学习C语言

          高中快毕业的时候,计算机老师对我说,QBASIC你学的不错了,可以学习C语言了,于是跑遍了整个县城的书店,才找到一本C语言的教材和几年的电脑爱好者合订本。在暑假里,全靠记忆学习,差不多半个月看完了整本书,虽然没有计算机来实际编程,但是还是很有效(年轻记忆力好),刚上大学的时候就能编写很多小程序,都已经超过大学教科书的范围,比如C语言的鼠标控制以及图形化界面操作。

          工作以后几乎没有在用过C语言了,而都在学什么asp,javascript,html,xhtml,xml,xsl,css,VB6,VB2005,后来又学什么C#,php,和各种php框架。最近突然很怀念那时候时候的C语言了,于是把大学里的教材找出来重新看了看。

          编程环境变了,以前turbo C2.0,现在在windows下用Code::Blocks,Linux下用GCC, 至少我觉得在一个项目中编译多个文件要方便很多,必须要先编译obj在通过link链接了。也不需要 #include "test.c" 来包含其他C文件,只需要包含#include "test.h" 包含自己写的头文件。

      

          warning: implicit declaration of function '函数名',这种警告一般是函数没有在头文件中申明。

    练习作业

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include "basemath.h"
    #include "3.h"




    /*开始主函数*/

    int main()
    {
    printf("基础算法练习2:\n");
    printf("选择一个算法演示\n");
    printf("******************************************************\n");
    printf(" 1.连续累加\n");
    printf(" 2.组合累加\n");
    printf(" 3.计算阶乘\n");
    printf(" 4.带步长的阶乘\n");
    printf(" 5.打印素数\n");
    printf(" 6.打印m和n的最大公约数和最小公倍数\n");
    printf(" 7.打印闰年\n");
    printf(" 8.计算圆的面积和周长\n");
    printf(" 9.计算矩形的面积和周长\n");
    printf(" 0.退出程序\n");

    printf("******************************************************\n\n");

    //int key;
    xx: printf("请选择一个演示(1-n):");
    int key; //菜单选择
    scanf("%d", &key);
    printf("\n");

    int m,n,s; //可能传入的参数
    int r;

    switch(key)
    {
    case 1:
    printf("求从1到n的顺序累加结果,请输入n的值(整数):");
    scanf("%d",&n);
    printf("计算结果为:%d \n", my_lianxu_leijia(n));
    break;
    case 2:
    printf("求从1到n的组合相加的结果,请输入n的值(整数):");
    scanf("%d",&n);
    printf("计算结果为:%d \n", my_maxmin_leijia(n));
    break;

    case 3:
    printf("求n的阶乘的结果,请输入n的值(整数):");
    scanf("%d",&n);
    printf("计算结果为:%d \n", my_jiesheng(n));
    break;
    case 4:
    printf("求n的阶乘(带步长)的结果,请输入n的值和步长s(都为整数):");
    scanf("%d%d",&n,&s);
    printf("计算结果为:%d\n", my_jiesheng_step(n,s));
    break;
    case 5:
    printf("打印n以内的素数(整数),请输入n的值:");
    scanf("%d",&n);
    printf("计算结果为: \n");
    get_sushu(n);
    printf("\n");
    break;
    case 6:
    printf("打印两个数的最大公约数和最小公倍数,请输入m和n的值:");
    scanf("%d%d",&m,&n);
    printf("计算结果为: \n");
    zdgys_zxgbs(m,n);
    printf("\n");
    break;
    case 7:

    printf("打印m到n的年份,请输入m和n的值:");
    scanf("%d%d",&m,&n);
    printf("计算结果为: \n");
    print_run_nian(m,n);
    printf("\n");
    break;

    case 8:
    printf("计算圆的面积和周长,请输入圆的半径r:");
    scanf("%d",&r);
    printf("计算结果为: \n");
    //printf("矩形的面积为 %f ,周长为 %f\n", circle_area(r),circle_len(r));
    circle_area(r);
    circle_len(r);
    break;

    case 9:

    printf("计算矩形的面积和周长,请输入矩形的长(h)和宽(w):");
    scanf("%d%d",&m,&n);
    printf("计算结果为: \n");
    printf("矩形的面积为 %d ,周长为 %d\n",rectang_area(m,n),rectang_len(m,n));
    printf("\n");
    break;
    case 0:
    exit(1);break;
    }


    goto xx;
    }

    basemath.h

    /*自定义函数原型*/

    int add(int,int);
    int jian(int,int);

    int my_lianxu_leijia(int);
    int my_maxmin_leijia(int);
    int my_jiesheng(int);
    int my_jiesheng_step(int,int);
    void get_sushu(int);
    int is_sushu(int);

    int is_run_nian(int);
    void print_run_nian(int,int);

    void swap(int *,int *);
    void zdgys_zxgbs(int ,int);
     

    basemath.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>


    /*
    * 求n的累加值(连续的从1开始累加)
    * 运算加法次数就为maxnum次
    */
    int my_lianxu_leijia(int maxnum){

    int i,sumnum=0;

    for(i=1;i<=maxnum;i++){
    sumnum+=i;
    }
    return sumnum;
    }


    /*
    * 求n的累加值(组合成多个最大数的值)
    * num,1+(num-1)....n+(num-n)
    * 运算加法次数为 maxnum/2+1次
    */
    int my_maxmin_leijia(int maxnum){
    int i,sumnum=0;


    for(i=1;i<=maxnum/2;i++){
    sumnum=sumnum+maxnum;
    }
    if(maxnum%2==0){
    sumnum=sumnum+maxnum/2; //偶数个,加上剩下的maxnum/2的值;
    }
    else{
    sumnum=sumnum+maxnum; // 奇数个,加上少计算了的那次。
    }


    return sumnum;
    }

    /*
    * 求n的阶乘
    * 乘法次数为n次
    */
    int my_jiesheng(int maxnum){
    int i;
    long sum=1;
    for(i=1;i<=maxnum;i++){
    sum*=i;
    }
    return sum;
    }

    /*
    * 求n的阶乘,带步长s.
    * 乘法次数为(n/s)次
    */
    int my_jiesheng_step(int maxnum,int step){
    int i;
    long sum=1;
    for(i=1;i<=maxnum;i=i+step){
    sum*=i;
    }
    return sum;
    }


    /*
    * 判断一个数是否为素数.
    *
    */
    int is_sushu(int n){
    int i;
    int istrue=1;//素数状态,默认是素数

    for(i=2;i<=sqrt(n);i++){ //优化:把 (n-1) 优化为 sqrt(n):
    if(n%i==0){
    istrue=0; //任何一个能被整除,表示不是素数。
    break;
    }
    }

    if(istrue==0)
    {
    // printf("%d 不是素数.\n",n);
    return 0;
    }
    else
    {
    //printf("%d 是素数.\n",n);
    return 1;
    }
    }

    /*
    * 打印出100以内的素数
    * 素数:只能被1和自己整除的。
    *
    */
    void get_sushu(int n)
    {

    //int sushu_arr[n];
    int i;
    for(i=1;i<=n;i++){
    if(is_sushu(i)==1){
    printf("%d\t",i);
    }
    }


    }


    /*
    * 交换两个数
    *
    */
    void swap(int *a,int *b)
    {
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
    }

    /*
    * 打印两个数最大公约数 和最小公倍数
    * 辗转相除法
    *
    */
    void zdgys_zxgbs(int a,int b)
    {
    int m,n,r;
    if(a<b) swap(&a,&b);
    m=a;n=b;r=a%b;
    while(r!=0)
    {
    a=b;b=r;
    r=a%b;
    }
    printf("最大公倍数( %d, %d ) = %d\n",m,n,b);
    printf("最小公约数{ %d, %d } = %d\n",m,n,m*n/b);


    }



    /*
    * 判断是否是闰年
    *
    */
    int is_run_nian(int y)
    {
    int t=0;
    if(y%4==0 && y%100!=0)
    {
    t=1;
    }
    else if(y%100==0 && y%400==0)
    {
    t=1;
    }
    return t;
    }

    /*
    * 打印连续的闰年
    *
    */
    void print_run_nian(int s,int e)
    {
    int i;
    for(i=s;i<=e;i++)
    {
    if(is_run_nian(i)==1)
    {
    printf("%d\t",i);
    }

    }

    }

    3.h

    int rectang_len(int,int );
    int rectang_area(int,int);
    float pow2(int,int);

    void circle_area(int);
    void circle_len(int);




    3.c (第三章练习题)

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>



    #define PI 3.14159265

    //计算圆周长
    void circle_len(int r)
    {

    float len=0;
    len= PI*2*r;
    printf("周长为:%f\n",len);
    //return len;
    }

    //计算圆面积
    void circle_area(int r)
    {

    float area=0;
    area=PI* r*r;
    printf("面积为:%f\n",area) ;
    //return area;
    }

    //计算矩形周长
    int rectang_len(int w,int h)
    {

    int len= 2*(w+h);
    return len;
    }

    //计算矩形面积
    int rectang_area(int w,int h)
    {

    int area= w*h;
    return area;
    }

    //模拟幂指数函数
    float pow2(int a,int b)
    {
    float s=1;
    for(;b>=1;b--)
    s=s*a;
    return s;
    }

    在 3.h中 求圆的面积和周长时候,如果用return返回float或double 在打印,显示的结果完全不同,而直接在函数中打印出来,就是正确的,很困惑。

  • 相关阅读:
    微人事项目-mybatis-持久层
    通过外键连接多个表
    springioc
    Redis 消息中间件 ServiceStack.Redis 轻量级
    深度数据对接 链接服务器 数据传输
    sqlserver 抓取所有执行语句 SQL语句分析 死锁 抓取
    sqlserver 索引优化 CPU占用过高 执行分析 服务器检查
    sql server 远程备份 bak 删除
    冒泡排序
    多线程 异步 beginInvoke EndInvoke 使用
  • 原文地址:https://www.cnblogs.com/ikodota/p/2283258.html
Copyright © 2011-2022 走看看