c语言第六章2.0

题3,求一个3*3矩阵对角线之和

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
    int str[3][3];
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            str[i][j] = rand();//生成随机数
            printf("%d\t", str[i][j]);
        }
        printf("\n");
    }
    int sum=0;
    for (int i = 0; i < 3; i++) {
        sum = sum + str[i][i];//对角线下标相同
    }
    printf("%d ", sum);

    return 0;
}

题4,有一个已经排好序的数组,要求输入一个数后,把他按原来规律插入原数组

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>//仅限从小到大排序,从大到小条件反过来就可以了
#include<stdlib.h>
int main() {
    int str[100];
    int temp;
    for (int i = 0; i < 10; i++) {
        str[i] = rand();
    }

    //冒泡排序
    for (int i = 0; i < 9; i++) {//管从头到尾排几趟的
        for (int j = 0; j < 9 - i; j++) {
            if (str[j] > str[j + 1]) {//自己跟自己的下一个比
                temp = str[j];
                str[j] = str[j + 1];
                str[j + 1] = temp;
            }
        }
    }//已经排好序了
    int a;
    scanf("%d", &a);
    int index=0;
    for (int i = 0; i < 10; i++) {
        if (a > str[i]) {
            index = i;//保存插入位置的下标
        }
    }
    for (int i = 9; i > index; i--) {//从最后开始到这个下标的所有数依次后移
        str[i + 1] = str[i];
    }
    str[index] = a;//把输入的数插入
    for (int i = 0; i < 11; i++) {//多了一个数,条件加一
        printf("%d ", str[i]);
    }
        return 0;
}

题5,将数组中的值逆序存放


思想:建两个数组,尾给头;想随机输入数组数量,但不太会

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
    int str1[20],str2[20];
    str1[0] = 0;
    int i=0;
    int j = 0;
    for ( i = 0; i<10; i++) {
        str1[i] = rand();//输入十个数
    }
    for ( i = 9; i >= 0; i--,j++) {
        str2[j] = str1[i];//将1尾给2头
    }
    for (i = 0; i < 10; i++) {
        printf("%d ", str1[i]);//输出原数组
    }
    printf("\n");
    for (i = 0; i < 10; i++) {

        printf("%d ", str2[i]);//输出转换后的数组
    }
    return 0;
}

题8找出二维数组中的鞍点(边界条件过不了,如果同行或同列有相同的数就不对了)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
    int str[3][4];
    int i, j;
    int flag = 0;
    for ( i = 0; i < 3; i++) {
        for ( j = 0; j < 4; j++) {
            scanf("%d", &str[i][j]);
            //str[i][j] = rand();
        }
    }
    printf("\n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            printf("%d ", str[i][j]);
        }
        printf("\n");
    }

    int max;
    int max_index=0;
    int min;
    int min_index=0;
    int k;
    for (i = 0; i < 3; i++) {
        max = str[i][0];
        for (j = 0; j < 4; j++) {
            if (str[i][j] > max) {
                max_index = j;
                max = str[i][j];
            }
        }
        min = str[0][max_index];
        for (k = 0; k < 3; k++) {
            if (str[k][max_index] < min) {
                min_index = k;
                min = str[k][max_index];
            }
        }
        if (max == min) {
            flag = 1;
            printf("行:%d,列:%d,值:%d",min_index, max_index, str[min_index][max_index]);
        }
    }
    if (flag == 0) {
        printf("无鞍点");
    }
    return 0;
}


题15,在15个数中折半查找


折半查找(二分法排序):low mid high key,key和mid比较,key大了low =mid+1,key小了high=mid-1;直到low和high交错停止

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>//一定要先知道顺序,是从大到小还是从小到大,会涉及到后边查找下标的移动
int main() {
    int str[15];
    int temp;//中间变量
    for (int i = 0; i < 15; i++) {
        scanf("%d", &str[i]);//输入15个数
    }
    for (int i = 0; i < 14; i++) {//冒泡排序
        for (int j = 0; j < 14 - i; j++) {
            if (str[j] > str[j + 1]) {
                temp = str[j];
                str[j] = str[j + 1];
                str[j + 1] = temp;
            }
        }
    }
    for (int i = 0; i < 15; i++) {
        printf("%d ", str[i]);//从小到大输出
    }
    printf("\n");
    int low = 0, high = 14;//最低和最高
    int mid;//中间
    int key;//要查找的数
    int flag = 0;//标记位
    scanf("%d", &key);
    while (low <= high) {
        mid = (low + high) / 2;
        if (key == str[mid]) {
            printf("是第%d个元素值为%d", mid,str[mid]);
            flag = 1;
            break;//找到了要跳出循环啊
        }
        else if (key > str[mid]) {
            low = mid + 1;
        }
        else {
            high = mid -1;
        }
    }
    if (flag == 0) {
        printf("无此值");
    }
    return 0;
}

有三行文字每行20个字符,要求分别统计出其中英文大写字母,小写字母,数字,空格以及其他字符的个数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<ctype.h>//函数们的头文件
int main() {
    char str[3][20];//就是要用二维数组
    int Balpha, Salpha, digit, space, other;
    
        //Balpha = 0, Salpha = 0, digit = 0, space = 0, other = 0;
        for(int i = 0; i < 3; i++) {
            fgets(str[i], 20, stdin);//天杀的就是用二维数组,但是输入的是str[i],不是这两个都输入
        }
            
        for (int i = 0; i < 3; i++) {
            Balpha = 0, Salpha = 0, digit = 0, space = 0, other = 0;//因为要统计每一行结果所以每次记得要归零
            for(int j=0;str[i][j]!='\n';j++){//必须是以换行结尾,不是\0
            if (isalpha(str[i][j])) {//是字母
                if (islower(str[i][j])) {//是小写字母//扩展tolower转小写,返回的是ASCII码
                    Salpha++;
                }                
                        else if (isupper(str[i][j])) {//是大写字母//扩展toupper转大写,返回的是ASCII码
                            Balpha++;
                        }                        
                    }
                    else if (isdigit(str[i][j])) {//是数字,函数必须以这个格式写否则数不对
                        digit++;
                    }
                    else if (isspace(str[i][j])) {//是空格
                        space++;
                    }
                    else {
                        other++;
                    }
                }
                printf("大写字母为:%d个\n", Balpha);
                printf("小写字母为:%d个\n", Salpha);
                printf("数字为:%d个\n", digit);
                printf("空格为:%d个\n", space);
                printf("其他字符为:%d个\n", other);
                printf("\n");
        }    
        return 0;
}


 mmmNNN   ...888  (3,3,3,3)
HHHgff == = '''(3,3,3,3)
Jm / 9             (1,1,1,)
复制粘贴小tips:要想不从第一个字开始选中及下行,可以按住alt在往下拉,这样可以从中间劈一半选中

译原码,一行电文已加密,加密规则为第1字母变成第26字母,第i变成第(26-i+1),非字母字符不变,要求变回原码,并输出密码和原码,


只能数组吧,我不会啊啊啊啊,自己做不出来,借鉴的别人的代码,愚蠢,找不明白规律

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
    int main()
    {
        char c[100]="";
        int i = 0, j, x;
        printf("请输入一行电文\n");
        while ((c[i] = getchar()) != '\n')
            i++;
        printf("%s", c);
        x = strlen(c);
        for (i = 0; i < x; i++)
        {
            if (c[i] >= 'A' && c[i] <= 'Z')
            {
                
                c[i] = 'Z' - (c[i] - 'A');//我不会找规律啊啊啊啊
            }
            else if (c[i] >= 'a' && c[i] <= 'z')
            {
                c[i] = 'z' - (c[i] - 'a');
                
            }
        }
        printf("%s", c);
        return 0;
    }

将两个字符串连接起来

怎么在不知道循环次数的前提下输入一个数组呢?)(用%s输入就可以了)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
    char a[30] = "";//初始化嗷都
    char b[10] = "";
    fgets(a, 10, stdin);//换行输入,不能搭配strcat,会多一个换行
    fgets(b, 10, stdin);//用这个输入,求strlen要减一
    //scanf("%s", a);//可空格可换行,搭配strcat刚刚好,但实现不了自己拼接两个数组
    //scanf("%s", b);//用这个输入,求strlen不要减一

    int len1 = strlen(a)-1;
    int len2 = strlen(b)-1;
    char c[20]="";
    for (int i = 0; i < len1; i++) {
        c[i] = a[i];
    }
    for (int i = len1; i < len2+len1; i++) {
        c[i] = b[i-len1];
    }

    for (int i = 0; i < len1+len2; i++) {
        printf("%c", c[i]);
    }
    
    /*strcat(a, b);
    printf("%s", a);*/
    /*for (int i = 0; i < len1 + len2; i++) {
        printf("%c", a[i]);
    }*/

    
    return 0;
}

比较两个字符串

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main() {
    char a[10] = "";
    char b[10] = "";
    scanf("%s", a);
    scanf("%s", b);
    int len1 = strlen(a);
    int len2 = strlen(b);
    int max;
    max = len1 >= len2 ? len1:len2;//这个形式写简单
    int flag = 0;
    for (int i = 0; i < max; i++) {
        if (a[i] > b[i]) {//一次性直接比完
            flag = 1;
            break;
        }
        else if (a[i] < b[i]) {
            flag = 2;
            break;
        }
    }
    if (flag == 1) {
        printf("%s", a);
    }
    else {
        printf("%s", b);
    }
    //if (strcmp(a, b) > 0) {//函数形式
    //    printf("%s", a);
    //}
    //else {
    //    printf("%s", b);
    //}
    /*AbC
        aBC*/
    return 0;
}

复制字符串

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main() {
    char a[10] = "";
    char b[10] = "";
    scanf("%s", a);
    scanf("%s", b);
    int len1 = strlen(a);
    int len2 = strlen(b);
    int i;
   //for (i = 0; i < len1; i++) {//为了不使数据重叠这个用了一个将a数组清空,其实不主流,正确的做法是加终止符
    //    a[i] = 0;//根本没必要,因为下面长度已经限定了
    //}
    for (i = 0; i < len2; i++) {
        a[i] = b[i];
    }
    a[i] = '\0';
    printf("%s", a);
    //for (i = 0; i < len2; i++) {//根本不用再加\0了,因为初始化都带上了
    //    printf("%c",a[i]);
    //}
    
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值