C语言从0到有的56道典型题

编写程序:当x≤1时,y=e的x次方;当x>1时,y=x的平方减1。

#include<stdio.h>
#include<math.h>
int main()
{ double x,y;
  printf("请输入x的值:");
  scanf("%lf",&x);
  if(x<=1)
  y=exp(x);
  else
  y=pow(x,2);
  printf("f(%lf)=%.2f\n",x,y);
  return 0;
  }

注意点:- 数学库函数e的x次方为exp()

         - 最后的输出格式注意保留小数位数,格式可以改变成更为通俗易懂的格式。f(%lf)=%.2f\n",x,y,这种格式的x和y都要输出。

x非零和零的分段函数

if(x)
y=1;/* x非0时,y=1 */
else
y=-1;/* x为0时,y=-1 */

输入三个实数,使它们按从小到大的顺序输出

#include<stdio.h>
int main()
{ float a,b,c,t;
  printf("请输入三个实数:");
  scanf("%f%f%f",&a,&b,&c);
  if(a>b)
  {t=a;a=b;b=t;}
  if(a>c)
  {t=a;a=c;c=t;}
  if(b>c)
  {t=b;b=c;c=t;}
  printf("%5.2f,%5.2f,%5.2f",a,b,c);
  return 0;
  }
  

易错点:细读题目,输入实数要用float类型的。

交换a和b变量的值:引入中间变量。

格式符的标志为:【标志】【输出最小宽度】【。精度】【长度】 例如:&5.4lf指定输出宽度为5,精度为4,由于实际宽度超过5故应该按实际位数输出,小数部分超过4位被截去。

输出项有比较的时候最好输出的时候带上逗号。

if语句一旦很长的时候一定要看清不要带逗号。

输入三个任意整数,找出其中的最大值

#include<stdio.h>
int main()
{ int a,b,c,max;
  scanf("%d%d%d",,&a,&b,&c;
  if(a>b)
   if(a>c)
   max=a;
   else
   max=c;
  else
   if(b>c)
   max=b;
   else
   max=c;
  printf("max=%d\n",max);
  return 0;
  }

注:1.一定要注意格式的整齐,否则很容易看不出来是什么东西。

2。应为是把变量储存到max中,所以max要放在前面。

3。总的表达式为真的时候执行表达式二,为假执行表达式三。

由键盘输入一个字符,大写转化为小写,小写转化为大写,其他的转化为下一字符

#include<stdio.h>
int main()
{char c1,c2;
printf("请输入一个字符:");
c1=getchar();
if(c1>='a'&&c1<='z')
c2=c1-32;
else if(c1>='A'&&c1<='Z')
c2=c1+32;
else
c2=c1+1;
putchar(c2);
return 0;
}

注:1。字符型常量的类型是char。

2。输入和输出的格式要注意,putchar相当于printf函数,

3。即大于谁又小于谁的时候,变量要带着。

4。小写转大写减去32,大写转小写加上32,转化为下一字符在原字符上加一。

输入月份的值,输出该月份是第几季度

#include<stdio.h>
int main()
{int month;
 printf("输入月份:");
 scanf("%d",&month);
 swith((month-1)/3)
 {case 0:printf("%d月份是第一季度");break;
  case 1:printf("%d月份是第二季度");break;
  case 2:printf("%d月份是第三季度");break;
  case 3:printf("%d月份是第四季度");break;
  default:printf("输入错误");break;
  }
  return 0;
  }

  • 季度的判断方法:获取月份属于第几个季度,可以首先判断月份除以3是否有余数,如果没有余数,月份除以3就是季度数,如果有余数,就在结果上加1。(难点:构造Switch语句的表达式)
  • Switch语句后面是要加上花括号的。case后面是冒号,break别忘记带上。

使用Switch语句编写4。14的三段函数

#include<stdio.h>
#include<math.h>
int main()
{int expression;
 float x,y;
 printf("请输入x的值:");
 scanf("%f",&x);
 expression=(int)(1*(x<2)+2*(x>=2&&x<=10)+3*(x>10));
 switch(expression)
 {case 1:y=2*x;break;
  case 2:y=7-3*x;break;
  case 3:y=1-cos(x);break;
  }
  printf("y=%0.5f\n",y);
  return 0;
  }

  • 引入的变量别忘记定义,用于存放构造的表达式的值。
  • 对变量进行赋值时有两个括号,第一个括号用于强制转换类型,第二个括号用于给每个条件进行编号,数字后面也要带上括号。
  • 特别注意当变量的类型改变的时候,输入和输出的格式都要发生改变。

由键盘输入一个三位整数,判断该数是否是升序数。若输入的不是三位数,输出“Enter error”。

#include<stdio.h>
int main()
{int n,a,b,c;
 printf("请输入一个三位整数:");
 scanf("%d",&n);
 if(n<100||n>999)
 printf("Enter error\n");
 else
 {a=n/100;
  b=n/10%10;
  c=n%10;
  if(a>b&&b>c)
  printf("%d是升序数\n",n);
  else
  printf("%d不是升序数\n",n);
  }
  return 0;
  }
  
  • 注意一下得到百位数,十位数和个位数的方法。
  • 注意后面的输出语句一定要带上变量。

求一元二次方程的根

#include <stdio.h>
// 使用开根号 sqrt(d) 函数时,需要添加此头文件
#include <math.h>
 
int main()
{
    // 求一元二次方程的根
    // 代码思想:
    // 手动输入三个系数,分别代表二次项系数、一次项系数、常数项;
    // 判断输入的二次项系数是否为0,如果为0,提示“输入的第一个值不合法,请重新输入!”
    // 如果二次项系数不为0,利用根的判别式,计算一元二次方程是否有根;
    // 如果判别式 Δ >= 0 ,代表方程有两个根,输出根
    // 如果 Δ < 0 ,提示“方程无根”。
 
    float a , b , c, d, x1, x2;
 
    printf("请依次输入三个系数: ");
    scanf("%f %f %f", &a,&b,&c);
 
    if(a != 0)
    {
        d = b * b - 4 * a * c;                        // 根的判别式
        if(d >= 0)
        {
            x1 = ((-b + sqrt(d)) / (2 * a));            // 求根公式
            x2 = ((-b - sqrt(d)) / (2 * a));
 
            printf("x1 = %.2f;x2 = %.2f", x1, x2);
        }
        else
        {
            printf("方程无根");
        }
    }
    else
    {
        printf("输入的第一个值不合法,请重新输入!");
    }
 
 
    return 0;
}
  • if后面加花括号,使用多层嵌套的时候一定要空格使它们对齐,否则很难看出来对应关系。
  • 一元二次方程一定要注意根的判别式以及二次项不为零。求根公式/两边一定要注意括号。
  • 一个式子被多次使用的时候可以定义一个新的变量来替代。

输入一个正整数求累加和

#include<stdio.h>
int main()
{int i,n,sum;
 scanf("%d",&n);
 sum=0;
 for(i=1;i<=n;i++)
 sum=sum+i;
 printf("由1到%d的和为:%d\n",n,sum);
 return 0;
 }
  • 一般在输入函数后面对变量赋初值。
  • printf后面有几个%,对应的输出项就有几个。
  • 做题前的准备工作是抽象出需要反复执行的部分。
  • 别忘了对累加量进行赋初值。
    在这里插入图片描述
#include<stdio.h>
int main()
{int n,i,denominator,flag;
 float sum,item;
 printf("请输入n的值:");
 scanf("%d",&n);
 flag=1;
 sum=0;
 denominator=1;
 for(i=1;i<=n;i++)
 {item=flag*1.0/denominator; /*强制转换类型*/
  sum=sum+item;
  flag=-flag;
  denominator=denominator+3;
  }
  printf("Sum=%.2f\n",sum);
  return 0;
  }

注:循环体内一定要计算出累加项的值,在为下一次循环做准备。

定义的变量有n,i,sum,分式加上fz,fm,item.

输入十个数,输出其中最大的数。

#include<stdio.h>
int main()
{int i;
float x,max;
printf("请输入第一个x的值:");
scanf("%f",&x);
max=x;
for(i=1;i<=9;i++)
{printf("请输入第%d个数:",i+1);/*提示输入下一个数*/
 scanf("%f",&x);
 if(x>max)
 max=x;
 }
 printf("10个数的最大值为:%.0f",max);
 return 0;
 }
  • 注意循环中每次要输入的都是x的值,所以地址符一定要注意。
  • 注意一下输入下一个数的写法。

输出所有的水仙花数

#include<stdio.h>
int main()
{int number,a,b,c;
 for(number=100;number<=999;number++)
 {a=number/100;
  b=number%100/10;
  c=number%10;
  if(number==a*a*a+b*b*b+c*c*c)
  printf("%5d",number);
  }
  return 0;
  }
  • 此时的number初值为1,是为了控制位数。
  • 所谓“水仙花数”是指一个3位数,其各位数字立方之和等于该数本身。
  • “%5d ”要求输出宽度为5的十进制整型

https://blog.csdn.net/weixin_39855186/article/details/117039196?ops_request_misc=&request_id=&biz_id=102&utm_term

输入一个正整数,判断该数是否是完数。

#include<stdio.h>
int main()
{int i,x,sum;
 printf("请输入一个整数:");
 scanf("%d",&x);
 sum=0;
 for(i=1;i<x-1;i++)
  if(x%i==0)
  sum=sum+i;
  if(sum==x)
  printf("%d是完数",x);
  else
  printf("%d不是完数",x);
  return 0;
  }

在这里插入图片描述

  • 要写for循环时,先分析题目中的判断条件,for和if的嵌套是很常见的。

统计由键盘输入的若干个字符,大写字母,小写字母,数字字符,和其他字符的个数。

#include<stdio.h>
int main()
{int upper,lower,digit,other;
int i;
upper=0;lower=0;digit=0;other=0;
char ch;
printf("请输入十个字符:");

for(i=1;i<=10;i++){
ch=getchar();
 if(ch>='A'&&ch<='Z')
 upper++;
 else if(ch>='a'&&ch<='z')
 lower++;
 else if(ch>='0'&&ch<='9')
 digit++;
 else
 other++;
}
printf("大写字母%d个,小写字母%d个,数字%d个,其他字符%d个\n",upper,lower,digit,other);
  
  return 0;
 } 
  • ch=getchar();输入要在for循环的里面。
  • 使用getchar()读入字符,使用多分支if结构实现分支,用逻辑表达式判断字符的种类。
#include<stdio.h>
int main()
{int i;
 char ch;
 for(i=1;(ch=getchar())!='\n';)
 putchar(ch-32);
 return 0;
 }
  • ch=getchar(),输出的字符赋值给变量ch,并和’\n’比较。,用一个表达式实现赋值和比较。注意:getchar不能直接比较,需要赋值给字符型变量。

由键盘输入三个数字,将其组合成一个整型数并输出

#include<stdio.h>
int main()
{int i,n;
char ch;
printf("请输入三个数字:");
for(i=0;i<=3;i++){
scanf("%c",&ch);
 n=n*10+ch-'0';/*组合成一个整型数*/ 
}
printf("%d\n",n);
  return 0;
}
  • 如果要连续输出三个数字字符时,数字字符之间不能出现空格。由%c要读入一个字符,而空格和回车符本身也是一个字符,因此会被作为输入字符。
  • 表达式n=n*10+ch-'0’是将数字字符整合成一个整型数。这是将数字字符转化为数字的常用方法。

编写程序,由键盘输入一个正整数,判断其是否为素数。

 #include<stdio.h>
int main(void)
{int m,i;
printf("请输入一个正整数:");
scanf("%d",&m);
for(i=2;i<m;i++){
  if(m%i==0)
  break;  
}
if(i==m)
printf("%d是素数!\n",m);
else
printf("%d不是素数!\n",m);
  return 0;
}
/*利用while循环来做:*/
#include<stdio.h>
int main()
{int m,i;
 printf("请输入一个正整数:");
 scanf("%d",&m);
 i=2;
 while(i<m){
 if(m%i==0)
 break;
 else
 i++;
 }
 if(i==m)
 printf("%d是素数!\n",m);
 else
 printf("%d是素数!\n",m);
 return 0;
 }
 


在这里插入图片描述

  • 结合流程图来看,对比出for循环和while循环的区别。for循环在里面定义变量,而while提前声明。
  • 课本上说:如果m比较大,for需要循环很多次的时候,优化如下:使i≤sqrt(number),减少循环次数。

求两个自然数的最大公约数和最小公倍数

#include<stdio.h>
int main()
{int a,b,r,m,n;
 printf("请输入两个自然数");
 scanf("%d%d",&a,&b);
m=a,n=b;
do
{ r=a%b;
  a=b;
  b=r;
 }while(r!=0);
 
 printf("%d和%d最大公约数为:%d\n",m,n,a);
 printf("最大公倍数为:%d", m*n/a);
  return 0;
 } 
  • 要把a,b赋值给一个新变量,因为后面输出的时候需要用到原数值。
  • 注意求出的的最大公约数是a

输入一个整数,统计该数的位数

#include<stdio.h>
int main()
{int i,n;
 char ch;
 printf("请输入一串数字:");
 for(i=1;(ch=getchar())!='\n';)
  {n=n+i;
  }
  printf("位数是%d",n);
  return 0;
}/*缺点是负数的时候符号被看做字符,这是看题不严谨常犯的错误*/
#include<stdio.h>
int main()
{int count=0;
 long n,m;
 printf("请输入正整数:");
 scanf("%ld",&n);
 m=n;
 if(n<0)
  n=-n;
do
{n=n/10;/*减少一位数字*/
 count++;
}while(n>0);
printf("%ld的位数是%d",m,count);
  return 0; 
}
  • 整数的类型看做long更严谨
  • 本题的做法是每减少一个数字,计数器count加一。

输入一批学生的成绩(以负数作为结束标志),计算平均分,并统计不及格成绩的个数。

在这里插入图片描述

#include<stdio.h>
int main()
{int num,count;
 float grade,total;
 num=0;count=0;total=0;
 while(1)
 {printf("请输入学生的成绩#%d(0~100)",num+1);
 scanf("%f",&grade);
 if(grade<0)
  break;
  if(grade>=60){
  total=total+grade;
  num++;
    }
  if(grade<60)
  count++;
  }
  printf("学生的平均分是%.2f\n",total/num);
  printf("不及格的人数为:%d",count);
  return 0;
 }
  

输出乘法口诀表

#include<stdio.h>
int main()
{int i,j;
 for(i=1;i<10;i++){
   for(j=1;j<=i;j++){
   printf("%d*%d=%d\t",i,j,i*j);
   }
  printf("\t");
  }
  return 0;
 }
 

求100以内的素数要求每行输出10个。

#include<stdio.h>
#include<math.h>
int main()
{int i,n,k,count=0;
 n=2;
 while(n<100)
 {k=sqrt(n);
  for(i=2;i<=k;i++)
   if(n%i==0)
   break;
  if(i>k){
    printf("%4d",n);
    if(++count%10==0)
    printf("\n");
  }
  n++;
 }
 return 0;
 } 
  • 外层while循环简单,两层for循环好像很难调试。此时注意赋初值以及变量自增不要省略。

{
在这里插入图片描述

#include<stdio.h>
int main()
{int i,j,count=0;
 for(i=2;i<100;i++){
   for(j=2;j<=i;j++){
     if(i==j){ 
     printf("%4d",i);
     if(++count%10==0)
     printf("\n");
       }
     if(i%j==0)
     break;
     
   } 
 }
 return 0;
}
  • 实践证明,for循环更简单。一定要注意if语句很长的时候中括号一定要带着啊,胜败在此一念之间。

将10到20之间的正整数分解质因数。

#include<stdio.h>
int main()
{ int i,n,m;
  for(m=10;m<20;m++){
    n=m;i=2;
    printf("%d=",n);
    do
    {
      if(n%i==0){
        printf("%d*",i);
        n=n/i; /*取整*/
      }
    else
    i++;  
    }while(n!=i);
    printf("%d\n",n);/*最后相除留下的数也是质数*/
  }
  return 0;
}

猴子吃桃问题

#include<stdio.h>
int main()
{int day,m;
 day=9;
 m=1;
 while(day>0){

   m=(m+1)*2;
   
   --day;
 }
 printf("第一天摘了%d\n",m);
 return 0;
}
  • 设置变量是不要搞数字和字母相结合,我是说一般情况下。因为打字速度会变慢。
  • 确定前后项的关系是关键。

递推法例题二

在这里插入图片描述

#include<stdio.h>
#include<math.h>
#define eps 1e-6
int main()
{int n=1;float x;
 double fz,fm=1,sinx;
 printf("请输入x的值:");
 scanf("%f",&x);
 fz=x;sinx=x;
 while(fabs(fz/fm)>eps)
  {
    n=n+1;
    fz=-fz*x*x;
    fm=fm*(2*n-2)*(2*n-1);
    sinx=sinx+fz/fm;
    
  }
  printf("sin(%f)=%0.6f\n",x,sinx);
  printf("sin(%f)=%0.6f\n",x,sin(x));
  return 0;
}
  • 分子和分母的算法实在是很精妙。注意此题中设置了很多种类型的变量。

迭代法求

在这里插入图片描述

#include<stdio.h>
#include<math.h>
#define eps 1e-6
int main()
{float x1,x0,f,f1;
 x1=1.0;
 do
 {x0=x1;
  f=2*pow(x0,3)-4*pow(x0,2)+3*x0-6;
  f1=6*pow(x0,2)-8*x0+3;
  x1=x0-f/f1;
 }while(fabs(x1-x0)>eps);
 printf("%6.2f",x1);
 return 0;
}
  • 注意迭代法的公式,如果中间会改变某些值,那么用一些变量先储存起来。

猜数游戏

#include<stdio.h>
#include<stdlib.h>
int main()
{int m,n,count=0;
 m=rand()%(80-10+1)+10;
 printf("请输入一个10-80之间的整数:");
 while(1)
 {scanf("%d",&n);
  count++;
  if(m==n){
    printf("恭喜!你猜对了!真棒!\n");
    break;
    
  }
  else if(m>n&&count<5)
  printf("你猜小了!再来一次!");
  else if(m<n&&count<5)
  printf("你猜大了!再来一次!");
  if(count==5) {
    printf("对比不起,你没机会了!\n这个数是:%d,游戏结束!\n",m);
    break;
  }
 }
 return 0;
}

输出100~1000的回文素数

 #include<stdio.h>
 #include<math.h>
 int main()
 {int x,i,j=0,n,k=0;
  for(x=100;x<1000;x++)
  {k=sqrt(x);
   for(i=2;i<=k;i++)
   if(x%i==0)
   break;
   if(i>k)
   {k=x;
   n=0;
   while(k>0)
    {n=n*10+k%10;
     k/=10;
  }
  if(x==n)
  {printf("%d\t",x);
   if(++j%5==0)
   printf("\n");
   } 
   }
  }
  return 0;
  }

输入一个正整数N,再输入N个整数,将这N个整数逆序存放并输出。

#include<stdio.h>
int main()
{int n,i,a[10],t;
 printf("输入变量n的值:");
 scanf("%d",&n);
 printf("请输入%d个整数:");
 for(i=0;i<n;i++)
 scanf("%d",&a[i]);
 for(i=0;i<n/2;i++)
 {t=a[i];
  a[i]=a[n-1-i];
  a[n-1-i]=t;
 }
 printf("逆序存放后:");
 for(i=0;i<n;i++)
 printf("%3d",a[i]);
 return 0;
 } 

交换法排序

#include<stdio.h>
int main()
{int i,j,t,a[10];
 printf("请输入十个整数:");
 for(j=0;j<10;j++)
 scanf("%d",&a[j]);
 printf("\n");
 for(i=0;i<9;i++)
  for(j=i+1;j<10;j++)
  if(a[i]>a[j]){
    t=a[i];a[i]=a[j];a[j]=t;
  }
  printf("排序之后:\n");
  for(j=0;j<10;j++)
  printf("%4d",a[j]);
  return 0;
  
 } 

选择法排序

#include<stdio.h>
int main()
{int i,k,j,t,a[10];
 printf("请输入十个整数:");
 for(j=0;j<10;j++)
 scanf("%d",&a[j]);
 printf("\n");
 for(i=0;i<9;i++)
 {
 
  k=i;
  for(j=i+1;j<10;j++)
  
  if(a[k]>a[j])
  k=j;
  if(i!=k)
  {t=a[k];a[k]=a[i];a[i]=t;
  }
  }
  printf("排序之后:\n");
  for(j=0;j<10;j++)
  printf("%4d",a[j]);
  return 0; 
 } 
  • 引入下标
  • 第一层循环后的中括号不能省

冒泡法排序

#include<stdio.h>
#define N 6
int main()
{int i,j,t,a[N];
 printf("请输入%d个整数:\n",N);
 for(i=0;i<N;i++)
 scanf("%d",&a[i]);
 printf("\n");
 for(i=0;i<N;i++)
  for(j=0;j<N-1-i;j++)
  if(a[j]>a[j+1])
  {t=a[j];a[j]=a[j+1];a[j+1]=t;
  }
  printf("排序之后:\n");
  for(i=0;i<N;i++)
  printf("%3d",a[i]);
  return 0;
 
 
 } 

假设已有5个整数按升序存放在数组A中,要求编程实现从键盘输入任意一个整数N,把它存放到数组A中,使数组中的6个整数仍按升序存放。

#include<stdio.h>
int main()
{int a[6]={1,3,5,7,9},i,n;
 printf("插入前的数组:");
 for(i=0;i<5;i++)
 printf("%3d",a[i]);
 printf("\n请输入要插入的数:");
 scanf("%4d",&n);
 for(i=4;i>=0;i--)
 if(a[i]<n){
   a[i+1]=n;
   break;
 }
 else
 a[i+1]=a[i];
 if(i<0)
 a[0]=n;
 printf("插入后的数组:");
 for(i=0;i<6;i++)
 printf("%5d",a[i]);
 printf("\n");
 return 0;
}

利用顺序查找。在给定的数据中查找一个数据是否存在。若存在输出数据的下标,若不存在输出不存在的信息。


折半查找法

#include<stdio.h>
int main()
{int a[12]={3,5,8,9,14,17,19,21,23,26,28,32};
 int x,i,top,bot,mid,find;
 scanf("%d",&x);
 top=0;
 bot=11;
 find=0;
 do{
   mid=(top+bot)/2;
   if(x==a[mid]){
     printf("found:%d,it is a[%d].\n",x,mid);
     find=1;
     break;
   }
   else if(x<a[mid])
   bot=mid-1;
   else
   top=mid+1;
 }while(top<=bot);
 if(!find)
 printf("%d not found.\n",x);
 return 0;
}

编写程序求出3乘3的矩阵中最大元素的值及其所在的行号和列号。

#include<stdio.h>
int main()
{ int i,j,row=0,colum=0,max;
  int a[][4]={{11,9,33,4},{23,42,53,7},{15,6,37,8}};
  printf("数组:\n");
  for(i=0;i<=2;i++)
  {
    for(j=0;j<=3;j++)
    printf("%-4d",a[i][j]);
    printf("\n");
   } 
   max=a[0][0];
   row=0;colum=0;
   for(i=0;i<=2;i++)
    for(j=0;j<=3;j++)
    if(a[i][j]>max)
    {
      max=a[i][j];
      row=i;
      colum=j;
  }
  printf("最大元素为:%d,行号:%d,列号%d\n",max,row,colum);
  return 0;
}

编程计算3乘3的矩阵的2条对角线上所有元素之和。

首先将3乘3的矩阵列入一个二维数组中,它主对角上元素的特征是行下标与列下标的值相同,副对角上。元素为行下标和列下标之和为2。

#include<stdio.h>
int main()
{int a[3][3]={9,4,7,5,6,1,8,3,2},sum=0,i,j;
 printf("数组:\n");
 for(i=0;i<3;i++)
 {
   for(j=0;j<3;j++)
   printf("%3d",a[i][j]);
   printf("\n");
 }
 for(i=0;i<3;i++)
  for(j=0;j<3;j++)
  if(i==j||i+j==2)
  sum=sum+a[i][j];
  printf("对角线元素之和为:%d\n",sum);
  return 0;
}

杨辉三角

#include<stdio.h>
#define N 11
int main()
{int i,j,y[N][N];
 for(i=0;i<N;i++)
 {
   y[i][1]=y[i][i]=1;
   for(j=2;j<=i-1;j++)
   y[i][j]=y[i-1][j]+y[i-1][j-1];
   
 }
  for(i=0;i<N;i++)
  {
    for(j=1;j<=i;j++)
    printf("%4d",y[i][j]);
    printf("\n");
   } 
   return 0;
}

矩阵的转置

#include<stdio.h>
int main()
{int a[3][4]={2,5,7,9,6,14,20,8,15,0,12,3},b[4][3],i,j;
 printf("数组a:\n");
 for(i=0;i<3;i++)
 {
   for(j=0;j<4;j++)
   printf("%-4d",a[i][j]);
   printf("\n");
   
 }
 for(i=0;i<4;i++)
  for(j=0;j<3;j++)
  b[i][j]=a[j][i];
  printf("数组b:\n");
  for(i=0;i<4;i++)
  {
    for(j=0;j<3;j++)
    printf("%-4d",b[i][j]);
    printf("\n");
  }
  return 0;
 } 

输入一个日期,判断该日期是当年的第几天。


#include<stdio.h>

int main()

{int year,month,day,i,leap;

int tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};

printf(“请输入年-月-日:”);

scanf(“%d-%d-%d”,&year,&month,&day);

leap=(year%40&&year%100!=0||year%4000);

for(i=1;i<month;i++)

day=day+tab[leap][i];

printf(“是当年的第%d天\n”,day);

return 0;

}

由键盘输入一行字符,统计其中小写字母的个数,并将所有小写字母转换为大写字母后输出这个字符串。

#include<stdio.h>
int main()
{int i,n=0;
 char s[20];
 printf("请输入一个字符串:");
 for(i=0;(s[i]=getchar())!='\n';i++)
 if(s[i]>='a'&&s[i]<='z')
 n++;
 printf("n=%d\n",n);
 for(i=0;s[i]!='\n';i++)
 if(s[i]>='a'&&s[i]<='z')
 printf("%c",s[i]-32);
 else
 printf("%c",s[i]);
 printf("\n");
 return 0;
 } 

删除一个字符串的某个字符

#include<stdio.h>
#include<string.h>
int main()
{
  int i,j=0;
  char ch[]="this is a string",c;
  puts(ch);
  printf("输入一个字符:");
  c=getchar();
  for(i=0;ch[i]!='\0';i++)
  if(ch[i]!=c)
  ch[j++]=ch[i];
  ch[j]='\0';
  printf("%s\n",ch);
  return 0;
  
  
}

编写程序输入一个回车符结束的字符串少于80个字符,再输入一个字符统计并输出该字符在字符串中出现的次数,然后再输出该字符串。

#include<stdio.h>
int main()
{
  int i=0,count;
  char str[80],ch;
  printf("请输入一串字符:");
  while((str[i]=getchar())!='\n')
  i++;
  str[i]='\0';
  printf("输入一个字符:");
  ch=getchar();
  for(count=0,i=0;str[i]!='\0';i++)
   if(str[i]==ch)
   count++;
   printf("字符%c出现了%d次\n",ch,count);
   for(i=0;str[i]!='\0';i++)
   putchar(str[i]);
   printf("\n");
   return 0;
}

判断是否是回文字符串

#include<stdio.h>
#include<string.h>
int main()
{
  char s[10];
  int i,j,n;
  printf("请输入一串字符:");
  gets(s);
  n=strlen(s);
  j=n-1;
  for(i=0;i<j;i++,j--)
  if(s[i]!=s[j])
  break;
  if(i<j)
  printf("不是回文串\n");
  else
  printf("是回文串\n");
  return 0;
}

编写程序实现2个字符串的连接。

#include<stdio.h>
#include<string.h>
int main()
{
  int i,n;
  char s1[20],s2[10];
  printf("请输入第一个字符串:");
  gets(s1);
  printf("请输入第二个字符串:");
  gets(s2);
  n=strlen(s1);
  for(i=0;s2[i]!='\0';i++)
  s1[n+i]=s2[i];
  s1[n+i]='\0';
  printf("两个字符串连接以后:");
  puts(s1);
  return 0;
  
}

在这里插入图片描述

#include<stdio.h>
#include<math.h>
double fact(int n);
int main()
{
  int i=1;
  double x,item,s=0;
  printf("输入x的值:");
  scanf("%lf",&x);
  item=x;
  while(fabs(item)>=0.00001)
  {
    s=s+item;
    i++;
    item=pow(x,i)/fact(i);
    
  }
  printf("和是:%lf\n",s);
  return 0;
}
double fact(int n)
{
  int i;
  double jc=1;
  for(i=1;i<=n;i++)
  jc=jc*i;
  return jc;
}

输入N个正整数,将它们从小到大排列后输出。

#include<stdio.h>
void input(int a[],int n);
void choose(int a[],int n);
void print(int a[],int n);
int main(void)
{
  int n,a[10];
  printf("输入变量n的值:(n<=10):");
  scanf("%d",&n);
  printf("输入%d个数组元素:",n);
  input(a,n);
  choose(a,n);
  printf("排序之后:",n);
  print(a,n);
  printf("\n");
  return 0;
}
void input(int a[],int n)
{
  int i;
  for(i=0;i<n;i++)
  scanf("%d",&a[i]);
}
void choose(int a[],int n)
{
  int i,j,k,t;
  for(i=0;i<n-1;i++)
  {
    k=i;
    for(j=i+1;j<n;j++)
    if(a[j]<a[k])
    k=j;
    t=a[i],a[i]=a[k],a[k]=t;
  }
}
void print(int a[],int n)
{
  int i;
  for(i=0;i<n;i++)
  printf("%3d",a[i]); 
}

逆序输出一个整数

#include<stdio.h>
int main()
{
  void printn(int x);
  int n;
  scanf("%d",&n);
  if(n<0)
  {
    n=-n;
    putchar('-');
    
  }
  printn(n);
  return 0;
}
void printn(int x)
{
  if(x>=0&&x<=9)
  printf("%d",x);
  else
  {
    printf("%d",x%10);
    printn(x/10);
  }
}

输出100到1千范围内的回文素数。

#include<stdio.h>
#include<math.h>
int prime_pal(int n)
{
  int i,k=sqrt(n),m;
  for(i=2;i<=k;i++)
  if(n%i==0)
  return 0;
  k=n;
  m=0;
  while(k>0)
  {
    m=m*10+k%10;
    k=k/10;
    
  }
  if(m==n)
  return 1;
  return 0;
 } 
 int main()
 {
   int j,k=0;
   for(j=100;j<=999;j++){
     if(prime_pal(j)){
       printf("%d\t",j);
       if(++k%5==0)
       printf("\n");
     }
   }
   
   
   
 }

在这里插入图片描述

#include<stdio.h>
#include<math.h>
double mycos(double x)
{
  int n=1;
  double sum=0,term=1.0;
  while(fabs(term)>=1e-6)
  {
    sum+=term;
    term*=-pow(x,2)/((2*n-1)*(2*n));
    n=n+1;
    
  }
  return sum;
}
int main()
{
  double x;
  printf("请输入x的值:");
  scanf("%lf",&x);
  printf("fx(%f)=%f,%f\n",x,mycos(x),cos(x));
  return 0;
  
 } 

有5名学生,每人有三门考试成绩,计算每个学生的总分与平均成绩,查找有一门及一门以上课程不及格的学生,输出全部学生的课程成绩。

#include<stdio.h>
average(int student[5][6])
{
  int i,j;
  printf("学号   数学   英语   计算机   总分   平均分\n");
  for(i=0;i<5;i++)
  {
    student[i][4]=student[i][1]+student[i][2]+student[i][3];
    student[i][5]=student[i][4]/3;
     
  }
  for(i=0;i<5;i++)
  {
    for(j=0;j<6;j++)
    printf("%-12d",student[i][j]);
    printf("\n");
  }
}
  search(int (*p1)[6],int n)
  {
    int i,j,flag;
    printf("\n成绩有一门及以上课程不及格的学生如下:\n");
    for(i=0;i<n;i++)
    {
      flag=0;
      for(j=1;j<4;j++)
      if(*(*(p1+i)+j)<60)
      flag=1;
      if(flag==1)
      for(j=0;j<6;j++)
      printf("%-12d",*(*(p1+i)+j));
      printf("\n");
    }
  }
int main()
{
  int score[5][6]={{201101,78,93,82},{201102,67,83,72},{201103,55,83,62},{201104,65,59,70},{201105,80,78,90}};
  average(score);
  search(score,5);
  return 0;
  }  

课本证明任意一个十进制正整数与其反序数相加后得到一个新的正整数。重复该步骤最终可得到一个回文数。

第一个数和最后一个数相等,第二和倒数第二个相等,以此类推。
通过定义两个指针,一个指向数组第一个数,一个指向最后一个数。
如果两指针指向的值相等,则前一个指针进一位,后一个指针退一位,直至两个指针地址相等
定义的存放回文数的数组可以是char类型的也可以是int类型的,但int类型每个元素占4字节太浪费了,char类型每个元素只占1个。
————————————————
版权声明:本文为CSDN博主「是我啊东山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50803771/article/details/111115484

#include <stdio.h>
#include <string.h>
int isHuiWen(char *s);
int main()
{
    char str[80];
    scanf("%s",str);
    if (isHuiWen(str))
        printf("%s是回文数",str);
    else
        printf("%s不是回文数",str);
}
int isHuiWen(char *s)
{
    char *p,*q;
    int flag=1;
    p=s;
    q=s+strlen(s)-1;
    while(p<=q)
    {
        if(*p!=*q)break;
        p++;
        q--;
    }
    if(p<=q)flag=0;
    return flag;
}


N个数,编写程序使其顺序向后移,M个位置,使最后M个数变成前面的M个数。

#include<stdio.h>
int main()
{
  void moveone(int *,int);
  int number[20],n,m,i;
  printf("请输入数的个数:(<20个)");
  scanf("%d",&n);
  printf("输入%d个数:",n);
  for(i=0;i<n;i++)
  scanf("%d",number+i);
  printf("输入移动位置数:");
  scanf("%d",&m);
  for(i=1;i<=m;i++)
  moveone(number,n);
  printf("移动以后:");
  for(i=0;i<n;i++)
  printf("%3d",*(number+i));
  printf("\n");
  return 0;
}
void moveone(int *array,int size)
{
  int *p=array+size-1,temp;
  temp=*p;
  for(;p>array;p--)
  *p=*(p-1);
  *array=temp;
}

将5个单词从小到大排列后输出定义sort函数完成对指针数组排序。

#include<stdio.h>
#include<string.h>
void sort(char *p[],int n);
int main()
{
  char *s[]={"one","two","three","four","five"};
  int i,n=sizeof(s)/sizeof(char *);
  sort(s,n);
  for(i=0;i<n;i++)
  printf("\n%s",s[i]);
  return 0;
}
void sort(char *p[],int n)
{
  int i,j,k;
  char *temp;
  for(i=0;i<n;i++)
  {
    k=i;
    for(j=i+1;j<k;j++)
    {
      if(strcmp(p[k],p[j])>0)
      k=j;
    }
    temp=p[k],p[k]=p[i],p[i]=temp;
  }
}

统计一段字符的单词数

#include<stdio.h>
int main()
{
  char c[81];
  int i,dancishu=1;
  printf("请输入不大于80的字符串:");
  gets(c);
  if(c[0]==' ')
  dancishu=0;
  for(i=0;c[i]!='\0';i++)
  if(c[i]==' '&&c[i+1]!=' '&&c[i+1]!='\0')
  dancishu++;
  printf("这段字符单词数是:%d",dancishu);
  return 0;
}
  • 思想:前一位为空格,后一位不是空格则遇到单词

考虑点:开头为空格时,单词数初始值为0。结尾为空格时单词数会多一个,所以加上结尾不等于0的条件。

求两组学生的平均成绩

#include<stdio.h>
int main()
{   float aver(float a[],int n);
  float a[5],b[10];
  int i;
  printf("请输入第一组的学生的成绩:\n");
  for(i=0;i<=4;i++)
  scanf("%f",&a[i]);
  printf("请输入第二组学生的成绩:\n");
  for(i=0;i<=9;i++)
  scanf("%f",&b[i]);
  
  printf("第一组成绩的平均数是:%f\n",aver(a,4));
  printf("第二组成绩的平均数是:%f\n",aver(b,10));
  return 0;
}
float aver(float a[0],int n)
{
  int i;
  float sum=a[0],pingjunshu;
  for(i=0;i<=n;i++)
  sum=sum+a[i];
  pingjunshu=sum/n;
  return(pingjunshu);
  
}
  • 输入两个数组可以用同一个循环变量
  • 调用参数老李的数组用a[0]表示,原函数在调用的时候只需要写数组名就可以。
  • 调用函数里的累加值别忘了赋初值。

有3名学生学习4门课,学生一的成绩分别是65、67、70、60,学生二的分别是80、

87、90、81,学生三的分别是90、99、93、98。用指针函数来编程,要求在用户
输入学生序号以后,能输出该学生的各科成绩

#include<stdio.h>
int main()
{
  float *chazhao(float(*hang)[4],int n);
  float a[3][4]={{65,67,70,60},{80,87,90,81},{90,99,93,98}};
  float *p;
  int xuhao,i;
  printf("请输入学生序号:");
  scanf("%d",&xuhao);
  printf("第%d名学生的成绩:\n",xuhao);
  p=chazhao(a,xuhao-1);
  for(i=0;i<=3;i++)
  printf("%f\t",*(p+i));
  printf("\n");
  return 0;
  
 } 
 float *chazhao(float(*hang)[4],int n)
 {
   int *q;
   q=(hang+n)[0];
   return (q);
 }

求阶乘的累加和

#include<stdio.h>
int factorial(int n)
{
  if(n==0||n==1)
  return 1;
  return n*(factorial(n-1));
}
int main()
{
  double sum=0;
  double x=1;
  for(int i=1;i<=20;i++)
  x=x*i;
  sum=sum+x;
  printf("%f\n",sum);
  return 0;
}

求两个非负整数的最大公约数和最小公倍数

#include<stdio.h>
int main()
{
  int m,n,a,b,r;
  printf("请输入两个自然数:\n");
  scanf("%d%d",&a,&b);
  m=a;
  n=b;
  do
  {r=a%b;
   a=b;
   b=r;
    
  }while(r!=0);
  printf("%d和%d的最大公约数是:%d\n",m,n,a);
  printf("%d和%d的最大公倍数为:%d\n",m,n,m*n/a);
  return 0;
  
}

https://m.toutiao.com/article/7134539721929196032/?wid=1661810833689&upstream_biz=toutiao_pc

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值