适合初学者学习
适合跟着课程学习,复习时,再拿这些题练手也中
有设置题目目录,查找时更方便
大多从谭浩强课本上摘取的,算是基础经典老题吧!
有些是搜集的题
例题是围绕着目录来撰写的
代码是本人自己编写的,或许也有其他方法
某些源代码可以扩展,使取数范围更广,只需改动代码中特定数的范围即可
学习目录:
输入:无
输出:Hello World
代码:
#include
int main()
{
printf("Hello World");
return 0;
}
#include
int main(){
printf("*********\nOK!\nHello!\n*********");
return 0;
}
注:在printf打印时" "里的内容只能在一行,切记不能内容不能换行,但是在后面输出目标格式时可以换行,如:
printf("*********
**************"); //出错
printf("%d *** %f *** %d",a,
b,c); //可以
#include
main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d",a+b);
return 0;
}
输入:三个数值,格式:3,4,5
输出:三个数的最大值,格式:max=5
#include
main()
{
int a,b,c,max;
scanf("%d,%d,%d",&a,&b,&c);
if(a>b) max=a;
else max=b;
if(max<c) max=c;
printf("max=%d",max);
return 0;
}
#include
main()
{
int a,b,z;
scanf("%d %d",&a,&b);
printf("a=%d b=%d\n",a,b);
z=a;a=b;b=z;
printf("a=%d b=%d\n"a,b);
return 0;
}
不使用第三个变量,实现两个数的对调:
#include
main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("a=%d b=%d\n",a,b);
a=a+b;
b=a-b;
a=a-b;
printf("a=%d b=%d\n",a,b);
}
#include
main()
{
int a,b,c,z;
scanf("%d %d %d",&a,&b,&c);
if(a<b){
z=a;a=b;b=z;}
if(a<c){
z=a,a=c,c=z;}
if(b<c){
z=b;b=c;c=z;}
printf("%d %d %d",a,b,c);
}
法一(选择法):
#include
main()
{
int n,a[50];
int i,j,mx,num;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++){
mx=i;
for(j=i+1;j<n;j++){
if(a[mx]<a[j]) mx=j;}
num=a[i];a[i]=a[mx];a[mx]=num;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
法二(气泡法):
#include
main()
{
int n,a[20];
int i,j,z;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=;i<n;i++)
for(j=0;j<n-i;j++)
if(a[j]<a[j+1]){
z=a[j];a[j]=a[j+1];a[j+1]=z;}
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
输入:一个三位数
输出:输出该数字的百位,十位,个位,数字之间用一个空格隔开
#include
main()
{
int num,a,b,c;
scanf("%d",&num);
a=num/100;
b=num/10%10;
c=num%10;
printf("%d %d %d",a,b,c);
}
#include
main()
{
int n;
scanf("%d",&n);
if(n%3==0&&n%5==0)
printf("Yes\n");
else printf("No\n");
return 0;
}
【方法】:辗转相除法
#include
main()
{
int m,n,team;
scanf("%d %d",&m,&n);
if(m<=0||n<=0)return -1;
while(n!=0){
team=m%n;
m=n;
n=team;}
printf("%d\n",m);
return 0;
}
法一:【思路】:运用for循环,一个数一个数的找,直到对两数取余都为0
#include
main()
{
int m,n,i;
scanf("%d %d",&m,&n);
for(i=m;i>0;i++)
if(i%m==0&&i%n==0)
break;
printf("%d,%d的最小公倍数:%d",m,n,i);
return 0;
}
法二:【思路】:先找到两数的最大公约数
#include
main()
{
int gcd(int a,int b);
int m,n,c,d;
scanf("%d %d",&m,&n);
c=gcd(m,n);
d=m*n;
c=d/c;
printf("%d,%d的最小公倍数:%d\n",m,n,c);
}
int gcd(int a,int b)
{
int t;
while(b!=0){
t=a%b;
a=b;
b=t;}
return a;
}
#include
main()
{
int i,j;
for(i=1800,j=0;i<=2020;i++)
if((i%4==0&&i%100!=0)||(i%400==0)){
printf("%d ",i);
j++;
if(j%5==0&&j!=0) printf("\n");}
printf("\n");
return 0;
}
#include
#include
main()
{
int a,b,c,d;
float x1,x2;
printf("输入三个数a b c\n");
scanf("%d %d %d",&a,&b,&c);
d=b*b-4*a*c;
if(d<0) printf("方程无根\n");
else if(d>=0){
x1=(-1*b+sqrt(d*1.0))/(2*a);
x2=(-1*b-sqrt(d*1.0))/(2*a);
if(d=0) printf("x1=x2=%.2f",x1);
else printf("x1=%.2f x2=%.2f",x1,x2);}
}
注:sqrt函数括号内数值为小数,否则会出错
说明:此代码将a,b,c的值默认为整数,修改下代码可将数值改为小数类型
某快递公司根据投送目的第距离公司的远近,将全国划分为5个区域:
#include
main()
{
int area,wt;
float weight,sum;
int b;
printf("输入区域0-4 输入重量:\n");
scanf("%d %f",&area,&weight);
if(area<0||area>4||weight<=0){
printf("输入有误");
return 0;
}
b=weight;
if(weight<1)
wt=1;
else if(weight-b>0)
wt=b+1;
else wt=b;
wt-=1;
switch(area){
case 0:sum=10+wt*3;break;
case 1:sum=10+wt*4;break;
case 2:sum=15+wt*5;break;
case 3:sum=15+wt*6.5;break;
case 4:sum=15+wt*10;break;
}
printf("运费:%.2f\n",sum);
return 0;
}
要求:给出一百分制成绩,要求输出成绩等级A、B、C、D、E。 90分以上为A;80-89分为B;70-79分为C;60-69分为D;60分以下为E。如果输入数据不在0~100范围内,请输出一行:“Score error!”。
#include
main()
{
float score;
int s;
scanf("%f",&score);
s=score/10;
switch(s){
case 10:
case 9:printf("A\n");break;
case 8:printf("B\n");break;
case 7:printf("C\n");break;
case 6:printf("D\n");break;
case 5:
//跟上面返回结果一样
case 4:
case 3:
case 2:
case 1:
case 0:printf("E\n");break;
default :printf("Score error!");}
}
#include
main()
{
int sign=1;
double d=2.0,sum=1.0,term;
while(d<=100){
sign*=-1;
term=sign/d;
sum+=term;
d++;}
printf("值:%lf\n",sum);
}
描述:有一个分数序列 2/1,3/2,5/3,8/5,13/8,······ 求出这个数列的前N项和,结果保留三位小数。
#include
main()
{
int i,p,q,r,N;
double team,sum=0;
scanf("%d",&N);
p=2;q=1;
for(i=1;i<=N;i++){
team=p*1.0/q;
sum+=team;
r=p;p+=q;q=r;}
printf("%.3lf\n",sum);
return 0;
}
要求:输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换,然后输出最后得到的字符。
#include
main()
{
char ch;
ch=getchar();
ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
putchar(ch);
printf("\n");
return 0;
}
#include
#include
main()
{
char a[30];
int english=0,black=0,num=0,other=0;
int i,n;
gets(a);
n=strlen(a);
for(i=0;i<n;i++)
if(a[i]<='z'&&a[i]>='a'||a[i]<='Z'&&a[i]>='A')
english++;
else if(a[i]<='9'&&a[i]>='0')
num++;
else if(a[i]==' ')
black++;
else other++;
printf("英文字母:%d\n空格:%d\n数字:%d\n其他:%d\n",english,black,num,other);
return 0;
}
素数:只能被1和其本身整除
#include
main()
{
int i,j,k;
for(i=100,k=0;i<=200;i++)
for(j=2;j<i;j++){
if(i%j==0) break;
if(j==i-1){
k++;
printf("%d",i);
if(k%5==0&&k!=0) //k累计到5的倍数,换行
printf("\n");
else printf(" ");}
}
printf("\n");
return 0;
}
简化:
#include
#include
main()
{
int i,j,k,m;
for(i=101,k=0;i<=200;i+=2){ //省略了判断偶数
m=sqrt(i*1.0); //判断素数可只需取到数的开方
for(j=2;j<=m;j++)
if(i%j==0) break;
if(j>m){ //若j>m,表示i未能被整除
k++;
printf("%d",i);
if(k%5==0&&k!=0)
printf("\n");
else printf(" ");}
}
return 0;
}
注意:math函数中sqrt():对x取开方,但x必须为小数,否则出错。
描述:一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 结果保留两位小数。
#include
main()
{
float M;
int N,i;
double high,sum=0;
scanf("%f %d",&M,&N);
sum+=M;
for(i=1;i<N;i++){
M/=2;
sum+=M*2;}
high=M/2;
printf("%.2lf %.2lf\n",high,sum);
return 0;
}
**描述:猴子第1天摘下若干个桃子 ,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,有多吃了一个。以后每天早上都吃了其前一天剩下的一半零一个。到第十天早上在想吃时,就只剩下一个桃子了。求第1天共摘多少个桃子。
#include
main()
{
int i,sum,part;
sum=1;part=1;
for(i=1;i<=9;i++){
part=(part+1)*2;
sum+=part;}
printf("%d\n",sum);
return 0;
}
描述:键盘输入正整数a和n,编程 s=a+aa+aaa+aaaa+aa…a(n个a)的值。
#include
main()
{
int a,n,i,k,team,sum=0;
scanf("%d %d",&a,&n);
for(i=1,k=10;i<=n;i++,k*=10){
team=(k-1)/9*a;
sum+=team;}
printf("Sn=%d\n",sum);
return 0;
}
#include
main()
{
int i,j,n,team,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++){
team=1;
for(j=1;j<=i;j++)
team*=j;
sum+=team;}
printf("%d\n",sum);
return 0;
}
描述:“水仙花数”是指一个3位数,其中各位数字的立方和等于其本身。例如:153是一个水仙数,因为153=13+53+33。
#include
main()
{
int i,a,b,c;
for(i=100;i<1000;i++){
a=i/100;
b=i/10%10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c)
printf("%-5d",i);
}
printf("\n");
return 0;
}
描述:一个数如果恰好等于它的因子之和,这个数就成为“完数”。例:6的因子为1,2,3,而6=1+2+3,因此6是完数。找出1000以内的所有完数,并按以下格式输出其因子:
6 its factors are 1,2,3
#include
main()
{
int i,j,k,sum;
int a[10][20],m,n;
for(i=2;i<=1000;i++){
m=n=0;
sum=0;
for(j=1,k=0;j<i;j++)
if(i%j==0){
sum+=j;
a[m][n++]=j;}
if(i==sum){
printf("%d its factors are %d",i,a[m][0]);
for(k=1;k<=n-1;k++)
printf(",%d",a[m][k]);
printf("\n");
m++;}
}
return 0;
}
*
***
*****
***
*
【个人备注;要使用代码打出这个图案,使用循环,找出规律一行一行来,先是要打出左空格,接着是*,然后再是空格。】
#include
#include
main()
{
int i,j;
for(i=1;i<=7;i++){
for(j=1;j<=abs(4-i);j++)
printf(" ");
for(j=1;j<=7-(abs(4-i)*2);j++)
printf("*");
for(j=1;j<=abs(4-i);j++)
printf(" ");
printf("\n");
}
return 0;
}
想法:若要使想打印出n行菱形图案,可将代码中数字换成n(输入的数)
#include
main()
{
int a[10][20],b[10][20];
int m,n,i,j;
printf("输入数组的行和列\n");
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
b[j][i]=a[i][j];
for(i=0;i<n;i++){
for(j=0;j<m;j++)
printf("%-5d",b[i][j]);
printf("\n");
}
return 0;
}
描述:有一个m*n的矩阵,要求求出其中值最大的那个元素的值,以及其所在的行号和列号。
#include
main()
{
int m,n,a[10][20];
int i,j,x,y;
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
x=y=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(a[i][j]>a[x][y]){
x=i;y=j;}
printf("max=%d\nrow=%d\ncolum=%d",a[x][y],x,y);
return 0;
}
描述:输入一个n*n的二维矩阵(n<10),求矩阵下三角(左下直角三角)元素的和
#include
main()
{
int a[10][10];
int i,j,n,sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(j==n-1) //设置输入格式(也可不设置哈,在输入时,数之间也是需要空格的。)
scanf("%d",&a[i][j]);
else
scanf("%d ",&a[i][j]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i>=j)
sum+=a[i][j];
printf("%d\n",sum);
return 0;
}
描述:求一个n*n的整型矩阵对角线之和。
#include
main()
{
int n,i,j,a[10][10];
int sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i==j||i+j==n-1)
sum+=a[i][j];
printf("sum=%d\n",sum);
return 0;
}
描述:对N*N矩阵,以主对角线为对称线,将对称元素相加并将其结果放在下三角元素中,右上角元素置0
#include
main()
{
int a[10][10],N;
int i,j;
scanf("%d",&N);
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(j==N-1)
scanf("%d",&a[i][j]);
else
scanf("%d ",&a[i][j]);
printf("\n");
for(i=0;i<N;i++)
for(j=0;j<N;j++){
if(i>j)
a[i][j]+=a[j][i];
if(i<j)
a[i][j]=0;}
for(i=0;i<N;i++){
for(j=0;j<N;j++)
if(j==N-1)
printf("%d",a[i][j]);
else
printf("%-5d",a[i][j]);
printf("\n");
}
return 0;
}
描述:输入一行数组,统计其中有多少个单词,单词之间用一个空格分隔开。
#include
#include
main()
{
char string[81];
int i,num=0,word=0;
char c;
gets(string);
for(i=0;(c=string[i])!='\0';i++)
if(c==' ') word=0;
else if(word==0){
word=1;
num++;}
printf("Tere are %d words in this line.\n",num);
return 0;
}
#include
#include
main()
{
char str[3][20],string[20];
int i;
for(i=0;i<3;i++)
gets(str[i]);
if(strcmp(str[0],str[1])>0)
strcpy(string,str[0]);
else
strcpy(string,str[1]);
if(strcmp(str[2],string)>0)
strcpy(string,str[2]);
printf("\nthe largest string is:\n%s\n",string);
return 0;
}
描述:输入一个从小到大的数组,要求再输入一个数后,按原来排序的规律将它插入数组中。
#include
main()
{
int a[20];
int i,n,num,place;
for(i=0,n=0;i>=0;i++){
scanf("%d",&a[i]);
if(a[i]==0) break;
n++;}
scanf("%d",&num);
for(i=0;i<n;i++)
if(a[i]<num)
place=i;
else break;
for(i=n-1;i>place;i--)
a[i+1]=a[i];
a[place+1]=num;
for(i=0;i<n+1;i++)
printf("%-5d",a[i]);
return 0;
}
描述:将一个数组的值按逆序重新存放,例,原来顺序为9,7,6,4,1。要求改为1,4,6,7,9。
#include
main()
{
int n,a[20];
int i,j,team;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=1;i<n;i++)
for(j=0;j<n-i;j++){
team=a[j];
a[j]=a[j+1];
a[j+1]=team;}
for(i=0;i<n;i++)
printf("%-4d",a[i]);
printf("\n");
return 0;
}
#include
main()
{
int i,j,n;
int a[30][30];
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<=i;j++){
if(i==j||j==0) a[i][j]=1;
else if(i>=2)
a[i][j]=a[i-1][j-1]+a[i-1][j];}
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
if(i==j) printf("%d",a[i][j]);
else printf("%-8d",a[i][j]);}
printf("\n");
}
return 0;
}
描述:找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点
#include
main()
{
int a[10][10],m,n;
int i,j,k,h;
int num,ft=0;
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<m;i++){
for(j=0;j<n;j++){
num=a[i][j];
for(k=0;k<=n-1;k++)
if(num<a[i][k]) //判断在行中是否取得最大
break;
for(h=0;h<=m-1;h++)
if(num>a[h][j]) //判断在列中是否取得最小
break;
if(h==m&&k==n){
printf("鞍点[%d][%d]:%d\n",i,j,num);
ft=1;}
}
if(ft==1) break; //若是有鞍点了,提早结束循环
}
if(ft=0) printf("没有鞍点\n");
return 0;
}
有n个数从m由大到小顺序存放在一个数组中,输入一个数,要求用折半法找出该数是数组中第即个元素的值。如果该数不在数组中,则输出“无此数”。
#include
main()
{
int a[30],m,n;
int i,j,d,ft=0,num;
scanf("%d %d",&m,&n);
printf("查找的数:");
scanf("%d",&num);
for(i=0;i<n;i++){ //对数组赋值
a[i]=m;
m--;}
/*for(i=0;i
d=n/2;
if(num>a[d]){
for(i=0;i<d;i++)
if(num==a[i]){
printf("%d是数组中第%d个元素的值\n",num,i);
ft=1;
break;}
}
else{
for(j=d;j<n;j++)
if(num==a[j]){
printf("%d是数组中第%d个元素的值\n",num,j);
ft=1;
break;}
}
if(ft==0)
printf("无此数");
return 0;
}
#include
main()
{
int a[20][5],n;
int i,j,k;
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<i;j++)
printf(" ");
for(k=0;k<4;k++)
printf("* "); //使得前四个*后都有个空格
printf("*"); //使得最后一个(第五个)*后没有空格
printf("\n");
}
return 0;
}
变换:可将每一行“ * ”的个数改变,自定义
描述:有一行电文,已按下面规律译成密码:
A->Z a->z
B->Y b->y
C->X c->x
... ...
.. ..
. .
即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。
格式:
#include
main()
{
char c[36];
int i,n,t;
printf("密码个数:\n");
scanf("%d\n",&n); //按要求设置格式
for(i=0;i<n;i++)
scanf("%c",&c[i]);
c[i]='\0';
printf("密码文:\n%s\n",c);
for(i=0;i<n;i++){
if(c[i]<='Z'&&c[i]>='A'){
t=c[i]-64; //查找是第几个字母
c[i]=27-t+64;} //译码
else if(c[i]<='z'&&c[i]>='a'){
t=c[i]-96; //同上
c[i]=27-t+96;}
else
continue;
}
printf("原文:\n%s\n",c);
return 0;
}
想输出以下的结果,用函数调用实现
******************(18个*)
How do you do!
******************(18个*)
#include
void print_star(); //声明函数
void print_message();
main()
{
print_star(); //调用函数
print_message();
print_star();
return 0;
}
void print_star() //定义函数
{
printf("******************\n");
}
void print_massage()
{
printf(" How do you do!\n");
}
描述:输入两个数,要求输出其中值较大者。要求用函数来找到大数。
#include
int max(int x,int y)
{
int z;
z=x>y? x:y;
return(z);
}
main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("max=%d\n",max(a,b));
return 0;
}
输入两个实数,用一个函数求出他们的和
#include
float add(float x,float y)
{
return(x+y); //省略再定义个变量,使其值为x和y的和
}
main()
{
float a,b,sum;
printf("Please enter a and b");
scanf("%f %f",&a,&b);
sum=add(a,b);
printf("sum is %f\n",sum);
return 0;
}
输入4个整数,找出其中最大的数。用函数嵌套调用来处理
#include
int max2(int a,int b)
{
return(a>b? a:b);
}
int max4(int a,int b,int c,int d)
{
int m;
m=max2(a,b);
m=max2(m,c);
m=max2(m,c);
return(m); //可结合为一句return(max2(max2(max(a,b),c),d))
}
main()
{
int a,b,c,d,max;
printf("Please enter 4 interage numbers:\n")
scanf("%d %d %d %d",&a,&b,&c,&d);
max=max4(a,b,c,d);
printf("max=%d\n",max);
return 0;
}
#include
int fac(int n)
{
int f;
if(n<0)
printf("n<0,date error!");
else if(n==0||n==1)
f=1;
else f=fac(n-1)*n;
return(f);
}
main()
{
int n,sum;
printf("input an integer number:");
scanf("%d",&n);
sum=fac(n);
printf("%d! = %d\n",n,sum);
return 0;
}
描述:有一个一维数组score,存放10个学生成绩,求平均成绩
#include
float average(float array[10])
{
int i;
float aver,sum=0;
for(i=0;i<10;i++)
sum+=array[i];
aver=sum/10;
return(aver);
}
int main()
{
float score[10],aver;
int i;
printf("Input 10 score:\n");
for(i=0;i<10;i++)
scanf("%f",&score[i]);
aver=average(score);
printf("average score is:%5.2f\n",aver);
return 0;
}
#include
int max_value(int array[][10],int m,int n)
{
int i,j,max;
max=array[0][0];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(array[i][j]>max)
max=array[i][j];
return(max);
}
main()
{
int a[10][10],m,n;
int max,i,j;
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
max=max_value(a,m,n);
printf("Max is %d\n",max);
return 0;
}
描述:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。
#include
int max_value(int a,int b)
{
int t;
while(b!=0){
t=a%b;
a=b;
b=t;}
return(a);
}
int min_value(int a,int b)
{
int c,d;
c=max_value(a,b);
d=a*b;
return(d/c);
}
int main()
{
int a,b;
printf("Input two interage:\n");
scanf("%d %d",&a,&b);
if(a>0&&b>0){
printf("最大公约数:%d\n",max_value(a,b));
printf("最小公倍数:%d\n",min_value(a,b));}
else
printf("Input is error!");
return 0;
}
描述:求方程 ax2+bx+c=0 的根,用三个函数分别求当:b2-4ac 大于0、等于0和小于0时的根并输出结果。从主函数输入 a,b,c 的值。(计算结果可保留两位小数)
#include
#include
void greater(float date,float a,float b)
{
float x1,x2;
x1=(-1*b+date)/(2*a); //可以简化写,这样写容易看懂
x2=(-1*b-date)/(2*a);
printf("x1=%.2f\nx2=%.2f\n",x1,x2);
}
void equal(float a,float b)
{
float x;
x=-1*b/2/a;
printf("x1=x2=%.2f\n",x);
}
void less()
{
printf("此方程无根\n");
}
int main()
{
float a,b,c,date;
printf("enter a b c:\n");
scanf("%f %f %f",&a,&b,&c);
date=sqrt(b*b-4*a*c);
if(date>0)
greater(date,a,b);
else if(date==0)
equal(a,b);
else
less();
return 0;
}
描述:写一个判断素数的函数,在主函数输入有个整数,输出是否为素数的信息。
#include
#include
int ft=0;
int ft_value(int a)
{
int i,m;
if(a%2==0)
ft=1;
m=sqrt(a*1.0);
for(i=3;i<=m;i+=2)
if(a%i==0){
ft=1;
break;}
return(ft);
}
int main()
{
int num;
printf("Input one:\n");
scanf("%d",&num);
if(ft_value(num))
printf("%d是素数\n",num);
else
printf("%d不是素数\n",num);
return 0;
}
描述:写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
#include
#include
void value(char s1[30],char s2[30])
{
int i,j,n;
n=strlen(s1);
for(i=0,j=n-1;i<n;i++)
s2[i]=s1[j--];
s2[n]='\0';
}
int main()
{
char a[30],b[30];
gets(a);
value(a,b);
puts(b);
return 0;
}
描述:写一个函数,输入一个整数,要求输出这个数字字符,但每两个数字之间空一个空格,如输入1993,应输出“1 9 9 3”。
#include
void formate(int a)
{
int i,n,b[16];
for(i=0,n=0;a!=0;i++){
b[i]=a%10;
a/=10;
n++;}
for(i=n-1;i>=1;i--)
printf("%d ",b[i]);
printf("%d\n",b[0]);
}
int main()
{
int a;
printf("enter one interage:\n");
scanf("%d",&a);
formate(a);
return 0;
}
描述:写一个函数,输入一行字符,将此字符中最长的单词输出
#include
#include
void output(char c[50])
{
int i,n,count=0,p,len=0;
n=strlen(c);
for(i=0;i<=n;i++)
if(c[i]<='z'&&c[i]>='a'||c[i]<='Z'&&c[i]>='A')
count++;
else if(c[i]==' '||c[i]=='\0'){
if(len<count){
len=count;
p=i;}
count=0;}
for(i=p-len;i<p;i++)
printf("%c",c[i]);
printf("\n");
}
int main()
{
char s[50];
gets(s);
output(s);
return 0;
}
#include
double express(int x,int n)
{
if(n==0)
return(1);
else if(n==1)
return(x);
else if(n>1)
return(((2*n-1)*x-express(x,n-1)-(n-1)*express(x,n-2))/n);
}
int main()
{
int n;
float x;
printf("Input x and n:\n");
scanf("%f %d",&x,&n);
printf("sum=%.3lf\n",express(x,n));
return 0;
}
说明:代码是按照题目来编的,但又搜了下勒让多项式值跟这个算出来的有出入,代码没有问题的,,,,,
描述:用递归法将一个整数n转换成字符串。例如,输出483,应输出字符串“483”。n的位数不确定,可以是任意位数的整数
#include
void convert(int n)
{
int t;
if((t=n/10)!=0)
convert(t);
putchar(n%10+'0');
}
int main()
{
int num;
scanf("%d",&num);
if(num<0){
printf("-");
num*=-1;
}
printf("String:");
convert(num);
printf("\n");
return 0;
}
#include
int days=0;
void add_month(int m)
{
switch(m){
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:days+=31;break;
case 4:
case 6:
case 9:
case 11:days+=30;break;
}
if((m-=1)>=3)
add_month(m);
}
void add_year(int y,int m)
{
if(m>=2){
if(y%400==0||y%4==0&&y%100!=0)
days+=29;
else
days+=28;
}
}
int main()
{
int year,month,day;
printf("输入日期(格式,例:2020/6/13):\n");
scanf("%d/%d/%d/",&year,&month,&day);
days+=day;
add_month(month);
add_year(year,month);
printf("The %d day\n",days);
return 0;
}
#include
main()
{
int *p1,*p2,*p,a,b;
p1=&a;p2=&b;
scanf("%d %d",p1,p2);
if(a<b){
p=p1;
p1=p2;
p2=p;} //交换p1与p2的指向位置
printf("a=%d b=%d\n",a,b);
printf("max=%d min=%d\n",*p1,*p2);
return 0;
}
#include
void swap(int *p1,int *p2)
{
int t;
t=*p1;
*p1=*p2;
*p2=t;
}
int main()
{
int a,b,*p1=&a,*p2=&b;
scanf("%d %d",p1,p2);
swap(p1,p2);
printf("->\n%d %d\n",a,b);
return 0;
}
#include
int main()
{
int *p,a[10];
int i;
p=a; //p指向a[0]
printf("input 10 integer:\n");
for(i=0;i<10;i++)
scanf("%d",p++);
for(p=a;p<(a+10);p++)
printf("%d ",*p);
return 0;
}
#include
int main()
{
void change(int *a,int n);
void input(int *,int);
void output(int *a,int);
int a[30],n;
scanf("%d",&n);
input(a,n);
change(a,n);
output(a,n);
return 0;
}
void input(int *a,int n) //输入数值函数
{
int i;
printf("The original array:\n");
for(i=0;i<n;i++)
scanf("%d",a++);
}
void output(int *a,int n) //输出数值函数
{
int *p;
for(p=a;p<a+n;p++)
printf("%d ",*p);
}
void change(int *a,int n) //形参a是指针变量
{
int m,temp;
int *i,*j;
m=(n-1)/2;
i=a; //指向数组a的第一个数
j=a+n-1; //指向a数组最后一个数
for(;i<=(a+m);i++,j--){
temp=*i;
*i=*j;
*j=temp;} //*i与*j交换
}
#include
int main()
{
void sort(int x[],int n);
int a[10],n;
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
void sort(int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++){
k=i;
for(j=i;j<n;j++)
if(*(x+j)>*(x+k)) k=j;
if(k!=i){
t=*(x+i);
*(x+i)=*(x+k);
*(x+k)=t;}
}
}
#include
main()
{
char *string="I love China"; //定义字符串指针变量string并初始化
printf("%s\n",string); //输出字符串
return 0;
}
说明:C语言中只有字符变量,没有字符串变量;可用字符指针变量指向一个字符串变量
#include
main()
{
char a[]="I am a student",b[20];
int i;
for(i=0;*(a+i)!='\0';i++)
*(b+i)=*(a+i);
*(b+i)='\0';
printf("%s\n",b);
return 0;
}
描述:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面个数,见下图。写一个函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
#
#include
void change(int n,int m,int p[])
{
int i,j;
int a[30],b[30];
for(i=0;i<m;i++)
a[i]=p[i];
for(j=m,i=0;j<n;j++)
b[i++]=p[j];
for(i=0;i<n-m;i++)
*(p+i)=b[i];
for(j=0;j<m;j++,i++)
*(p+i)=a[j];
}
int main()
{
int a[30],n,m,i;
printf("整数个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",a+i);
printf("移数:");
scanf("%d",&m);
change(n,m,a);
for(i=0;i<n;i++)
printf("%d ",*(a+i));
printf("\n");
}
说明:这个要求只是将分开的两个片段重新结合,并没有实现移动的效果,下面这个代码实现把数值平移
#include
void change(int n,int m,int p[])
{
int i,j;
int b[30];
int *p1=p+n-1;
for(i=0;i<m;i++)
b[i]=*p1--;
for(j=0;j<n-m;j++)
b[i++]=p[j];
for(i=0;i<n;i++)
*(p+i)=*(b+i);
}
int main()
{
int a[30],n,m,i;
printf("整数个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",a+i);
printf("移动个数:");
scanf("%d",&m);
change(n,m,a);
for(i=0;i<n;i++)
printf("%d ",*(a+i));
printf("\n");
}
描述:有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
#include
int main()
{
int a[50],n,*p;
int i,k,m;
scanf("%d",&n);
for(i=0;i<n;i++)
a[i]=i+1; //对成员编号
k=m=0;
while(m<n-1){ //m为退出人数,即当退出(n-1)个人时,退出循环
for(i=0;i<n;i++){
if(*(a+i)!=0) k++;
if(k==3){
*(a+i)=0;
k=0;
m++;
}
}
}
for(p=a;p<(a+n);p++)
if(*p!=0){
printf("%d\n",*p);
break;}
return 0;
}
描述:输出“魔方阵,魔方阵:它的每一行、每一列和对角线之和均相等。例如三阶魔方阵和四阶魔方阵:
求输出1~n2的自然数构成的魔方阵
#include
void print(int a[][30],int n) //打印矩阵函数
{
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++)
if(j==n-1)
printf("%d",a[i][j]);
else
printf("%-4d",a[i][j]);
printf("\n");
}
}
void swap(int *x,int *y) //x和y交换
{
int t;
t=*x; *x=*y; *y=t;
}
void one(int n) //n为奇数(简捷连续填数法)
{
int num,row,col; //row:第一维(行);col:第二维(列)
int a[30][30];
for(row=0;row<n;row++)
for(col=0;col<n;col++)
a[row][col]=0; //初始化,数组中所有元素均置0
num=1;row=0;col=n/2;
a[row][col]=num;
while(num<=n*n){
num++;
if(row==0&&col==n-1) //达到右上角位置
row++;
else{
row--; col++;
if(row<0) row=n-1;
if(col==n) col=0;
if(a[row][col]!=0){
row+=2;
col--;}
}
a[row][col]=num;
}
print(a,n);
}
void two(int n) //n为双偶数(双向反转方法)
{
int row,col,k;
int num,a[30][30];
num=1; k=n/4;
for(row=0;row<n;row++)
for(col=0;col<n;col++)
a[row][col]=num++;
for(row=k;row<=k*3-1;row++)
for(col=0;col<n/2;col++)
swap(&a[row][col],&a[row][n-1-col]);
for(col=k;col<=k*3-1;col++)
for(row=0;row<n/2;row++)
swap(&a[row][col],&a[n-1-row][col]);
print(a,n);
}
void three(int n) //n为单偶数(井字调整法)
{
int row,col,k;
int a[30][30],num=1;
for(row=0;row<n;row++)
for(col=0;col<n;col++)
a[row][col]=num++;
k=(n-2)/4;
for(row=0;row<=k-1;row++)
for(col=k+1;col<=3*k;col++){
swap(&a[row][col],&a[n-1-row][n-1-col]);
swap(&a[col][row],&a[n-1-col][n-1-row]);
}
for(col=0;col<=k-1;col++){
swap(&a[k][col],&a[k][n-1-col]); //井字分割线第k+1
swap(&a[3*k+1][col],&a[3*k+1][n-1-col]); //井字分割线3k+2
swap(&a[k+1][col],&a[k+1][n-1-col]); //第k+2行
}
for(col=k+1;col<=3*k;col++)
swap(&a[k][col],&a[3*k+1][col]);
for(row=0;row<n/2;row++)
if(row!=k)
swap(&a[row][k],&a[n-1-row][k]);
swap(&a[k][0],&a[3*k+1][0]);
for(col=k+1;col<n/2;col++)
swap(&a[k][col],&a[k][n-1-col]);
for(col=k+1;row<=3*k;row++)
if(row!=2*k)
swap(&a[row][k],&a[row][3*k+1]);
print(a,n);
}
int main()
{
int n;
printf("Input n:\n");
scanf("%d",&n);
if(n%2!=0)
one(n);
else if(n%4==0)
two(n);
else if((n-2)%4==0)
three(n);
return 0;
}