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

原文地址:https://www.cnblogs.com/ikodota/p/2283258.html