C语言入门级教程四

 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值