[活动]C语言大赛

CSDN 2009-02-15 06:12:59
加精
为了更好服务与CSDN社区,CSDN与机械工业出版社华章公司联手主办“C语言代码”征集大赛。

活动背景:
C程序设计思想与方法


图书频道在线阅读http://club.book.csdn.net/book/251840.html
图书目录:http://club.book.csdn.net/book/251840.html

这本书不是一本关于C语言本身的书,而是一本关于使用C语言进行程序设计的书。
希望读者能通过本书掌握程序设计的基本方法,使用C语言编程解决具有一定规模的小型问题,能够比较顺利地写出包含几十行、几百行源代码甚至更长一点的程序,能够了解和掌握对程序质量评估和改进的基本思想和方法,能够为进一步培养和发展自己的专业化程序设计能力打下良好的基础。
本书面向对C语言和数据结构等相关知识有基本的了解、又希望提高自己实际程序设计能力的读者,既包括计算机以及相关专业的学生,也包括刚刚走上工作岗位的专业人员。本书主要讨论中小规模程序的分析、设计和实现过程、指导原则、以及常用的方法,并结合例题介绍这些方法和原则在实际编程中的具体运用。

活动时间:
2009年2月15日——2009年3月16日


作者介绍:
尹宝林:1973年10月毕业于北京航空学院计算机专业,1984年获英国爱丁堡大学博士学位。现任北京航空航天大学计算机系教授、博士生导师。从事计算机专业教学和科研工作多年,曾主讲《C语言程序设计》、《高级语言程序设计》、《UNIX程序设计环境》、《计算机图形学》、《图像处理》等课程,其中《高级语言程序设计》被评为北京市精品课程。主编过《离散数学》教材一部。参加全国信息学奥林匹克(NOI)活动的组织与指导工作,任全国信息学奥林匹克科学委员会副主席。
参与要求:

一 参与活动必须为CSDN论坛注册会员;
二 活动采用两种形式:

1.简答题:
说明:
(1)为了便于最终测试评定,提交的每个程序都必须带有in.txt,out.txt,前者表示数据数据文件,后者表示输出数据文件,同时代码要求必须有详细注释;
(2)提交作品时要求带有可执行文件,直接执行程序,即可从in.txt读取输入数据,最后把输出结果保存到out.txt。
(3)可实现多组输入。

活动细则:
(1)代码规范:使用标准C语言,采用编程标准可以使项目更加顺利地完成。
(2)性能:应用程序运行正常,可以执行用户或客户所需的所有任务,并不意味着程序在任何方面都是完美的,更高的运行性能才能我们所追求的。
(3)简洁:写代码是一种艺术。除了正确的缩进、大小写、命名规则之外,请时刻牢记爱因斯坦的名言--简单就是美。
(4)每位会员可以发表多个代码,以最高评价为准,不可重复获奖;
(5)提交代码请跟帖发表,并附相关系统环境及编译环境说明

2.读样章写感受
我们提供前言、第2章及第8章的内容提网友点评。评论内容是本书对您的工作学习产生了怎样的影响,以及您自己真实的体会。

简答题目:请点击下载

请使用第一种方式参赛者通过邮件方式将程序发送到webmaster@csdn.net,在邮件的主题标明:C代码大赛 论坛ID即可。其次在论坛的回复中贴出代码中比较关键的部分,以便核实。

请第二种方式的参赛者直接回帖即可。

奖项设置:
奖品:
入围奖:十名,由机械工业出版社提供图书一本。
代码优胜奖:三名,由机械工业出版社提供图书一本,论坛200可用分奖励。
书评优胜奖:二名:由机械工业出版社提供图书一本,论坛200可用分奖励。

所有获奖人员不可重复。评奖由:机械工业出版社决定,其活动解释权归机械工业出版社。
...全文
17482 341 打赏 收藏 转发到动态 举报
写回复
用AI写文章
341 条回复
切换为时间正序
请发表友善的回复…
发表回复
musiclee 2009-03-16
  • 打赏
  • 举报
回复
学习学习
就呆在云上 2009-03-16
  • 打赏
  • 举报
回复
相信主办方!
mop2008 2009-03-16
  • 打赏
  • 举报
回复
第五题部分答案
#include "1.h"

int main(void)
{
FILE *fp;
int i , j , u , v , k , m , n;
int cout_A , cout_B; //A,B各数组元素的个数
//标准文件输入
if((fp = fopen("1_1.txt","r")) == NULL)
printf("不能打开1_1.txt"); // 打开失效
//输入顺序为,k,m,n,u,v
fscanf(fp , "%d %d %d %d %d" , &k,&m,&n,&u,&v);
fclose(fp);

cout_A = k * m ; //数组A的元素个数
cout_B = k * n ; //数组B的元素个数

Arry L_A , L_B ; // 声明A,B两表

Init_arry( L_A ); //初始化表A
if( L_A.listsize < cout_A )
if(!Add_arry( L_A , cout_A - L_A.listsize))
return -1; // 使表A的大小和A数组一样大

Init_arry( L_B ); //初始化表B
if( L_B.listsize < cout_B ) //使表B的大小和B数组一样大
if(!Add_arry( L_B,cout_B-L_B.listsize)) /*加数组*/
return -1;
//输入数组A, k列,m行,A【k】【m】
if((fp = fopen("1_A.txt","r")) == NULL)
printf("不能打开1_A.txt"); //打开失败

for(j=0;j<m;j++){ // 行
for(i=0;i<k;i++)
{
fscanf(fp , "%lf" , &( L_A.elem[i+k*j] ) );
}
}
fclose(fp);

//输入数组B, n列,k行,A【n】【k】
if((fp = fopen("1_B.txt","r")) == NULL)
printf("不能打开1_B.txt"); //打开失败
for( j = 0 ; j < k ; j ++){ // 行
for( i = 0 ; i < n ; i ++) //列
{
fscanf(fp , "%lf" , &( L_B.elem[i+n*j] ) );
}
}
fclose(fp);

double result = Caculate( L_A , L_B , u , v , k , n ); //返回Cuv


if((fp = fopen("1_result_out.txt","w")) == NULL) //输出到文件
printf("不能打开1_result_out.txt");
fprintf( fp , "C[%d][%d]=%8.6lf" , u , v , result );
fclose(fp);

return 1;

}//MAIN



第六题部分答案
#include "6.h"

int main(void)
{
FILE *fp;
int X[14] , n , Sum , k;

if( (fp = fopen("in.txt" , "r" )) == NULL)
cout<< "不能打开in.txt" << endl; //打开失败

if(!fscanf( fp , "%d" , &k ))
cout<<"不能读取k"<<endl;
int i = 0;
do{
if(!fscanf( fp , "%d" , &X[i]))
cout<<"不能读进数组"<<endl;

}while(fgetc(fp) != EOF); //读到文件结束
X[i] = NULL ; /*最后的那个数组元素无效*/

fclose( fp );

n = i - 1 ; //n表示xi的个数
if(!(Sum = Count_Prime( X , n , k ))) //计算质数的个数
return -1; //不能正确返回

if((fp = fopen("out.txt" , "w" )) == NULL ) //打开out.txt
cout<<"不能打开out.txt" <<endl; // 打开失败
fprintf( fp , "质数个数为:%d" , Sum ); //输入到out.txt
fclose( fp ); // 关闭文件指针

return 1;
}//main

第七题部分答案
#include <iostream.h>
#include <conio.h>
#include <stdio.h>



int main(void)
{
FILE *fp;
int max , min ;
float sum ;
int count = 0 , i = 0;
int k , n;
char word ; //用来 标记空格的字符
sum = 0.00; //和初始化
cout << "输入k的值(k<26)" << endl;
scanf( "%d" , &k ); //输入k的值
if( (fp = fopen( "date.in" , "r" )) == NULL) // 打开date.in
cout << "不能打开 date.in" << endl;
do{
if(i == k-1){
fscanf( fp , "%d" , &n); //如果是所取,就将其附到n上
count ++ ; //计算所取的整数
sum += n ;
}//if

if(count == 1) //定义max 和min 的初始值
max = min = n;
word = fgetc( fp ); //从文件获取一个字符

if( word == ' ') //如果是空格
i++ ;

if(word == 10 ) //如果是换行字符
{
if(i < k - 1) //如果此行没有第k个整数,对n赋值0
{n=0; count ++;}
else i = 0; //进入下一行
}//if

if(n > max)max = n;
if(n < min)min = n;
}while( word != EOF ); //读到文件结束符
fclose(fp);

if((fp=fopen("date.out" , "w")) == NULL )
cout<<"不能打开date.out";
fprintf( fp,"平均数是:%.2f.最小的数是:%d。最大的数是: %d 。",
sum/count , min , max);
fclose(fp);



return 1;
}
zdw2521 2009-03-16
  • 打赏
  • 举报
回复
看看
白夜花寒 2009-03-16
  • 打赏
  • 举报
回复
今天是3月16日,本帖回复参赛,以该帖进行截至。

邮件参赛截至到2009年3月16日晚上22:00.

奖项将在2个星期内由评选出来。请大家安心等待。

另外,社区近期还将举行一系列有奖活动,希望大家多多参与和支持
darlingbbx 2009-03-15
  • 打赏
  • 举报
回复
/*第4题,在vc6.0下测试通过*/

#include <stdio.h>
#include <stdlib.h>
/*计算对Number!做因子分解后Factor因子的个数并返回*/
int GetFactorNumber(unsigned Number, unsigned Factor)
{
int result = 0;
if(Factor < 2 || Number < 1)
return -1;
while(Number >= Factor)
result += Number /= Factor;
return result;
}



/* 统计1-Number之间的数字中以Digit为尾数的个数*/
int GetLastDigitTimes(unsigned Number, unsigned Digit)
{
if(Number % 10 >= Digit)
return Number / 10 + 1;
return Number / 10;
}

/* 计算Number的Times次方*/
int Power(int Number, int Times)
{
int result = 1;
while(Times--)
result *= Number;
return result;
}

/* 计算Number!的最右非零位并输出方法2*/
int GetLastDigitB(unsigned Number)
{
int result = 1;/*这是连乘法的基础值,也是最后要返回的结果*/
int i;/*循环变量*/
int tmp;/*循环中用到的临时值*/
int Count = 0;/*记录找到的因子2的个数,直到和因子5的个数相等*/
int TotalFactors = GetFactorNumber(Number, 5);/*因子5的总数*/
int T2, T3, T4, T7, T8, T9;/*指示以2,3,4,7,8,9为尾数的个数*/
/*下面依旧是排除因子2的过程*/
for(i = Number; i >= 1; i--)
{
tmp = i;
while(tmp % 2 == 0 && Count < TotalFactors)
{
tmp /= 2;
Count++;
}
while(tmp % 5 == 0)
tmp /= 5;
tmp %= 10;
result *= tmp;
result %= 10;
if(Count == TotalFactors && i % 5 == 1)
break;
}
i--;

/*因子2排除完毕,开始使用新方法统计各尾数出现次数并对自身的周期取模*/
T2 = GetLastDigitTimes(i, 2) % 4;
T3 = GetLastDigitTimes(i, 3) % 4;
T4 = GetLastDigitTimes(i, 4) % 2;
T7 = GetLastDigitTimes(i, 7) % 4;
T8 = GetLastDigitTimes(i, 8) % 4;
T9 = GetLastDigitTimes(i, 9) % 2;

/*处理余下数据中的所有因子5*/
for(; i >= 1; i -= 5)
{
tmp = i;
while(tmp % 5 == 0)
tmp /= 5;
tmp %= 10;
result *= tmp;
result %= 10;
}

/*处理得到的不同尾数的出现次数*/
result *= Power(2, T2);
result *= Power(3, T3);
result *= Power(4, T4);
result %= 10;
result *= Power(7, T7);
result %= 10;
result *= Power(8, T8);
result %= 10;
result *= Power(9, T9);
result %= 10;
return result;
}

int main()
{
int n=0;
FILE *pr,*pw;
if((pr=fopen("in.txt","rb"))==NULL)
{
printf("read error,there is no in.txt!");
exit(0);
}
if((pw=fopen("out.txt","wb"))==NULL)
printf("read error");
while(!feof(pr))
{
fscanf(pr,"%d",&n);
printf("the last number of %d! is %d.\n",n,GetLastDigitB(5000));
fprintf(pw,"the last number of %d! is %d.\r\n",n,GetLastDigitB(5000));
}
fclose(pr);
fclose(pw);
return 0;
}
t1397018 2009-03-15
  • 打赏
  • 举报
回复
是啊,今天结束了,刷新了N遍也没找到主办方又什么表示
虽然对获奖不报什么希望但是还是希望能够看到对自己的建议和评价,毕竟7道题目代码加起来有上千行,我可是间断的写了2个多星期啊~!
门后面的猫 2009-03-15
  • 打赏
  • 举报
回复
什么时候发奖品啊,有个时间吗
wuyanchao 2009-03-15
  • 打赏
  • 举报
回复
最后一天了,在来贴一题:
第五题,由随机数产生输入浮点数矩阵

#include "time.h"
#include "stdlib.h"
#include "stdio.h"
#define MAX 300
double a[MAX][MAX]={0},b[MAX][MAX]={0},c[MAX][MAX]={0};

int main(int argc, char* argv[])
{

FILE *infile,*outfile;
if((infile=fopen("in.txt","r"))==NULL)
{
fprintf(stderr,"in.txt open Error!\n");
return -1;
}
if((outfile=fopen("out.txt","w"))==NULL)
{
fprintf(stderr,"out.txt open Error!\n");
return -1;
}

int M=0,K=0,N=0;//接受矩阵行列数
fscanf(infile,"M1=%d*%d M2=%d*%d",&M,&K,&K,&N);

srand((unsigned)time(NULL)); //随机数种子
int i,j,k;

for( i=0;i<M;i++)
for( j=0;j<K;j++)
{
a[i][j]=rand()/(rand()/100.5);
}
for(i=0;i<K;i++)
for( j=0;j<N;j++)
{
b[i][j]=rand()/(rand()/100.5);
}
for( i=0;i<M;i++)
for( j=0;j<N;j++)
for(k=0;k<K;k++)
c[i][j]+=a[i][k]*b[k][j];

for(i=0;i<M;i++)
for(j=0;j<N;j++)
fprintf(outfile,"%0.6f ",c[i][j]);
fclose(infile);
fclose(outfile);
return 0;

}

wcq412 2009-03-14
  • 打赏
  • 举报
回复
心有余而力不足啊。。。。学习一下
yoyowinwin 2009-03-14
  • 打赏
  • 举报
回复
这么好的活动,我才知道,真可惜
yuxuan_sz 2009-03-14
  • 打赏
  • 举报
回复
N!的最后一位数字

#include "stdafx.h"
#include <stdio.h>

//定义数组,初始化后代替各位数字的乘法计算
int a[9][9];
#define multiply(x,y) a[x-1][y-1]

//iNum为返回的分解因式后5的个数,iLast 返回分解因式后另一个数的个位数字,
//如果输入的值为10的倍数,则会先消去末尾的0
bool NunberOfFive(int iItem, int *iNum, int *iLast)
{

if(iItem%5 !=0)
{
*iNum = 0;
*iLast = iItem%10;
return true;
}
int itmp = iItem;
while(itmp%10 == 0)
{
itmp = itmp/10;
}

while(itmp%5 == 0)
{
(*iNum)++;
itmp = itmp/5;
}

*iLast = itmp%10;
return true;
}


//返回N!的最后一位非零数,比如,2! = 2; 5!= 2
//N < 10000
int LastDigit(int n)
{
if (n <= 0)
{
return -1;
}

for(int i = 0;i< 9; i++)
{
for(int j = 0; j< 9;j++)
{
a[i][j] = ((i+1)*(j+1))%10;
}
}

int iNumFive = 0;
int iLast = 1;
for(i =n;i>=1;i--)
{
//使用2消去因式分解中存在的5
if(((iNumFive >0) && (i%2 == 0))&&(i%10!=0))
{
iNumFive--;
iLast = multiply(iLast,(i/2)%10);
continue;
}

int itmpNumber=0,itmplast=1;
NunberOfFive(i, &itmpNumber, &itmplast);
iNumFive+=itmpNumber;
iLast = multiply(iLast,itmplast);
}
return iLast;
}

int main(int argc, char* argv[])
{

for( int i = 1; i<= 10000; i++)
{
int itmp = LastDigit(i);
printf("i=%d,Last digit=%d. ",i,itmp);

}
return 0;
}

碎方脸 2009-03-14
  • 打赏
  • 举报
回复
第二题搞定:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define Hour_PerDegree_Mins ((float)60*12/360) //对于时针,几分钟一度
#define Min_PerDegree_Mins ((float)60/360) //对于秒针,几分钟一度

int main(void)
{
unsigned char hour,min;
float HourDegree, MinDegree, result;

printf("Pls input a time!\n"
"Format:[Hour:Min]\n");
scanf("%d:%d",&hour,&min);

if( hour>23 || hour<0 )
{
printf("Illegal Hour!\n");
return -1;
}

if( min>60 || min<0 )
{
printf("Illegal Minute!\n");
return -1;
}

hour %= 12;

HourDegree = (hour*60+min)/Hour_PerDegree_Mins;
MinDegree = min/Min_PerDegree_Mins;

printf("%.03f\n",HourDegree);
printf("%.03f\n",MinDegree);

if( HourDegree > MinDegree )
result = HourDegree - MinDegree;
else
result = MinDegree - HourDegree;

if( (result - 180) > 0)
result = 360 - result;
printf("%.03f\n",result);
return 0;
}
t1397018 2009-03-14
  • 打赏
  • 举报
回复
我很早就提交了~~~明天就结束了,怎么看自己成绩呢 ?
mop2008 2009-03-13
  • 打赏
  • 举报
回复
第四题答案
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <process.h>

int fac_lastnum( int n )
{
int NUM;
int count = 1;
NUM=n;
while(NUM>1)
{
n=NUM;
while(n % 10 == 0) /*消除尾部0*/
{
n /= 10;
} //while
n %= 10;
count *= n;
while(count % 10 == 0) /*消除结果尾部的0*/
{
count/=10;
}
count %= 10 ;
NUM --;
}
return count;
}
main(){
FILE *fp;
int N , last_0number;

if((fp=fopen("in.date" , "r")) == NULL)
printf("不能打开in.date"); /*打开in.date文件*/
fscanf(fp , "%d" , &N ); /*读取N的值*/
fclose( fp );

last_0number = fac_lastnum(N); /*计算N!的最后一位非零数*/

if((fp = fopen("out.date" , "w")) == NULL)
printf("不能打开out.date"); /*打开文件out.date*/
fprintf( fp , "%d!的最后一位非零数是:%d", N ,last_0number );

return 1;
}
mop2008 2009-03-13
  • 打赏
  • 举报
回复
第三题部分答案
#include "2.h"


int main(int argc, char *argv[])
{

FILE *fp;
int h,m;
float Ang;
if((fp=fopen("in.txt","r"))==NULL)
{
printf("不能打开in.txt"); /*打开文件in.txt失败*/
return -1;
}
if(fscanf(fp,"%d",&h)==0)return -1; /*从文件输入小时*/
if(fscanf(fp,"%d",&m)==0)return -1; /*从文件输入分钟*/
printf("hour=%d\n" , h); /*显示输入的时间——小时*/
printf("minite=%d\n" , m); /*显示输入的时间——分钟*/

if((Ang=min_ang(m)-hour_ang(h))<0)Ang=-Ang; /*比差度数小于零就取反数*/
if(Ang>180.00)Ang=360-Ang; /*比差度数大于180,取差值*/
printf("时钟和分针的夹角为:%f度\n",Ang); /*屏幕显示*/
fclose(fp); /*关闭文件指针*/

if((fp=fopen("out.txt","w"))==NULL)
return -1; /*打开out.txt文件,并输出到该文件*/
fprintf(fp,"%d点%d分时针和分针的夹角为:%f度", h ,
m ,Ang); /*输出到文件*/
fclose(fp); /* 关闭文件指针*/
getchar();

}
mop2008 2009-03-13
  • 打赏
  • 举报
回复
第一题的部分答案
#include "1.h"
int main(int argc, char **argv){

int w,h,ang;
FILE *fp;
if((fp=fopen("in.txt" , "r")) == NULL)
printf("不能打开in.txt"); /*打开in.txt文件失败*/
fscanf(fp , "%d" , &w); /*从文件中输入w,宽度*/
if(w>80){
printf("宽度必须小于80");
return-1;
} /*宽度要小于80*/
fscanf(fp , "%d" , &h); /*从文件输入h, 高度*/
fscanf(fp , "%d" , &ang) ; /*从文件输入ang,度数*/

fclose(fp);
if(func(w,h,ang)) /*画图*/
return 1;

}/*main*/


第二题部分答案
#include "2.h"


int main(int argc, char *argv[])
{

FILE *fp;
int h,m;
float Ang;
if((fp=fopen("in.txt","r"))==NULL)
{
printf("不能打开in.txt"); /*打开文件in.txt失败*/
return -1;
}
if(fscanf(fp,"%d",&h)==0)return -1; /*从文件输入小时*/
if(fscanf(fp,"%d",&m)==0)return -1; /*从文件输入分钟*/
printf("hour=%d\n" , h); /*显示输入的时间——小时*/
printf("minite=%d\n" , m); /*显示输入的时间——分钟*/

if((Ang=min_ang(m)-hour_ang(h))<0)Ang=-Ang; /*比差度数小于零就取反数*/
if(Ang>180.00)Ang=360-Ang; /*比差度数大于180,取差值*/
printf("时钟和分针的夹角为:%f度\n",Ang); /*屏幕显示*/
fclose(fp); /*关闭文件指针*/

if((fp=fopen("out.txt","w"))==NULL)
return -1; /*打开out.txt文件,并输出到该文件*/
fprintf(fp,"%d点%d分时针和分针的夹角为:%f度", h ,
m ,Ang); /*输出到文件*/
fclose(fp); /* 关闭文件指针*/
getchar();

}
ghbst 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 xiaoxiaochi 的回复:]
第2题
#include <string>
#include <sstream>
#include <iostream>

using namespace std;

void gettime(int &h,int &m) //数据读入
{
string time;
cout < <"Enter h:m";
cin>>time;
string st,sm;
int pos=0;
int pre_pos=0;
pos=time.find_first_of(':');
st=time.substr(pre_pos,pos-pre_pos);
sm=time.substr(pos+1,time.size()-pos);
h=atoi…
[/Quote]
printf("%.3f",A);    
system("pause");
main函数后面得有个返回吧

整体来说,这代码都蛮不错的。
return 0;

marsara 2009-03-13
  • 打赏
  • 举报
回复
有空也来试试
ghbst 2009-03-13
  • 打赏
  • 举报
回复
奋斗之余过来看看进展如何了
加载更多回复(321)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧