C语言入门级教程 icesongqiang
2016.11.7
矩阵乘法
矩阵乘法主要就是三个for循环。
注意:
1 很多同学都喜欢先定义变量M,N来表示数组的size,定义数组大小为arr[M][N], 这种方式其实是不可取的。严格的C编译器是会把报错的,这里先这样用。等到后面学到了动态分配,就可以实现用变量来表示数组的大小,然后可以把下面这个代码进行修改。
2 很多同学直接将结果保存到c[][]里的,要记得初始化c[][]={0}
,不然数组c里的值可能是随机数,最后结果会错。
//
// main.c
// C-Programming-014
//
// Created by Steven Lee on 11/2/16.
// Copyright © 2016 Steven Lee. All rights reserved.
//
#include <stdio.h>
int main()
{
long m,p,n,i,j,k;
printf("Please input the number of arrows and lines of matrices A[m][p] and B[p][n], which makes Arrow(A)=Line(B).\n(m,p,n)=");
scanf("%ld%ld%ld",&m,&p,&n);
double A[m][p], B[p][n], C[m][n];
printf("Please input every number of matrix A:\n");
for (i=0; i<m; i++)
for (k=0; k<p; k++)
scanf("%lf",&A[i][k]);
printf("Please input every number of matrix B:\n");
for (k=0; k<p; k++)
for (j=0; j<n; j++)
scanf("%lf",&B[k][j]);
for (i=0; i<m; i++)
for (j=0; j<n; j++)
for (k=0; k<p; k++)
C[i][j]+=A[i][k]*B[k][j];
//注意,这里没有初始化就容易错,因为c[i][j]的初值不一定是0,如果是随机数,答案就不对
printf("The answer is:\n");
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
printf("%lf ",C[i][j]);
printf("\n");
}
return 0;
}
变量作为数组大小
变量作为数组大小的报错,这是在VS2013下的编译情况:
选择排序和冒泡排序
选择排序每次是对于一个位置而言,遍历所有的元素,找到第几大的就放到第几个slot上,而冒泡排序则是每次都是相邻的两个数比较,大的就放后面(或者前面),像冒泡一样。
选择排序
#include<stdio.h>
int main(){
int i, t, a[11], j;
printf("请输入十个整数\n");
for (i=1; i<=10; i++)scanf("%d", &a[i]);
for (i=1; i<10; i++)
for (j=i+1; j<=10; j++)
if(a[i] > a[j]){
t = a[i];
a[i] = a[j];
a[j] = t;
}
printf("排序结果:");
for(i=1; i<=10; i++)printf("%d ", a[i]);
return(0);
}
冒泡排序
#include<stdio.h>
int main(){
int i, j, t, a[11];
printf("请输入十个整数\n");
for(i=1; i<=10; i++)scanf("%d", &a[i]);
for(i=1; i<10; i++)
for(j=1; j<=10-i; j++)
if(a[j]>a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
printf("以下是排序结果:");
for(i=1; i<=10; i++)printf("%d ", a[i]);
return(0);
}
大家注意比较在for(){for(){//这里面是不一样的code;}}
.
插入
这里的插入主要讲二分查找,请用顺序查找的同学下来自己再认真写写二分查找。
//author: zhangjinjian
#include<stdio.h>
int main()
{
const int N = 11; // 定义const常量,可以用来指定数组的大小
int num[N],i,q,p,r,s,t;
num[N-1]=0;
printf("请输入十个数:");
for(i=0;i<=N-2;i++)scanf("%d",&num[i]);
// 选择排序
for(q=0;q<=N-2;q++){
for(i=q+1;i<=N-2;i++){
if(num[i]>num[q]){
p=num[q];
num[q]=num[i];
num[i]=p;
}
}
}
printf("从大到小的排序为:");
for(i=0;i<=N-2;i++)printf("%d ",num[i]);
printf("\n");
printf("输入要查找的数:");
scanf("%d",&p);
for(r=0,q=0,s=N-2;;r++){
i=(q+s)/2;
if(num[0]<p){
printf("不存在\n");
for(t=N-1;t>=1;num[t]=num[t-1],t--);
num[0]=p;break;
}
if(num[N-2]>p){
printf("不存在\n");
num[N-1]=p;break;
}
if(num[i]>p)q=i;
if(num[i]<p)s=i;
if(num[i]==p){printf("存在\n");break;}
if(r==4){
printf("不存在\n");
if(num[i]<p){
for(t=N-1;t>=i+1;num[t]=num[t-1],t--);
num[i]=p;break;}
if(num[i]>p){
for(t=N-1;t>=i+2;num[t]=num[t-1],t--);
num[i+1]=p;break;}
}
}
printf("排序:") ;
for(i=0;i<=(N-1);i++)printf("%d ",num[i]);
return 0;
}