C语言基础(1-12章)知识点归纳

C语言  知识点 归纳
为原创,未经同意,不可转载!
为小白/初学者提供参考,没有完全考虑效率,如有错误,多谢指出。

第一章:

main函数,又称主函数,是程序执行的起点,
scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。
输入程序要用半角英文(ch)
%d  是一种十进制的格式符号
printf  输入
(                )  括号内输入内容
内容两旁打上  “”
赋值操作   一个值一行  每次写上一次值 后面加个;
()内的操作有分布的话,前后两个操作 之间  打上 ,
注意:每一个工程只可以有一个main函数,否则会出错
iint main()  写完后  在下一行 写上 大括号{  
结束后 也写上大括号  }
最后一次的大括号写完后  写上 return 0;

开头语句    #include<stido.h>    注意  要对齐!       这两行不用打上  ;
                  int main()
还有一个:\n  表示上下行区别
注意:在建立工程的时候 命名的后缀名要写成    .c===这个是建立文本的时候,c++source file

C语言严格区分 大小写

乘法案例:#include<stdio.h>      这个是任意输入两个数字
int main() { int a,b ; 
  scanf("%d %d",&a,&b); 
  printf("%d\n",a*b);
  
}   
                                                                                               注意:无论是加法运算还是乘法运算,都有一个必定的子函数输入。 
                                                                                                那就是   scanf("%d %d",&a &b);
注意 是int main                                                                        还有一个就是 printf("%d\n",x+或者是*y);
加法案例:#include<stdio.h>     这个是任意输入两数字
int main()
{
    int a,b;                                            注意点:%d与%d可空可不空
    scanf("%d %d",&a,&b);
    printf("%d\n",a+b);
    
}


加法显示案例:#include<stdio.h>
int main()
{
    printf("%d\n",3+5);
    return 0;
}
  还有一个要注意的是如果要换行,\n必须在“”这个的执行符号内。
如果要显示出现的算式完整性,则再%前添加3+5=   eg:#include<stdio.h>
int main()
{
    printf("3+5=%d\n",3+5);
    return 0;
}

注意一个知识点:建立工程的时候,是从main 函数开始止于main 函数。


输入变量的算式显示:#include<stdio.h>
int main() 

    int a,b;
    a=3;
    b=3;
    printf("a+b=%d\n",a+b);
    return 0;
}


减法显示运算:#include<stdio.h>
int main()
{
    int a,b;
    a=3;
    b=3;
    printf("%d\n",a-b);
    return 0;
}

C语言的注释 //                        后面写上要注释的内容

显示字符的运算:#include<stdio.h>
int main()
{
    printf("I love my family\n");
    return 0;
}

多个字符换行运算:#include<stdio.h>
int main()
{
    printf("I love my family\nDo you know that\nHo i really happy\n");
    return 0;
}


乘法的运算显示:#include<stdio.h>
int main()
{
    int a,b;
    a=3;
    b=3;
     printf("a*b=%d\n",a*b);
    
}                                                                       注意:结束处,可添加retun 0 也可不添加 return 0


除法显示运算 :#include<stdio.h>
int main()
{
    int a,b;
    a=3;
    b=3;
    printf("%d\n",a/b);
    return 0;
}

四则运算:#include<stdio.h>
int main()//超级无敌计算机
{
    int a,b;
    scanf("%d%d",&a,&b);//输入两个数
    
    printf("a+b=%d\n",a+b);//加法
    
    printf("a-b=%d\n",a-b);//减法
    
    printf("a*b=%d\n",a*b);//乘法 
    
    printf("a/b=%d\n",a/b);//减法
    return 0;//结束运行
}


计算绝对值的运算:#include<stdio.h>
int main()
{
    int numb;
    int abs;
    printf("请输入一个牛皮的数值:");
    scanf("%d",&numb);
    if(numb>0) abs=numb;
    else abs=-numb;
    printf("numb的绝对值是:%d\n",abs);
    return 0;
}                                                                               这里注意一个问题:若测试运行中显示scanf 不安全,则需要将scanf改为 scanf_s

逻辑与符号  &&

求长方体的体积(用到了函数volume(x,y,z)
                                           { 
                                                    return(x*y*z);
                                            }


完整函数:
#include<stdio.h>
int volume(int x,int y,int z)
{
    return(x*y*z);
}
    int main()
{
    int a,b,c,v,r;
    printf("请输入长方体的三边长度:\n");
    r=scanf("%d%d%d",&a,&b,&c);
    if(r==3 &&a>0 &&b>0 &&c>0)
    {
    v=volume(a,b,c);
    printf("v=%d\n",v);
}
    else printf( "fuck, it is error!\n");
    return 0;
}    

接着绝对值的那一个例题:(判断 输入的值是否正确)

#include<stdio.h>
int main()
{
    int numb,abs,r;
    printf("please put in a exactly word\n");
    r=scanf("%d",&numb);
    if(r==1)
    {
    
        if(numb>0) abs=numb;
        else abs=-numb;
        printf("%d绝对值是%d\n",numb,abs);

    }
    else printf(" the word you have put in is error\n");
    return 0;
}


注意的问题:1.  printf("%d绝对值是%d\n")中的%d不可以漏  ,且该句后面 numb 与abs方向不可以打反

计算长方体体积:
当if没有和{齐头时,不要加;
 而下面的else不用。
还有表示的另一种形式:#include<stdio.h>
int volume(int x,int y,int z)
{
    return(x*y*z);
}
              int main()
{
    int a,b,c,v,r;
    printf("put three words in it!\n");
                  r=scanf("%d%d%d",&a,&b,&c);
        if(r==3 &&a>0 &&b>0 &&c>0)
    {
    v=volume(a,b,c);
    printf("v=%d\n",v);
}
         else("it is error!");
                        return 0;
}    

多行输入打算法:#include<stdio.h>
int main()
{
    printf("please display these woords\n1. press return keyboard to enter the game\n2. press esc keyboard to exist the game");
        return 0;
}

 

第二章:

 

return int   是关键字
main printf void 标识符
注释  C++通常为  //   也有表示为/*     */
分隔符  空格 回车,换行  逗号
函数名后面不可以用分号 而除此之外 每个语句后面都要加上 分号
复杂语句标识   用大括弧{}
加法的优先级大于=
数据类型  基本类型  构造类型 指针类型

注意事项:编写程序时需要书写符合语法规则的语句代码,该有的符号必须有,比如主函数main(){……},该有的符号必须成对,不能少;再输入函数scanf()给多个变量输入值,各变量要有逗号作分隔符。而不该有的符号或语法正确但不满足语意的符号就不该加:比如if(条件) ……else ……分号书写的位置表示不同含义!
计算长方体体积编程第二个版本:#include<stdio.h>
int volume(int x,int y,int z)
{
    return(x*y*z);
}
     int main()
     {
         int a,b,c,v,r;
         printf("three words\n");
         r=scanf("%d%d%d",&a,&b,&c);
         if(r==3 &&a>0 &&b>0 &&c>0)
         {
             v=volume(a,b,c);
             printf("the answer is:\n",v);
         }
         else printf(" it is error!\n");
         return 0;
     }

计算园的面积和周长:#include<stdio.h>
#define pi 3.1415926 
int main()
{
    float r;
    float circum;
    float area;
    float v;
    printf("put the r in it!\n");
    v=scanf("%f",&r);

    if(v==1 &&r>0)
    {
    circum=2*pi*r;
    area=pi*r*r;
    printf("周长是:%.2f\n",circum);
        printf("面积是;%.2f\n",area);
    }
    else printf("输入正确的数字\n");
    return 0;
}

记得进行宏定义的时候   #define  的#不要漏掉  还有 是  flaot
取余数  a%b


计算华氏摄氏度:#include<stdio.h>
int main()                                                                         
{
      int c,f,v;
      printf(" put in the temperture!\n");
          v=scanf("%d",&c);
      if(v==1)
      {
         f=9*c/5+32;
         printf("  %d is :%d\n",c,f);
      }
       else printf(" the word is error!\n");
      return 0;
}                                                                               这里注意两个问题:1.如果出现If没有对应的else  则考虑一下  if()后面是否需要加;
                                                                               2.最后在输出结果的时候,printf  因为是整数  所以 要写上%d   这个很重要。
                                                                               3.还有就是,在输出printf的地方,所对应的整数要 对其。  c,f  就不可写成f,c


float  就是进行实数的运算。

更加精确的计算摄氏度:#include<stdio.h>
int main()
{
      float c,f,v;
      printf(" put in the temperture!\n");
          v=scanf("%f",&c);
      if(v==1)
      {
         f=9*c/5+32;
         printf("  %.2f is %.2f\n",c,f);
      }
       else printf(" the word is error!\n");
      return 0;
}
                 注意:这里再输入scanf的那一行,是输入%f  而不是%.2f  而至于限制输出的位数,只要再printf 那一行改写成%.2f就好了。 

if(v==1)  表示输入一个整数


main()函数返回值如果定义的是整形(int),则需要在函数体内有返回语句return,若定义的是空类型(void),则不需要return语句来返回值!


你想返回的参数是啥,就return 啥!

源程序错误:

#include <stdio.h>
void mian(); -> void main() 两个错
int a,b,sum -> int a,b,sum; 一个错
a=123:b=456; -> a=123;b=456; 一个错
sum=a+b -> sum=a+b; 一个错

计算r=4.3的圆的直接程序:#include<stdio.h>
#define pi 3.1415
int main()
{
    float r,area;
    r=4.3;
    area=pi*r*r;
    printf("Area=%.2f\n",area);
    return 0;
}

计算一个数字的平方根:#include<stdio.h>
#include<math.h>
int main()                                              记得,使用了数学库函数,但是不要漏掉了#include<stdio.h>
{
    double x;
    printf("put a word in it!\n");  
    scanf("%lf",&x);                               注意:这里的%lf后面不可以加入/n  ,否则就会要在输入一个数字后才可以得出答案。
    printf("the answer is :%lf\n",sqrt(x));
    return 0;
}


计算顺序逆过来的数字:#include<stdio.h>
int main()
{
    int x,a,b,c,y;
    scanf("%d",&x);
    a=x/100;
    b=(x-100*a)/10;
    c=x%10;
    y=c*100+b*10+a;
    printf("%d\n",y);
    return 0;
}                                                     注意:在提取十分位的时候,要记得写成这张形式:(x-a*100)/10    其中a为提取出来的百分位上的数字


“\0”表示后面的数是八进制数,且只能有2位,而xa5有三个字符,所以是不正确的。而“\x”表示后面的数是十六进制数,同样只能有2位。
正确的书写示例:“\xa5”,表示十六进制数a5H,即16×10+5=165.
C:表示的是退格,当前输出位置回到前一位。
D: 表示输出双引号 


EG:012八进制换成10进制就是10
变量中只能存放指定类型的数据,程序运行过程中可以改变变量的类型    (错),不可以改变类型。


\\这是一个字节, 对第二个\进行转义, 这是一个 \ 字符
\\   1字节
1   1字节
2   1字节
3   1字节
4   1字节
\\    1字节
\\   1字节
\n  1字节, 回车键
最后有一个结束符\0, 表示字符串结束,占一个字节

变量被定义后没有赋值,其单元内容不可以使用,是内存中的随机数


字符表示:

#include<stdio.h>
void main()
{
    printf("         *\n");
    printf("      *  *  *\n");
    printf("   *  *  *  *  *\n");
    printf("      *  *  *\n");
    printf("         *\n");
}

#include<stdio.h>
#include<math.h>
int main()
{
    int a,b,c,d;
    printf("请输入两个数字\n");
    scanf("%d %d",&a,&b);
    c=a+b;
    d=abs(a-b);
    printf("和为:%d\n差的绝对值为:%d\n",c,d);
    return 0;                                                                     注意,这里用到了函数abs和sum,所以函数文件头还要添加一个#include<math.h>
}


#include<stdio.h>
#include<math.h>
void main()
{
    float a,b,d;
    float c;
    printf("请输入本金\n");
    scanf("%f",&a);
        printf("请输入税率\n");
    scanf("%f",&b);
    printf("请输入年限\n");
    scanf("%f",&c);
    d=a*pow(1+b,c);
    printf("本金和为:%.2f\n",d);              这里注意一个点:通过这种方式给与每个值赋值特定意义。

}
    


分段函数算法
#include<stdio.h>
#include<math.h>
void main()
{
    float x,y;
    printf("x=");
    scanf("%f",&x);
    if(x<=0)
        y=1.2*x+exp(x);
    else y=sqrt(x)+log(x);
    printf("y=%.2f\n",y);
}                                                                       这里要注意的是,if 与else的用法。当if与else之间有花括号时,说明要输入的填写类型不对。
                                                                        当只用确定变量范围的时候,就直接像左边一样就好。同时,要表明类型的对于否,还得多写上一个r=scanf(...)

另外一个分段函数算法:#include<stdio.h>
#include<math.h>
void main()
{
    float x,y;
    printf("x:\n");
    scanf("%f",&x);
    if(x<0)
    y=pow(x,5)+2*x+1/x;
    else     y=sqrt(x);
    printf("y=%.2f\n",y);
}

 

 

第三章:

 

 

#include<stdio.h>
int main()
{
    int a,b,i;
    scanf("%d,%d",&a,&b);
    i=b;
    b=a;
    a=i;
    printf("%d,%d",a,b);
    return 0;
}                                                             
回车键是字符 ,空格键也是字符,如果在输入字符与数字的时候,按空格,而没有添加getchar函数,则下一个变量则会输出空格。
这个两个的区别scanf(%d%d)   scanf(%d,%d)        不同是在:输入数据的时候,一定要按照scanf里面的原样吗。没有逗号的时候,可以输入  3  4  。有逗号的时候,就一定要输入3,4


字符转为ASCII值输出:#include<stdio.h>
int main()
{
    char a;
    a=getchar();
    printf("ASCII=%d\n",a);
    return 0;
}

计算二元一次方程:

#include<stdio.h>
#include<math.h>
int main()
{
     int a,b,c;
     float x1,x2;
     printf("请输入a的值\n");
     scanf("%d",&a);
     printf("请输入b的值\n");
     scanf("%d",&b);
     printf("请输入c的值\n");
     scanf("%d",&c);
     x1=(-b+sqrt(pow(b,2)-4*a*c))/(2*a);
         x2=(-b-sqrt(pow(b,2)-4*a*c))/(2*a);
         printf("x1=%.4f\n",x1);
         printf("x2=%.4f\n",x2);
         return 0;
}


利息算法:#include<stdio.h>
#include<math.h>
void main()
{
    float a,b;
    float c,sum;
    printf("请输入存款金额\n");
    scanf("%f",&a);
    printf("请输入存款周期\n");
    scanf("%f",&b);
    printf("请输入年利率\n");
    scanf("%f",&c);
    sum=a*pow(1+c,b);
    printf("sum=%.2f\n",sum);
}


另外一个算法:#include<stdio.h>
#include<math.h>
int main()
{
    int a,b;
        float c,sum;
        scanf("%d%d%f",&a,&b,&c);   
    sum=a*pow(1+c,b);
        printf("sum=%7.2f",sum);
        return 0;
}
注意,scanf函数是一个输入函数,所以scanf里面的函数类型也是按照顺序排的(包括在输入数据的时候),只要一 一 对应即可,千万不可以输入的是小数,但是在scanf里面对应的是int 整型


直接求方程的值:x2+x-2=0

#include<stdio.h>
#include<math.h>
int main()
{
    float x1,x2;
        int a,b,c;
        a=1,b=1,c=-2;
        x1=(-b+sqrt(pow(b,2)-4*a*c))/(2*a);
        x2=(-b-sqrt(pow(b,2)-4*a*c))/(2*a);
        printf("x1=%.4f",x1);
        printf("x2=%.4f",x2);
        return 0;
}

 

 

第四章:

 

 

输入一个字符,若是大写字母,转换成小写字母,若是小写字母,则转换成大写字母输出。

#include<stdio.h>
int main()
{
    char ch;
    ch=getchar();
    ch=(ch>='A'&&ch<='Z')? (ch+32):(ch-32);
    putchar(ch);
    return 0;
}

成绩百分制:
#include<stdio.h>
int main()
{
    float grade;
    int mark;
    scanf("%f",&grade);
    mark=grade/10;
    switch(mark)
    {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:printf("grade:E\n");break;
    case 6:printf("grade:D\n");break;
    case 7:printf("grade:C\n");break;
    case 8:printf("grade:B\n");break;
    case 9:
    case 10:printf("grade=A\n");break;
    default:printf("In put error\n");
    }
    return 0;
}

水仙花数:
#include<stdio.h>
int main()
{
    int a,b,c,d,q;
    scanf("%d",&d);
    a=d/100;
    b=d/10%10;
    c=d%10;
    q=a*a*a+b*b*b+c*c*c;
    if(d==q&&d>0)
        printf("%d是水仙花数!\n",d);
    else printf("%d不是水仙花数\n",d);
    return 0;
}

注意:题目里的感叹号也许是 全角(英文模式下)

if  esle 的嵌套语句:

#include <stdio.h>
int main()
{
    double x,y;
    scanf("%lf",&x);
    if(x<0)
        printf("y=0.00");
    else 
        if(x>=0&&x<=15)
        {y=(4*x)/3;
            printf("y=%.2f",y);
        }
            else 
            {    y=2.5*x-10.5;
        
            printf("y=%.2f",y);
            }
            return 0;
}


错题归纳:
假设变量a,b均为整型,表达式  (a=5,b=2,a>b?a++:b++,a+b)  的值是_____
后面的a+b语句,是执行玩前面的语句再执行的。

nt x=2,y=3,z=4;  则表达式x+y&&(x=y)的值为_____。
是非与否的概念,x+y>0 为1, x=y x>0 为1  所以,整体为真,所以 答案为1


C语言中,switch后的括号内表达式(  )   只可以是整型


易错题解析:
if(a>c)
b=a;
a=c;
c=b;
其实前两句话是一起的,if语句到第一个“;”就结束了。
后两句是各自独立的。
首先a>c这个不成立,所以 b=a这个就不会被操作,而是自动跳过去。
然后a=c;是将c的值赋予a,也就是此时a=3,c的值不被改变。
然后c=b;是将b的值赋予c,也就是此时c=2,b的值不被改变。
所以最终结果是a=3,b=2,c=2.

在if语句中,if后面的表达式可以是关系表达式与逻辑表达式,而不能是算术表达式。    错
可以是任意表达式。

 

 

第五章+第六章:

 

求1~100以内 ( 包括100)能被3整除同时被5整除余数为1的所有数之和。要求用for语句完成。
#include<stdio.h>
int main()
{
    int i,sum;
    sum=0;
    for(i=1;i<=100;i++)
    {    
        if(i%3==0&&i%5==1)
            sum=sum+i;
        else continue;
    }
    printf("sum=%d\n",sum);
    return 0;
}

用do while 语句实现反复从键盘输入一个整数,如果大于或等于零,累加求和,直到输入负数结束。然后求出平均值并输出。
#include<stdio.h>
int main()
{
    int i,count;
     float sum,ave;
    sum=0;
    count=0;
    do
    {
        scanf("%d",&i);
        if(i>=0)
        {    sum=sum+i;
        count++;
        }
    }
    while(i>=0);
    ave=sum/count;
    printf("AVE=%.2f\n",ave);
        return 0;
}

      注意:1.if后面的语句如果大于1个语句,要用花括号,否则,例如这题,执行完sum=sum+i后,不是跳出该循环,而是执行count++
                 2.同时,do while 语句是直到型循环,所以,在do 后面的语句还要输入一个判断性的语句,该语句的判断就是while里面的。
因为,直到型,先做do里面的。

用while语句计算圆周率的近似值。(直到累加项的绝对值小于 0.00001 )
#include<stdio.h>
int main()
{
     float i,k;
     double sum;
     k=1.0;
    i=1;
    sum=0;
    while((1/i)>1e-5)
    {
      sum=sum+k/i;
       i=i+2;
       k=-k;
       }
    printf("pi=%.2f\n",4*sum);
    return 0;
}
     注意:i这个项,如果是对(1/i)这个整体则小于1e-6       ,同时,这里还需注意的是,e表示10的.....次方,e的后面只能输入整数(正整数或着负整数)。
     如果只是对i,则i>1e6   否则,会直接退出运算,得到的结果为0.另一个结果为0的是:1/i,要写成1.0/i,应为整数(int)运算,结果抛掉了小数,保留趋向于0的整数部位。


注意:unknown character '0xa3'    像这种形式的错位是指,中文模式下的输入或者全角模式下的输入。

另一种答案(法二):#include<stdio.h>
#include<math.h>
int main()
{
     float i,n;
     double sum;
     n=2;
    i=1;
    sum=0;
    while((1/i)>1e-5)
    {
      sum=sum+pow(-1,n)*(1.0/i);
       i=i+2;
       n=n+1;
       }
    printf("pi=%.2f\n",4*sum);
    return 0;
}
     

計算三角形周长,判断形状,判断是否可以构成三角形
if(a<0||b<0||c<0)
         printf("输入数据错误,这些边不能构成三角形\n");
     else if(a+b<=c||a+c<=b||b+c<=a)
         printf("输入数据错误,这些边不能构成三角形\n");

      else
      {
          if(a==b&&a==c&&b==c)
          {
              perimeter=a+b+c;
              printf("周长=%.2f\n三角形形状:等边三角形",perimeter);
          }
          else if((a==b&&a!=c&&b!=c)||(a==c&&a!=b&&c!=b)||(b==c&&b!=a&&c!=a))

          {
              perimeter=a+b+c;
              printf("周长=%.2f\n三角形形状:等腰三角形",perimeter);
          }
          else
          {
              perimeter=a+b+c;
             printf("周长=%.2f\n三角形形状:非等腰三角形",perimeter);
          }


      }


       注意:                          不可以a==c==b   
                                             要写成:(a==b&&a==c&&b==c)


/*程序功能:输入五级制成绩(A-E),输出相应的百分制成绩(0-100)区间。*/

/*提示:除在指定位置添加语句之外,请不要改动程序中的其他内容。*/

#include <stdio.h>
void main( )
{
    char grade;
    printf("请输入五级制成绩(A-E):");             /* 输入提示 */
    scanf("%c",&grade);
    /*请在两条星线之间填入相应的代码,输出相应的百分制成绩(0-100)区间*/
    /******************************************************************/
    grade=getchar():-------这是错误的一步,把这部删了,就对了!
    switch(grade)
     {
         case 'A':printf("%c---[90,100]\n",grade);break;
         case 'B':printf("%c---[80,89]\n",grade);break;
         case 'C':printf("%c---[70,79]\n",grade);break;
         case 'D':printf("%c---[60,69]\n",grade);break;
         case 'E':printf("%c---[0,59])\n",grade);break;
         default:printf("Input Error!\n");break;
         }

    /******************************************************************/
    return;     /* 返回 */
}

  注意这里一个很错误的过程:  已经输入过scanf函数了,但是,我这里又输入了一个getchar(),重复了!因为都代表输入性函数!


求两个数的最大公约数:#include<stdio.h>
int main()
{
    int tmp, a, b;
    scanf("%d%d", &a, &b);
    while (a%b != 0)
    {
        tmp=a%b;
        a = b;
        b = tmp;
    }
    printf("GCD=%d\n",b);
    return 0;
}


找出一个大于给定整数且紧随这个整数的素数,例如 给定整数3,找到的素数是5:
#include<stdio.h>
int main()
{
    int a,i,b;
    scanf("%d",&a);
    i=a+1;
    for(i;;i++)
    {
        for(b=2;b<i;b++)
        {
            if(i%b==0)
                break;
             else
             {
                 if(b<i);
                 else 
                     break;
             }   
        }
    if(b==i)
        break;
        else if(b<i);
    }
      printf("prime=%d\n",i);
    return 0;
}
斐波那契数列求和:
#include<stdio.h>
int main()
{
    int a,b,c,sum,count;
    count=1;
    a=1;
    b=1;
    sum=0;
    for(count=1;count<10;count++)
    {
        
          a=a+b;
          b=a+b;
          sum=a+b+sum;

    }
    c=sum+2;
    printf("sum=%d\n",c);
    return 0;
}


while 与for里面 用continue 的区别
语法区别不大。在while中continue较少使用。

相同:都是跳过剩下的循环体代码,直接到达右大括号位置。

不同:for中continue之后,接着执行 i++部分。而在while(c=='A')中,直接又回到了判真条件c=='A'这里。
实践:从不同点可看出,若在while(c=='A'){ continue; //c='B'; } 中,c=='A'始终为真,因为你把 改变条件的语句(c='B')跳过了。而for不会出现此情况,因为 for(int i = 0;i<10;i++),它的变量自增i++是写到 for()结构里面的。

 

第七章:

 

1逆序存放数据(10分)
题目内容:

编写程序,输入6个整数存入数组中,按输入顺序的逆序存放在该数组中并输出。

#include<stdio.h>
int main()
{
    int a[6],i;
    for(i=0;i<6;i++)
        scanf("%d",&a[i]);
        for(i=5;i>=0;i--)
            printf("%d\n",a[i]);
    return 0;
}

2找出一维整型数组中的次最大值。(10分)
题目内容:

定义一维整型数组,输入5个数,从大到小排序,输出次最大值。

#include<stdio.h>
int main()
{
    int a[5],i,j,t;
    for(i=0;i<5;i++)
        scanf("%d",&a[i]);
    for(i=0;i<5;i++)
    {
        for(j=i+1;j<5;j++)
        {
            if(a[i]<a[j])
            {    t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
                else;
        }
    }
printf("次最大值=%d",a[1]);
return 0;
}

输入一维数组的6个元素,将最大值与最后一个交换
(注意)  这里不用再输入 for(i=0;i<6;i++)了,因为这一步要是比较所有数字的。而这一题只是比较一个数

#include<stdio.h>
int main()
{
    int a[6],i,j,k,m;
    for(i=0;i<6;i++)
        scanf("%d",&a[i]);
    
        k=0;
    for(j=1;j<6;j++)
        if(a[j]>a[k])
        {
            k=j;
        }
        

    m=a[k];
    a[k]=a[5];
    a[5]=m;
    for(i=0;i<6;i++)
        printf("%d\n",a[i]);
    return 0;
}

输入一个正整数n,再输入n个正整数,统计偶数个数与偶数和
(数组的形式)
#include<stdio.h>
 int main()
{
      int s,c,a,b[10],i;
      c=0;
      s=0;
      printf("请输入数字的个数\n");
      scanf("%d",&a);
      printf("请输入%d数字\n",a);
      for(i=0;i<10;i++)
          scanf("%d",&b[i]);
      for(i=0;i<10;i++)
          if(b[i]%2==0)
          {
              c++;
          s=s+b[i];
          }
          printf("偶数个数=%d,偶数和=%d\n",c,s);
          return 0;
}
【独立编程】程序功能:输入一个长整数n,从高位开始逐位分离并输出。例如输入123456,程序运行结果如下图
(不用数组的办法)


#include<stdio.h>
#include<math.h>
int main()
{
    int n,digit,i,m,a,p;
    m=-1;
    printf("输入一个正整数:\n");
    scanf("%d",&n);
    a=n;
    p=a;
    while(n!=0)
    {
        digit=n%10;
        n=n/10;
        m++;
    }
    printf("从高位逐渐分离并输出的结果为:%d,",digit);
    for(i=m;i>0;i--)
    {
        a=p;
        a=a-(digit*pow(10,m));
        p=a;
        m=-1;
        while(a!=0)
        {
        digit=a%10;
        a=a/10;
        m++;
        }
        printf("%d,",digit);
    }
    return 0;
}

a[i]=9*(i-2+4*(i>3))%5;     先判断 i 是否大于3 若果成立 返回1 反之返回0
数组的下标通常是float型。 错。应为整数或整数表达式。
数组可以声明为任何数据类型,包括任何基本数据类型和引用数据类型
数组名定名规则和变量名相同,

以下能对一维数组a进行正确初始化的语句是()
A:int a[10]=(0,0,0,0,0) B:int a[10]={}; C:int a[]={0}; D:int a[10]={10*1};

A 写成括号不对
B {}中没写值,不对
C 正确,数组直接赋初值可以不标数组元素个数,会根据后面赋值个数自动分配空间
D 正确,但要注意这样写只是给a[0]赋值10,其余的9个赋值为0,而不是将十个都赋值成1

猴子吃桃子问题:猴子第一天摘下若干个桃子,当即吃了一半多一个,第二天将剩下的桃子吃掉一半多一个,以后每天都吃掉前一天剩下桃子的一半多一个。到第10天想再吃时,只剩下一个桃子。求第一天猴子共摘了多少个桃子?

#include<stdio.h>
int main()
{

   int i,x1,x2;
   x2=1;
   for(i=10;i>1;i--)
   {
       x1=2*(x2+1);
       x2=x1;
   }
      printf("猴子第一天共摘了%d个桃子",x1);
      return 0;
}

求1—10000之间所有水仙花数。水仙花数就是满足各位数字的立方和等于它本身的数。

#include<stdio.h>
int main()
{
    int i,digit,count,sum,a;
    printf("1-10000间的所有水仙花数:\n");
    count=0;
    sum=0;
    for(i=1;i<=10000;i++)
    { 
       a=i;
        while(a!=0)
        {
        digit=a%10;
        a=a/10;
        sum+=digit*digit*digit;
        }
        if(i==sum)
        {
           count++;
           printf("%d\n",i);
           sum=0;
        }
    }
    printf("一共有%d个\n",count);
    return 0;
}                                                                         注意:这里要小心,不可以重复利用i。当进行i的重复循环时,i会改变,i又变为0,所以,在for循环的第一步,就要将i的值赋给另一个变量。用这个新的变量,进行运算。

        

第八章:

大写字母到小写字母   ASCII增加32;
小写字母到大写字母   ASCII减少32;
如果要做字母与数字的ASCII码比较应该加单引号 如是'A'>'2'
判断是字母还是数字:
ch = getchar(); //ch相当于一个字符变量,现在需要Get(得到)这个字符变量的内容
    if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') //判断:如果ch字符的值大于a,并且小于z;ch字符的值大于A,并且小于Z
        printf("您输入的是字母!\n"); //输出是字母
    else if (ch >= '0' && ch <= '9') //另外如果ch字符的值大于0并且小于9的话
        printf("您输入的是数字!\n"); //输出是数字
将字符串的小写字母转换为大写字母。(提示:不允许使用字符串转换函数):
#include<stdio.h>
int main()
{
   char a[8],i;
   gets(a);
    for(i=0;i<8;i++)
    {
        if(a[i]>='a'&&a[i]<='z')
            a[i]=a[i]-32;
        else if(a[i]>='A'&&a[i]<='Z');
        else ;
    }
    puts(a);
    return 0;
}
将两个字符串连接,不要用stract函数:
#include<stdio.h>
int main()
{
    char a[10],b[10];
    int i,j;
    i=0,j=0;
    gets(a);
    gets(b);
    while(a[i]!=0)
        i++;
    while((a[i++]=b[j++])!=0);
    puts(a);
        
    return 0;
}
    
对两个数组a和b进行如下初始化

char a[]=”ABCDEF”;
char b[]={‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’}

第一个是 字符串,第二个是字符数组 ,字符串以'\0'为结束符号,字符数组不用
a比b长。


strlen的结果要在运行的时候才能计算出来,主要用来计算字符串的长度,不是类型占内存的大小,strlen只能用char*做参数,且必须是以''\0''结尾的
使用strlen函数可以求出一个字符串的存储长度(!!!!!!!!不包含‘\0’字符!!!!!)。

在程序中可以对数值数组中的数据进行整体使用(错误!!)

while(a[i++]!='\0')   像这种  a[i++],在括号里面。显示判断a[i],在a++.再进行while循环。


strcat(a,b)所以:a="ABLMNP"; b=“LMNP”

#include "stdio.h"

#include"string.h"

int main( )

{char a[80]="AB",b[80]="LMNP";

int i=0;

strcat(a,b);

while(a[i++]!='\0')

b[i]=a[i];

puts(b);

return 0;

}

答案:LBLMNP

注意这个题型:char c='a',t[50];
在一个字符数组中查找一个指定的字符
                                                             是写成这样的形式:t[k]==c
若没有给出c='a'这种 形式则写为   他t[k]=='a'


注意一个事:int max=a[i],min=a[i] 这种形式,中间可以写上逗号
否则  max=a[i];min=a[i];    中间是分号!! 

一个FOR循环的新功能,找到要插入的位置:
/*在两条度星线间填入代码知, 在数组a中查找整数x应插入的位置道 */
/**********************************************************/
for(i=0;i<n && a[i]<x;i++);

这里一定要注意的问题:for()  后面一定要加分号;
/*在两条星线间填入代码, 将a[i]到a[n-1]间的所有元素后移一个位置*/
    /**************************************************************/
       for(j=n;j>i;j--)
           a[j]=a[j-1];


在数组输出的时候,可以多空几位,方便看;----------    printf("%6d",a[i]);


getchar函数每次只从缓冲区中接受一个字符。


 

第九章:

 

编写函数计算银行存款本息,在主函数中从键盘输入银行存款金额(money)、存款周期(year)和年利率(rate),调用计算银行存款本息函数,根据下面公式计算存款到期时的本息合计(sum),返回到主函数输出本息合计金额(要求保留2位小数)。
程序:#include<stdio.h>
#include<math.h>
 double M(int money,int year,double rate) 
 {
        double sum;
     sum=money*pow((1+rate),year);
     return sum;
 }
 int main()
 {
     int money,year;
     double rate,sum;
     scanf("%d%d%lf",&money,&year,&rate);
     sum=M(money,year,rate);
     printf("sum=%.2f",sum);
     return 0;
 }
         
提示:程序需要包含数学头函数库。    money、year使用整型变量,sum、rate使用双精度实型变量。

十进制转换为二进制:一直到余数为0.

将十进制转换为二进制:#include<stdio.h>
int M(int m)
{
    int y,q,j,a[20];
    int i=0;
    while(q!=0)
    {
         y=m%2;
        q=m/2;
        m=q;
        a[i]=y;
        i++;
    }
       m=0;
    for(j=i-1;j>=0;j--)
        m=m*10+a[j];
        return m;
}

int main()
    {
        int m,c,x;
        scanf("%d",&m);
        c=M(m);
        printf("%d\n",c);
        return 0;
    }

这里注意一个点:就是将算出来的结果反序得到真正的二进制结果。(注意,只是适用于二进制)
 m=0;
    for(j=i-1;j>=0;j--)
        m=m*10+a[j];
        return m;                ! 很重要!
在函数声明的时候记得:  声明的函数后面要加分号  ;
return 语句:
首先,除非你使用void函数,其他类型函数必须有return语句,如果没有return,不能通过编译。也就是你所谓的“带回一个不确定的值”。
所以,不是不带回值!
函数的返回值是通过!!!函数中的!!!return语句获得的
若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D  ) 

A)函数调用可以作为独立的语句存在 

B)函数调用可以作为一个函数的实参 

C)函数调用可以出现在表达式中 

D)函数调用可以作为一个函数的形参

解析:返回值存在寄存器中, 没有地址, 不能作为形参,但可以作为实参。

一个函数中可以有多个return,但是函数在运行时只能有一个return生效。
int f()                

   {                      

    int x;                            
      scanf("%d", &x);    

      return  x++, x+5;


不可以对其赋值!
int main()        

{                      

     float a=2.6 , b;          

     b=max(2.1, 3.6)=a++;    

  printf("%f", a+b);     

 }                                    !  不能对函数赋值!(
     b=max(2.1, 3.6)=a++;    )
函数通过return语句可以向主调用函数返回多个值  (错误)===只可以!!一个!!


    

第十章:

 

#include<stdio.h>
double a(double x, int n)
    {
        double m;
        if(n==0)
            return 1;
        else 
        m=x*a(x,n-1);
        return m;
    }
int main()
{
    double m,x;
    int n;
    scanf("%lf%d",&x,&n);
    m=a(x,n);
    printf("%f",m);
    return 0;
}

这里的递归注意一下:1.终止条件,返回值(return )尽量为常数,可以直接写成return 1;(之类的)。
2.定制的函数名,不可以和变量名字一样。【a(int b int c)   int a】 这种就是错误的。      


#include<stdio.h>
int max,min;
void m(int a[],int n)
{
    int i;
    i=0;
    max=a[i];
    min=a[i];
    for(i=1;i<10;i++)
    {
        if(a[i]>max) max=a[i];
        if(a[i]<min) min=a[i];
    }
    
}
    int main()
    {
        int a[10],i;
        for(i=0;i<10;i++)
            scanf("%d",&a[i]);
       m(a,10);
        printf("max=%d,min=%d",max,min);
        return 0;
    }  

注意:因为两个函数都用到了 max  min 以为这要用全局变量!
当然,如果不用全局变量的话,需要在制作函数的部分中,m(a[],n)   写成m(a[],n,max,min)
这个时候,当在main函数中再次定义max min 时侯,main中max min的数据就是函数中的数据了。

字符数组可以存放数字。


重要的一个程序;
1.将数字转换为字符;
2.利用剥离数据的方法插入数据,或者符号。
#include<stdio.h>
#define N 30
int m(char a[])
{
    int x,i,m;
    i=0;
    m=0;
    scanf("%d",&x);  
    while(x!=0)
    {
       a[m]='0'+x%10;
       i++;
       m++;
       x=x/10;
       if(i%3==0&&x!=0)
       {
           a[m]=',';
           m++;
           i=0;
       }
    }
    a[m]='\0';
    return m;
}
int main()
{
    char a[N];
    int n,i;
    n=m(a);
    for(i=n-1;i>=0;i--)
        putchar(a[i]);
    return 0;
}

 

第十一章:

注意,当数组为字符型时,不可以定义*p(int)(虽然本身*p就是整型)
应该这样写:char a[20],*p=a;
                    gets(a);
int *r; double  x; 则语句 r=&x; 是合法的  错误!
1.若有定义:char ch,*p=&ch;

通过指针p给变量ch读入字符的scanf调用语句是_     scanf("%c",p)
2.若有定义:char ch,*p=&ch;  

通过指针p用格式输出函数输出ch中字符的语句是______
printf("%c",*p)                                                                         !!!!!!  注意:是“%c”!!!


如有变量的定义char *p=”abc”; 语句 *p=’X’;是合法的。
  错误:这种定义的话,一定要  char *p="x"  才是合法的。

用%s 就是把你的输入当成专一个地址,然后输出从这个地址开始的字符串(直到遇到 '0'表示字符串停止)


这个是合法的,,p=”VC++”    相当于将字符串的首地址赋给p.

如有变量的定义char *p=”abc”; 语句 *p=’X’;是合法的  !(错误)!!
因为:    
指向的内容不可以写,指针可以变    这道题目改变了指针内容!


删除字符串的所有前导空格,请完善程序。

#include <stdio.h>

void f1(char *s)

{

char *t;

  t=__s_;

          while(*s==' ')

 s++;

  while(*t++=*s++); 

}

int main( )

        {

char str[80]; 

  gets(str);

  f1(str); 

  puts(str);

  return 0;

}                                             这里需要注意的是:*t=*s  这个语句,指把s[1]的转到t[1]里(然后 s[2] t[2]    以此类推) 因为t指向s  所以对t的改变就是对s的改变。

 

 

 

第十二章:

于是对于  *p[2]  结合的方式应该是   *(p[2])    对于  (*p)[2]  显然结合方式是括号中的 *p 优先于 [2];


有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指向数组的指针变量实现。

使用数组 float score[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}}
代码:
#include<stdio.h>
int main()
{
    float a[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}},*p[3];
    int i,j;
    p[0]=a[0];
    p[1]=a[1];
    p[2]=a[2];
    scanf("%d",&i);
    switch(i)
    {
    case 0:for(j=0;j<4;j++)
               printf("%8.2f",*(*(p+i)+j));break;
    case 1:for(j=0;j<4;j++)
               printf("%8.2f",*(*(p+i)+j));break;
    case 2:for(j=0;j<4;j++)
               printf("%8.2f",*(*(p+i)+j));break;
    default: ;break;
    }
return 0;
}   
这里有一个要注意的地方:无论是(*p)[n]   (n 在这里是指列),还是*p[n] p[0]=a[0].......    
                                        它的输出方式都是:for(j=0;j<4;j++)
               printf("%8.2f",*(*(p+i)+j));break;
  还有要注意的是:*(*(p+i)+j)   代表a[i][i]


函数原型:char *strcpy(char *dst,char const *src)
如果一个变量的值是一级指针变量的地址,则称这个变量为二级指针变量。   例如:a[3][5]      a为二级指针,a[0]是一级指针,a[0]+1   指向a[0][1]              
可以利用指针实现函数返回多个值     正确:例如用指针交换两个值。
作为函数形式参数时,int x[ ][5]与int (*x)[5]两种写法等价  
因为:二位M*N数组的名字是一个指向N元数组的指针常量,int (*x)[5]  同理。
strcpy(char *p, char *q)   是连同结束字符也要复制过去的。
while(*p)   是指  p数组的第一个数字或者字母 不等于0.(同时,在此之前,P要有指向。若无,则不进行循环体。)
int (*p)[10];, 则标识符p是:   
指向含有10个整型元素的一维数组的指针
*p++ = *q的意思是
*p= *q;
p=p+1;

strcat 函数:
char s1[]="hello",s2[]="programs";
    strcat(s1,s2);


 *y+2    表示为   y[0]+2
如有定义char y[4]= "321",则表达式 *y+2的值是  5     .   当为一维数组时候,*(y+2)  就表示y[2]   *y就表示   y[0]

 这个程序段本身就是一个错误,在判断while(*p)的时候,首地址是不确定的,随机值,无法判断。

void strcpy4( char *p, char *q)

{   

while(*p)

  *p++=*q++;  
}


A.
char s[]="12345", t[]="6543d21";

strcpy( s,t);

0.00/2.00

B.
char s[20], *t="12345";

    strcat(s,t);


C.
char s[20]=" ", *t="12345";
    strcat(s, t); 


D.
char *s="12345", *t="54321";

  strcat (s,t);


这四道题的解析:A. 有越界嫌疑
B. s不是字符串,没有结束符 ,找不到连接点
C. 对,将t指向的字符串可连接在s(原先是空字符串)的后面
D. s和t都指向字符串常量,字符串常量存储在只读存储区中,不能被修改。
(其实就是,*p="123456798"  这个字符串是没有错误的,但是这个每个值的空间都分配满了,是个常量指针,是不可以改写的,只可以重新指向)
同理;*p="asd" 也是一样的。因为strcat(a,b)函数是改变了 a 的值,而改变必须要为变量。

strcpy  函数,是连同了结束符在内的,且连接数组/字符串的时候(a,b)  地址就好。

在数组中,局部变量数组也是独立开来的,即使同名。
还有,在指针变量赋值的方面,尽量不要*p直接赋值, 但可以两个指针之间赋值,*p=*q; 
还有 指针的结束符号 可以赋值:*p2 = '\0'


注意 这里的一个低级错误,不是因为不可以同名,而是因为 在int main函数中的指针【char *s,*t;】定义是没有初始化的,没有指向的,他不是数字,分配了空间的。
void M(char *s ,char *t, int m);
int main()
{
    char *s,*t;
    int m;
    scanf("%d",&m);
    M(s,t,m);
    puts(s);
    return 0;
}
void M(char *s ,char *t, int m)

正确写法:#include<stdio.h>
void M(char *s ,char *t, int m);
int main()
{
    char a[20],b[20];
    int n;
    scanf("%d",&n);
    M(a,b,n);
    puts(a);
    return 0;
}
void M(char *s ,char *t, int m)
{
    scanf("%s",t);
    m=m-1;
    while(*(t+m)!='\0')
    {
        *s=*(t+m);
        m++;
        s++;
    }
    *s='\0';
}

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值