2022/10/26习题

 p指针手动设置为NULL

[]的优先级高于*

()的优先级也高于*

 

 简化后:


杨氏矩阵

//有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
//要求:时间复杂度小于O(N);//不能简单的遍历数组
#include <stdio.h>
//struct Point
//{
//	int x;
//	int y;
//};//可以使用结构体罢了

void find_num_in_young(int arr[3][3], int k, int r, int c)
{
	int i = 0;
	int j = c - 1;
	int flag = 0;
	while (i<=r-1 && j>=0)
	{
		if (arr[i][j] < k)
		{
			i++;
		}
		else if (arr[i][j] > k)
		{
			j--;
		}
		else
		{
			//找到了
			flag = 1;
			printf("找到了,下标是:%d %d\n", i, j);
			break;
		}
	}
	if(flag == 0)
		printf("找不到了\n");
}


void find_num_in_young(int arr[3][3], int k, int *px, int *py)
{
	int i = 0;
	int j = *py - 1;
	int flag = 0;
	while (i <= *px - 1 && j >= 0)
	{
		if (arr[i][j] < k)
		{
			i++;
		}
		else if (arr[i][j] > k)
		{
			j--;
		}
		else
		{
			//找到了
			flag = 1;
			*px = i;
			*py = j;
			break;
		}
	}
	if (flag == 0)
	{
		*px = -1;
		*py = -1;
	}
}


int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int k = 0;
	scanf("%d", &k);//输入要查找的数字
	//遍历数组
	int x = 3;
	int y = 3;
	//返回型参数
	find_num_in_young(arr, k, &x, &y);
	if (x == -1 && y == -1)
		printf("找不到\n");
	else
		printf("找到了,下标是:%d %d\n", x, y);

	return 0;
}

字符串旋转

多种想法:

左旋k个字符,k次左旋1个字符

#include <string.h>

void left_move(char arr[], int k)
{
	//每一次只旋转一个字符,把这个动作执行K次
	int i = 0;
	int len = strlen(arr);
	k %= len;
	for (i = 0; i < k; i++)
	{
		//1
		char tmp = arr[0];
		//2 把后边的字符全部往前挪动一个位置
		int j = 0;
		for (j = 0; j < len - 1; j++)
		{
			arr[j] = arr[j + 1];
		}
		//3 
		arr[len - 1] = tmp;
	}
}

分别逆序两组,最后再整体逆序

abcdefghi
baihgfedc
cdefghiab
#include <assert.h>
#include<string.h>
void reverse(char*left, char*right)
{
	assert(left && right);
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

void left_move(char arr[], int k)
{
	//每一次只旋转一个字符,把这个动作执行K次
	int i = 0;
	int len = strlen(arr);
	k %= len;
	reverse(arr, arr+k-1);
	reverse(arr+k, arr + len - 1);
	reverse(arr, arr + len - 1);
}


int main()
{
	char arr[] = "abcdefghi";
	int k = 0;
	scanf("%d", &k);
	
	left_move(arr, k);
	
	printf("%s\n", arr);

	return 0;
}

写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

枚举法:

#include<string.h>
#include<stdio.h>
//写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
int is_left_move(char arr1[], char arr2[])
{
	int len = strlen(arr1);
	int i = 0;
	for (i = 0; i < len; i++)
	{
		char tmp = arr1[0];
		int j = 0;
		for (j = 0; j < len - 1; j++)
		{
			arr1[j] = arr1[j + 1];
		}
		arr1[len - 1] = tmp;
		if (strcmp(arr1, arr2) == 0)
		{
			return 1;
		}
	}

	return 0;
}

int main()
{
	char arr1[] = "ABCDEF";
	char arr2[] = "CDEFAb";
	int ret = is_left_move(arr1, arr2);//判断arr2是否是arr1旋转得到的
	if (1 == ret)
		printf("Yes\n");
	else
		printf("No\n");

	return 0;
}
 

不枚举:

采用追加 寻找的方法

(自己给自己追加最好用的是strncat这个函数 还要保证字符数组的空间足够大 不越界)

#include<string.h>
int is_left_move(char arr1[], char arr2[])
{
	int len1 = strlen(arr1);
	int len2 = strlen(arr2);
	if (len1 != len2)
		return 0;

	strncat(arr1, arr1, len1);
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
		return 0;
	else
		return 1;
}

//ABCDEF
//ABCDEFABCDEF
int main()
{
	char arr1[20] = "ABCDEF";
	char arr2[] = "CDEF";
	int ret = is_left_move(arr1, arr2);//判断arr2是否是arr1旋转得到的
	if (1 == ret)
		printf("Yes\n");
	else
		printf("No\n");

	return 0;
}


int main()
{
	int(*(*F)(int, int));

	return 0;
}


空心正方形的打印(这道题中要学也会while()特有的循环方式   循环输出) 

用或的方式避免找规律的麻烦

#include <stdio.h>

int main()
{
    int n = 0;
    while (scanf("%d", &n) == 1)
    {
        int i = 0;
        int j = 0;
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                if (i == 0 || i == n - 1 || j == 0 || j == n - 1)
                    printf("* ");
                else
                    printf("  ");
            }
            printf("\n");
        }
    }
    return 0;
}

有序数列中插入一个数

思路:从后往前作比较,寻找合适的位置插入,注意数组中应该多出来一个空着的位置用来移动以及存放新的插入的元素

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int arr[n + 1];//变长数组-c99
    int i = 0;
    //输入n个数字
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    int k = 0;
    scanf("%d", &k);
    //插入
    int j = n - 1;
    for (; j >= 0; j--)
    {
        if (arr[j] > k)
        {
            arr[j + 1] = arr[j];
        }
        else
        {
            break;
        }
    }
    arr[j + 1] = k;
    for (j = 0; j < n + 1; j++)
    {
        printf("%d ", arr[j]);
    }

    return 0;
}

char*的地址为char**  首元素的地址(二级指针) 

三角形的判断:

(注意scanf 输入几个值就要返回几 故三角形的应该是返回3)

#include <stdio.h>

int main()
{
    int a = 0;
    int b = 0;
    int c = 0;
    while (scanf("%d %d %d", &a, &b, &c) == 3)
    {
        if (a + b > c && a + c > b && b + c > a)
        {
            //三角形
            if (a == b && b == c)
            {
                printf("Equilateral triangle!\n");
            }
            else if ((a == b && b != c) || (a == c && a != b) || (b == c && b != a))
            {
                printf("Isosceles triangle!\n");
            }
            else
            {
                printf("Ordinary triangle!\n");
            }
        }
        else
        {
            printf("Not a triangle!\n");
        }
    }
    return 0;
}

竞选问题:

 (注意看getchar的运用)

#include <stdio.h>

/*
int main()
{
    int ch = 0;
    int countA = 0;
    int countB = 0;

    while((ch=getchar()) != '0')
    {
        if(ch == 'A')
            countA++;
        else if(ch == 'B')
            countB++;
    }
    if(countA>countB)
        printf("A\n");
    else if(countA<countB)
        printf("B\n");
    else
        printf("E\n");

    return 0;
}
*/

int main()
{
    int ch = 0;
    int count = 0;
    //A ++
    //B --
    while ((ch = getchar()) != '0')
    {
        if (ch == 'A')
            count++;
        else if (ch == 'B')
            count--;
    }
    if (count > 0)
        printf("A\n");
    else if (count < 0)
        printf("B\n");
    else
        printf("E\n");

    return 0;
}

考试求平均数及去掉最大值最小值问题

(while中利用scanf的写法)

(在写题时用求和的方法的妙处)

(看保留小数位数的写法)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
/*
int main() {
    int arr[7] = {0};
    while (scanf("%d %d %d %d %d %d %d", &arr[0], &arr[1], &arr[2], &arr[3],
                 &arr[4], &arr[5], &arr[6]) == 7)
    {
        int i = 0;
        int max = 0;
        int min = 100;
        int sum = 0;
        for(i=0; i<7; i++)
        {
            if(arr[i]>max)
                max = arr[i];
            if(arr[i]<min)
                min = arr[i];

            sum += arr[i];
        }
        printf("%.2lf\n", (sum-max-min)/5.0);

    }
        return 0;
}*/

int main() {
    int num = 0;
    int max = 0;
    int min = 100;
    int sum = 0;
    int n = 0;
    while (scanf("%d", &num) == 1) {
        if (num > max)
            max = num;
        if (num < min)
            min = num;
        sum += num;
        n++;
        if (n == 7)
        {
            printf("%.2lf\n", (sum - max - min) / 5.0);
            max = 0;
            min = 100;
            sum = 0;
            n = 0;
        }
    }
    return 0;
}

补充:scanf的返回值

%d返回1   %d,%d返回2

不读取的情况:

 

 鼠标右键转到定义

 关于scanf的写法:

打印出一一对应的关系

#include <stdio.h>

int main() {
    int Status = 0;
    while (scanf("%d", &Status) == 1) { // 注意 while 处理多个 case
        switch (Status) {
        case 200:
            printf("OK\n");
            break;
        case 202:
            printf("Accepted\n");
            break;
        case 400:
            printf("Bad Request\n");
            break;
        case 403:
            printf("Forbidden\n");
            break;
        case 404:
            printf("Not Found\n");
            break;
        case 500:
            printf("Internal Server Error\n");
            break;
        case 502:
            printf("Bad Gateway\n");
            break;
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值