首页 > 代码库 > 《明解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 }
- 条件运算符,是一个三目运算符。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语言》读书笔记
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。