首页 > 代码库 > 《明解c语言》读书笔记

《明解c语言》读书笔记

1-3 输入和显示

  • puts函数只接受 一个 实参,并且在结尾自动换行

 

2-1运算

  • 求商运算符  :除法运算符" / ",如果是两个整数相除结果为整数如果需要保留小数时 必须将其中一个除数转换为浮点数。5/3=1 3/5=0 6.0/4=1.5   (List01)
  • 求余运算符 int%int
  • 用printf函数打印%时,要避免使用转换功能,必须写成%%,printf(“5%%3=%d\n”,5%3);当使用不具备转换说明功能的puts函数时,写一个%即可。

       练习:显示读取整数的最后一位数字(对10求余)

                百分比问题(list02)

  • 操作数类型不同时,会进行向上转型(int——>double),然后再运算。
  • 还是百分比问题,代码改动,因为输入的用户习惯是整数而不是实数,所以将输入整数向上转型后再进行求商运算

       

 1 #include<stdio.h> 2 int main() 3 { 4     float num1,num2; 5     puts("请输入第一个数:"); 6     scanf("%d",&num1); 7     puts("请输入第一个数:"); 8     scanf("%d",&num2); 9     printf("num1是num2的%f%%",double(num1)/num2*100);10     getch();//持续显示dos窗口11     return 0;12 }
View Code
  • 条件运算符,是一个三目运算符。n1?n2:n3
  • switch语句:如果case语句后面没有break,则会顺序执行下来。

4-1  do语句

  • 逆向显示数值(规定是正数)

    

 1 #include<stdio.h> 2 int main() 3 { 4     int num; 5     do 6     { 7         puts("请输入一个正数:"); 8         scanf("%d",&num); 9         if(num<0)10             puts("请重新输入一个正数!");11     }while(num<0);12     13     puts("逆序的正数变为:");14     15     do16     {17         printf("%d",num%10);18         num=num/10;19     }while(num!=0);20 21     getch();22     23     return 0;24 }

 

  •  4-13:输入整数后,循环显示1234567890,显示的位数和输入的整数值相同。例如输入12,显示:123456789012

     

 1 #include<stdio.h> 2 int main() 3 { 4     int i,j,num; 5     j=1; 6     printf("enter a number:"); 7     scanf("%d",&num); 8     for(i=1;i<=num;i++) 9     {10         printf("%d",j);11         j++;12         if(j==10)13             j=0;14     }15     getch();16     return 0;17 }

4-15 输入九九乘法表增加横轴标题

 1 #include<stdio.h> 2 void main() 3 { 4     int i,j; 5     printf("    | "); 6     for(i=1;i<=9;i++) 7     { 8         printf("%3d ",i); 9     }10     putchar(\n);11     for (i=0;i<=50;i++)12     {13         printf("-");14     }15     putchar(\n);16     for(i=1;i<=9;i++)17 18     {19         printf(" %d  |",i);20         for(j=1;j<=9;j++)21         {22             23             printf(" %3d",i*j);24         }25         putchar(\n);26     }27     getch();28 }

 5-1数组

  • 数组的声明和初始化

     1)声明数组的时候,元素个数必须是常量

    int n=5;int a[n];(FALSE)


2)初始化如不指定元素个数,数组会根据初始化值的个数自动进行设定

   int vc[]={1,2,3,5,7};

3)初始化初始值数量不足时,会自动用0对剩余的元素进行初始化

4)不能通过赋值进行初始化

int vc[3];

vc={1,2,3};

练习:以10分为单位显示出学生的成绩分布图

结果:

代码:

 1 #include<stdio.h> 2 #define NUMBER 80  //人数上限 3 void main() 4 { 5     int i,j; 6     int num;  //实际人数 7     int fenshu[NUMBER];//学生分数 8     int fenbu[11]={0};//分数分布 9 10     printf("请输入学生人数:");11     do12     {13         scanf("%d",&num);14         if(num<1||num>NUMBER)15             printf("\a人数范围[1到%d]:",NUMBER);16     }while(num<1||num>NUMBER);17 18     puts("请输入学生分数:");19 20     for(i=0;i<num;i++)21     {22         printf("%2d号:",i+1);23         do24         {25             scanf("%d",&fenshu[i]);26             if(fenshu[i]<0||fenshu[i]>100)27                 printf("\a分数范围[0到100]:");28         }while(fenshu[i]<0||fenshu[i]>100);29         fenbu[fenshu[i]/10]++;30     }31 32     puts("\n ---分布图---");33     printf("   100:");34     for(j=0;j<fenbu[10];j++)35         putchar(*);36     putchar(\n);37     38     for(i=9;i>=0;i--)39     {40         printf("%3d-%3d:",i*10,i*10+9);41         for(j=0;j<fenbu[i];j++)42             putchar(*);43         putchar(\n);44     }45     getch();46 }

这里面有些关于if while循环输入和分布统计的格式需要注意

 练习:写一段程序,求出矩阵x和y的值

我第一次写的程序可谓“人神共愤”,要数清楚原矩阵和结果矩阵的维数才能进行for循环,贴出来反省一下

 1 #include<stdio.h> 2 void main() 3 { 4      5         int x[2][3]={{1,2,3},{4,5,6}}; 6         int y[3][2]={{1,5},{5,3},{8,1}}; 7         int mc[2][1]={0}; 8         int i,j; 9         //计算10         for(i=0;i<2;i++)11         {12             for(j=0;j<3;j++)13             {14             15                 mc[i][1]+=x[i][j]*y[j][i];16             17             }18         }19         //输出20         for(i=0;i<2;i++)21         {22             23             24                 printf("%3d",mc[i][1]);25                 putchar(\n);26         }27 28 29     getchar();30 }

后来看到网上的模板,用函数调用写的层次分明,原帖:http://blog.sina.com.cn/s/blog_8e392fc20101br1e.html

结果:

 

代码:

 1 #include<stdio.h> 2 #define SIZE 20 //预定义要进行转置的矩阵最大大小为 20*20 3 //为了函数参数传递的方便,将行和列的具体大小定义为全局变量 4 int a_column; 5 int a_row ; 6 int b_row; 7 int b_column; 8 int c[SIZE][SIZE]={0}; 9 //矩阵的输入函数10 void inputMatrix(int a[][SIZE] , int n, int m){ //二维数组参数下标必须要确定11  int i,j;12  for(i = 0;i < n;i++){13   for(j = 0;j < m;j++){14    scanf("%d",&a[i][j]);15   }16  }17 }18 //矩阵的输出函数19 void outputMatrix(int c[][SIZE] , int n, int m){20  int i,j;21  for(i = 0;i < n;i++){22   for(j = 0;j < m;j++){23    printf("%d ",c[i][j]);  24   }25   printf("\n"); //每次打印完一行后进行换行26  }27 }28 //矩阵的乘法算29 void matrixMultiplication(int a[][SIZE], int b[][SIZE]){30  int i,j,k;31  for(i = 0;i < a_row;i++){32   for(j = 0; j < b_column ; j++){33    for(k = 0; k < a_column;k++){34     c[i][j] = c[i][j]+ a[i][k] * b[k][j];35    }36   }37  }38 }39 int main()40 { 41  //定义数组并初始化42  int a[SIZE][SIZE]={0};43  int b[SIZE][SIZE]={0};//定义数组,注意要初始化44  //矩阵行,列数的确定45  printf("请输入第一个矩阵的行数 : ");46  scanf("%d",&a_row);47  printf("\n请输入第一个矩阵的列数 :");48  scanf("%d",&a_column);49  //函数调用及主功能实现50  printf("请输入矩阵A ( %d X %d 形式)\n" ,  a_row,a_column);51  inputMatrix(a , a_row, a_column); 52  b_row=a_column;53  printf("注意:根据数学原理,您将输入的第二个矩阵的行数为 %d \n",b_row);54  printf("请输入矩阵B的列数 : ");55  scanf("%d",&b_column);56  printf("请输入矩阵B ( %d X %d 形式) : \n" , b_row , b_column);57  inputMatrix(b, b_row , b_column);58  //调用相乘函数59  matrixMultiplication(a,b);60  printf("A与B相乘后的矩阵C是 :\n");61  outputMatrix(c, a_row , b_column);62  getchar();63  return 0;64 }
5-15 求解质数
 1 #include<stdio.h> 2 int main() 3 { 4     int no,i; 5     printf("请输入一个数字:"); 6     scanf("%d",&no); 7     for(i=2;i<no;i++) 8     { 9           if(no%i==0)10         {11             printf("不是质数");12             break;13         }14          15     }16      if(no==i)17             printf("是质数");18     getch();19     return 0;20 }

一开始printf输成prinf,结果链接出问题。vs2010既不显示关键词也不告诉我哪儿错了,害我找半天。

然后就是最后的if(no==i)如果写在for循环里面永远都跳不出来。因为i==no时候就跳出了for循环了,还怎么执行这个if啊。。。

 

 

《明解c语言》读书笔记