• 重新学习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 在打印,显示的结果完全不同,而直接在函数中打印出来,就是正确的,很困惑。

  • 相关阅读:
    如何写好电子邮件
    【SQL查询】正则表达式匹配字符串_regexp_like/substr/instr/replace
    python_安装第三方库
    【SQL查询】分区查询Over
    【SQL查询】树结构查询
    【PL/SQL编程】块结构
    STL初探
    普及C组第四题(8.18)
    来纪中的的第18天
    来纪中的第十七天
  • 原文地址:https://www.cnblogs.com/ikodota/p/2283258.html
Copyright © 2020-2023  润新知