资源描述
------------------------------------------------------------------------摘自 宋鲁生 程序设计大赛
乘法口诀表
#include <stdio.h>
#include <conio.h>
void main(void)
{
int i,j,x,y;
clrscr();
printf("\n\n * * * 乘法口诀表 * * * \n\n");
x=9;
y=5;
for(i=1;i<=9;i++)
{
gotoxy(x,y);
printf("%2d ",i);
x+=3;
}
x=7;
y=6;
for(i=1;i<=9;i++)
{
gotoxy(x,y);
printf("%2d ",i);
y++;
}
x=9;
y= 6;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
gotoxy(x,y);
printf("%2d ",i*j);
y++;
}
y-=9;
x+=3;
}
printf("\n\n");
}
用一维数组统计学生成绩
#include <stdio.h>
void main()
{
char SelectKey,CreditMoney,DebitMoney;
while(1)
{
do{
clrscr();
puts("=========================");
puts("| Please select key: |");
puts("| 1. Quary |");
puts("| 2. Credit |");
puts("| 3. Debit |");
puts("| 4. Return |");
puts("=========================");
SelectKey = getch();
}while( SelectKey!='1' && SelectKey!='2' && SelectKey!='3' &&
SelectKey!='4' );
switch(SelectKey)
{
case '1':
clrscr();
puts("================================");
puts("| Your balance is $1000. |");
puts("| Press any key to return... |");
puts("================================");
getch();
break;
case '2':
do{
clrscr();
puts("==================================");
puts("| Please select Credit money: |");
puts("| 1. $50 |");
puts("| 2. $100 |");
puts("| 3. Return |");
puts("==================================");
CreditMoney = getch();
}while( CreditMoney!='1' && CreditMoney!='2' && CreditMoney!='3' );
switch(CreditMoney)
{
case '1':
clrscr();
puts("=========================================");
puts("| Your Credit money is $50,Thank you! |");
puts("| Press any key to return... |");
puts("=========================================");
getch();
break;
case '2':
clrscr();
puts("==========================================");
puts("| Your Credit money is $100,Thank you! |");
puts("| Press any key to return... |");
puts("==========================================");
getch();
break;
case '3':
break;
}
break;
case '3':
do{
clrscr();
puts("====================================");
puts("| Please select Debit money: |");
puts("| 1. $50 |");
puts("| 2. $100 |");
puts("| 3. $500 |");
puts("| 4. $1000 |");
puts("| 5. Return |");
puts("====================================");
DebitMoney = getch();
}while( DebitMoney!='1' && DebitMoney!='2' && DebitMoney!='3' &&DebitMoney!='4' && DebitMoney!='5' );
switch(DebitMoney)
{
case '1':
clrscr();
puts("===========================================");
puts("| Your Debit money is $50,Thank you! |");
puts("| Press any key to return... |");
puts("===========================================");
getch();
break;
case '2':
clrscr();
puts("===========================================");
puts("| Your Debit money is $100,Thank you! |");
puts("| Press any key to return... |");
puts("===========================================");
getch();
break;
case '3':
clrscr();
puts("===========================================");
puts("| Your Debit money is $500,Thank you! |");
puts("| Press any key to return... |");
puts("===========================================");
getch();
break;
case '4':
clrscr();
puts("===========================================");
puts("| Your Debit money is $1000,Thank you! |");
puts("| Press any key to return... |");
puts("===========================================");
getch();
break;
case '5':
break;
}
break;
case '4':
clrscr();
puts("================================");
puts("| Thank you for your using! |");
puts("| Good bye! |");
puts("================================");
return;
}
}
模拟ATM(自动柜员机)界面
#include <stdio.h> void main()
{
int Password=0,Number=0,price=58,i=0;
while( Password != 1234 )
{
if( i >= 3 )
return;
i++;
puts("Please input Password: ");
scanf("%d",&Password);
}
i=0;
while( Number!=price )
{
do{
puts("Please input a number between 1 and 100: ");
scanf("%d",&Number);
printf("Your input number is %d\n",Number);
}while( !(Number>=1 && Number<=100) );
if( Number >= 90 )
{
printf("Too Bigger! Press any key to try again!\n");
}
else if( Number >= 70 && Number < 90 )
{
printf("Bigger!\n");
}
else if( Number >= 1 && Number <= 30 )
{
printf("Too Small! Press any key to try again!\n");
}
else if( Number > 30 && Number <= 50 )
{
printf("Small! Press any key to try again!\n");
}
else
{
if( Number == price )
{
printf("OK! You are right! Bye Bye!\n");
}
else if( Number < price )
{
printf("Sorry,Only a little smaller! Press any key to try again!\n");
}
else if( Number > price )
{
printf(" Sorry, Only a little bigger! Press any key to try again!\n");
}
getch();
}
}
用二维数组实现矩阵转置
/* 用二维数组实现矩阵的转置 */
#include <stdio.h>
#define ROW 3
#define COL 4
main()
{
int matrixA[ROW][COL],matrixB[COL][ROW];
int i,j; clrscr();
printf("Enter elements of the matrixA,");
printf("%d*%d:\n",ROW,COL);
for( i=0; i<ROW; i++ )
{
for( j=0; j<COL; j++ )
{
scanf("%d",&matrixA[i][j]);
}
}
for( i=0; i<ROW; i++ )
{
for( j=0; j<COL; j++ )
{
matrixB[j][i] = matrixA[i][j];
}
}
printf("MatrixB,");
printf("%d*%d:\n",COL,ROW);
for( i=0; i<COL; i++ )
{
for( j=0; j<ROW; j++ )
{
printf("%8d",matrixB[i][j]);
}
printf("\n");
}
printf("\n Press Any Key to Quit... \n");
getch();
}
求解二维数组的最大/最小元素
#define MAXN 20
int a[MAXN][MAXN];
main()
{
int min, /* 存储最小值 */
max; /* 存储最大值 */
int row,col,n;
clrscr();
printf("Please input the order of the matrix:\n");/* 输入方阵的阶次 */
scanf("%d",&n);
printf("Please input the elements of the matrix,\n from a[0][0] to a
[%d][%d]:\n",n-1,n-1);
for(row=0;row<n;row++)
for(col=0;col<n;col++)
scanf("%d",&a[row][col]);
for(min=a[0][0],row=0;row<n;row++)
{
/* 从每行选出最大数 */
for(max=a[row][0],col=1;col<n;col++)/*从row行选出最大数 */
if(max<a[row][col])
max=a[row][col];
if(min>max)/* 保存至row行的最小数 */
min=max;
}
printf("The minimum of maximum number is %d\n",min);
for(max=a[0][0],row=0;row<n;row++)
{
/* 每行选出最小数 */
for(min=a[row][0],col=1;col<n;col++)/* 从row行选出最小数 */
if(min>a[row][col])
min=a[row][col];
if(max<min)/*保存至row行的最大数 */
max=min;
}
printf("The maximum of minimum numbers is %d\n",max);
printf("\nPress any key to quit...\n");
getch();
}
利用数组求前n个质数
#define N 50
main()
{
int primes[N];
int pc,m,k; clrscr();
printf("\n The first %d prime numbers are:\n",N);
primes[0]=2;/*2是第一个质数*/
pc =1;/*已有第一个质数*/
m =3;/*被测试的数从3开始*/
while(pc<N)
{
/*调整m使它为下一个质数*/
k=0;
while(primes[k]*primes[k]<=m)
if(m%primes[k]==0)
{/*m是合数*/
m+=2;/*让m取下一个奇数*/
k=1;/*不必用primes[0]=2去测试m,所以k从一开始*/
}
else
k++;/*继续用下一个质数去测试*/
primes[pc++]=m;
m+=2;/*除2外,其余质数均是奇数*/
}
/*输出primes[0]至primes[pc-1]*/
for(k=0;k<pc;k++)
printf("%4d",primes[k]);
printf("\n\n Press any key to quit...\n ");
getch();
}
编制万年历
#include "stdio.h"
long int f(int year,int month)
{/*f(年,月)=年-1,如月<3;否则,f(年,月)=年*/
if(month<3) return year-1;
else return year;
} long int g(int month)
{/*g(月)=月+13,如月<3;否则,g(月)=月+1*/
if(month<3) return month+13;
else return month+1;
} long int n(int year,int month,int day)
{
/*N=1461*f(年、月)/4+153*g(月)/5+日*/
return 1461L*f(year,month)/4+153L*g(month)/5+day;
} int w(int year,int month,int day)
{
/*w=(N-621049)%7(0<=w<7)*/
return(int)((n(year,month,day)%7-621049L%7+7)%7);
} int date[12][6][7];
int day_tbl[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
main()
{int sw,leap,i,j,k,wd,day;
int year;/*年*/
char title[]="SUN MON TUE WED THU FRI SAT";
clrscr();
printf("Please input the year whose calendar you want to know: ");/*输
入年*/
scanf("%d%*c",&year);/*输入年份值和掠过值后的回车*/
sw=w(year,1,1);
leap=year%4==0&&year%100||year%400==0;/*判闰年*/
for(i=0;i<12;i++)
for(j=0;j<6;j++)
for(k=0;k<7;k++)
date[i][j][k]=0;/*日期表置0*/
for(i=0;i<12;i++)/*一年十二个月*/
for(wd=0,day=1;day<=day_tbl[leap][i];day++)
{/*将第i+1月的日期填入日期表*/
date[i][wd][sw]=day;
sw=++sw%7;/*每星期七天,以0至6计数*/
if(sw==0) wd++;/*日期表每七天一行,星期天开始新的一行*/
} printf("\n|==================The Calendar of Year %d
=====================|\n|",year);
for(i=0;i<6;i++)
{/*先测算第i+1月和第i+7月的最大星期数*/
for(wd=0,k=0;k<7;k++)/*日期表的第六行有日期,则wd!=0*/
wd+=date[i][5][k]+date[i+6][5][k];
wd=wd?6:5;
printf("%2d %s %2d %s |\n|",i+1,title,i+7,title);
for(j=0;j<wd;j++)
{
printf(" ");/*输出四个空白符*/
/*左栏为第i+1月,右栏为第i+7月*/
for(k=0;k<7;k++)
if(date[i][j][k])
printf("%4d",date[i][j][k]);
else printf(" ");
printf(" ");/*输出十个空白符*/
for(k=0;k<7;k++)
if(date[i+6][j][k])
printf("%4d",date[i+6][j][k]);
else printf(" ");
printf(" |\n|");
}
/*scanf("%*c");/*键入回车输出下一个月的日历*/
}
puts
("=================================================================|")
;
puts("\n Press any key to quit...");
getch();
}
对数组元素排序
rest(int a[], int n)
{
int i,low,high,t; for(i=0,low=0,high=n-1;i<=high;)
{
if(a[i]>0)
{
/*a[i]与a[high]交换,随之high减1*/
t=a[i];
a[i]=a[high];
a[high]=t;
high--;
}
else if(a[i]==0)
i++; /* 掠过该元素 */
else
{
/*a[i]与a[low]交换,随之low增1, i增1*/
t=a[i];
a[i]=a[low];
a[low]=t;
low++;
i++;
}
}
}
int s[]={8,4,0,-1,6,0,-5};
main()
{
int i;
clrscr();
printf("\n The arry before rest is:\n");
for(i=0;i<sizeof(s)/sizeof(s[0]);i++)
printf("%4d",s[i]);
rest(s,sizeof(s)/sizeof(s[0]));
printf("\n The arry after rest is:\n");
for(i=0;i<sizeof(s)/sizeof(s[0]);i++)
printf("%4d",s[i]);
printf("\n Press any key to quit...\n");
getch();
}
任意进制数的转换
/* 函数trans将无符号整数n翻译成d(2<=d<=16)进制表示的字符串s */
#define M sizeof(unsigned int)*8
int trans(unsigned n, int d, char s[])
{
static char digits[] ="0123456789ABCDEF"; /* 十六进制数字的字符 */
char buf[M+1];
int j, i = M;
if(d<2||d>16)
{
s[0]='\0'; /* 不合理的进制,置s为空字符串 */
return 0; /* 不合理的进制,函数返回0 */
}
buf[i]='\0';
do
{
buf[--i]=digits[n%d]; /*译出最低位,对应字符存入对应工作数组中*/
n/=d;
}while(n);
/* 将译出在工作数组中的字符串复制到s */
for(j=0;(s[j]=buf[i])!='\0';j++,i++);
/* 其中控制条件可简写成s[j]=buf[i] */
return j;
}
/* 主函数用于测试函数 trans() */
main()
{
unsigned int num = 253;
int scale[]={2,3,10,16,1};
char str[33];
int i;
clrscr();
for(i=0;i<sizeof(scale)/sizeof(scale[0]);i++)
{
if(trans(num,scale[i],str))
printf("%5d = %s(%d)\n",num,str,scale[i]);
else
printf("%5d => (%d) Error! \n",num,scale[i]);
}
printf("\n Press any key to quit...\n");
getch();
}
判断回文数
/* 函数circle用于判断正整数n的d进制数表示形式是否是回文数 */
int circle(int n, int d)
{
int s=0,m=n;
while(m)
{
s=s*d+m%d;
m/=d;
}
return s==n;
}
/* main函数用于测试circle函数 */
int num[]={232,27,851};
int scale[]={2,10,16};
main()
{
int i,j;
clrscr();
for(i=0;i<sizeof(num)/sizeof(num[0]);i++)
for(j=0;j<sizeof(scale)/sizeof(scale[0]);j++)
if(circle(num[i],scale[j]))
printf("%d -> (%d) is a Circle Number!\n",num[i],scale[j]);
else
printf("%d -> (%d) is not a Circle Number!\n",num[i],scale[j]);
printf("\n Press any key to quit...\n");
getch();
}
求解钢材切割的最佳订单
#include <stdio.h>
#define N 20
#define DELTA 2
int bestlen;
int bestsele[N];
int sele[N];
int n;
int orderlen[N];
int total;
main()
{
int i;
clrscr();
printf("\n Please enter total length of the steel:\n");/* 输入钢材总长
*/
scanf("%d",&total);
printf("\n Please enter number of order:\n"); /* 输入定单数 */
scanf("%d",&n);
printf("\n Please enter the orders:\n"); /* 输入各定单 */
for(i=0;i<n;i++)
scanf("%d",&orderlen[i]);
bestlen=0; /*最佳解用料的初值 */
for(i=0;i<n;i++)
sele[i]=bestsele[i]=0; /*置当前选择和最佳选择初值 */
try(); /* 调用函数求解 */
for(i=0;i<n;i++) /* 输出结果 */
if(bestsele[i])
printf("order %d length = %d\n",i+1,orderlen[i]);
printf("\n Press any key to quit...");
getch();
}
try()
{
int i,len;
for(len=i=0;i<n;i++) /* 求当前选中的用料量 */
if(sele[i])
len+=orderlen[i]+DELTA;
if(len-DELTA<=total) /* 注意最后一段可能不需要切割 */
{
if(bestlen < len)
{
/* 找到一个更好的解 */
bestlen = len;
for(i=0;i<n;i++)
bestsele[i]=sele[i];
}
for(i=0;i<n;i++) /* 对所有未选定单逐一作选中尝试循环 */
if(!sele[i])
{
sele[i]=1; /* 做选中尝试*/
try();
sele[i]=0;
}
}
}
指向数组的指针
main()
{
int x,y,z; /* 定义三个int型变量 */
int *xp = &x, /* 定义指针变量xp,并赋值为x的地址,使xp指向x */
*yp = &y, /* 定义指针变量yp,并赋值为y的地址,使yp指向y */
*zp = &z; /* 定义指针变量zp,并赋值为z的地址,使zp指向z */
int t;
clrscr();
printf("\nPlease input x,y,z:\n");
scanf("%d%d%d",xp,yp,zp); /* 通过变量的指针,为变量输入值 */
if(*xp>*yp) /* 通过指向变量的指针引用变量的值 */
{
t=*xp; /* 通过指向变量的指针引用变量的值 */
*xp=*yp;/* 通过指向变量x的指针xp,引用变量x的值 */
*yp=t; /* 通过指向变量y的指针yp,引用变量y的值 */
}
if(*xp>*zp) /* 通过指向变量的指针,引用变量的值 */
{
t=*xp; /* 通过指向变量x的指针xp,引用变量x的值 */
*xp=*zp;/* 通过指向变量x的指针xp,引用变量x的值 */
*zp=t; /* 通过指向变量z的指针zp,引用变量z的值 */
}
if(*yp>*zp) /* 通过指向变量的指针,引用变量的值 */
{
t=*yp; /* 通过指向变量的指针,引用变量的值 */
*yp=*zp;/* 通过指向变量y的指针yp,引用变量y的值 */
*zp=t;/* 通过指向变量z的指针zp,引用变量z的值 */
}
printf("x = %d\ty = %d\tz = %d\n",x,y,z);
printf("\nPress any key to quit...\n");
getch();
}
阿拉伯数字转换为罗马数字
#include <stdio.h>
#define ROWS 4
#define COLS 4
int nums[ROWS][COLS]={{1000,1000,1000,1000},
{900,500,400,100},
{90,50,40,10},
{9,5,4,1}};
char *roms[ROWS][COLS]={{"m","m","m","m"},
{"cm","d","cd","c"},
{"xc","l","xl","x"},
{"ix","v","iv","i"}}; main(int argc,char *argv[ ])
{
int low,high;
char roman[25]; if(argc<2)
{ printf("Usage:roman decimal_number\n");/*运行程序需带整数参数*/
exit(0);
}
high=low=atoi(argv[1]);/*将第一个参数转换成整数*/
checknum(low);
if(argc>2)
{/*带两个参数*/
high=atoi(argv[2]);
checknum(high);
if(low>high)
{
low=high;
high=atoi(argv[1]);
}
}
else
low=1;
for(;low<=high;low++)
{
to_roman(low,roman);
printf("%d\t%s\n",low,roman);
}
} checknum(int val)/*检查参数合理性*/
{
if(val<1||val>9999)
{
printf("The number must be in range 1..9999.\n");
exit(0);
}
}
to_roman(int decimal,char roman[ ])/*将整数转换成罗马数字表示*/
{
int power,index;
roman[0]='\0';
for(power=0;power<ROWS;power++)
for(index=0;index<COLS;index++)
while(decimal>=nums[power][index])
{
strcat(roman,roms[power][index]);
decimal-=nums[power][index];
}
}
通讯录的输入输出
#include <stdio.h>
#define ZIPLEN 10
#define PHONLEN 15
/*struct addr类型定义*/ struct addr
{
char *name;/*姓名*/
char *address;/*地址*/
char zip[ZIPLEN];/*邮政编码*/
char phone[PHONLEN];/*电话号码*/
}; main()/*本主函数示意上述输入输出函数的用法*/
{
struct addr p[100];
int i,j;
clrscr();
for(i=0;readaddr(p+i);i++);
for(j=0;j<i;j++) writeaddr(p+j);
puts("\n Press any key to quit...");
getch();
} /* 函数readaddr用于输入一个通信录函数 */
int readaddr(struct addr *dpt)
{
int len;
char buf[120];/*输入字符串的缓冲区*/ printf("\nPlease input the
Name:\n");/*输入姓名*/
if(scanf("%s",buf)==1)
{
len=strlen(buf);
dpt->name=(char *)malloc(len+1);/*申请存贮姓名的空间*/
strcpy(dpt->name,buf);
}
else return 0;/*Ctrl+Z结束输入*/
printf("Please input the Address:\n");/*输入地址*/
if(scanf("%s",buf)==1)
{
len=strlen(buf);
dpt->address=(char *)malloc(len+1);/*申请存贮地址的空间*/
strcpy(dpt->address,buf);
}
else
{/*Ctrl+Z结束输入*/
free(dpt->name);/*释放存贮姓名的空间*/
return 0;
}
printf("Please input the Zip code:\n");/*输入邮编*/
if(scanf("%s",buf)==1)
strncpy(dpt->zip,buf,ZIPLEN-1);
else
{
free(dpt->name);/*释放存贮姓名的空间*/
free(dpt->address);/*释
展开阅读全文