C语言学习记录—作业9

1. 调整奇数偶数顺序

调整数组使奇数全部都位于偶数前面。
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

思路:设置left和right指针。left从左开始找偶数(即遇到奇数就跳过);right从又开始找奇数(即遇到偶数就跳过)。将left找到的偶数和right找到的奇数交换。

void move_odd_even(int arr[], int sz)
{
	int left = 0;
	int right = sz - 1;
	//left找偶数,right找奇数

	while (left < right)
	{
		//从左往右找一个偶数,停下来。(遇到奇数就++)
		//等效于left%2,因为模2等于1就为真,真就进入
		while ((left < right) && arr[left] % 2 == 1)//假设全是奇数,left找不到偶数,一直++,那么left可能越界。所以要限制范围
		{
			left++;
		}
		//从右往左找一个奇数,停下来(遇到偶数就--)
		while ((left < right) && arr[right] % 2 == 0)
		{
			right--;
		}
		//交换奇数和偶数
		if (left < right)
		{
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
			//交换完以后,让指针继续移动,回到上面判断下一个元素是奇数还是偶数。
			left++;
			right--;
		}
	}
}
int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	//输入
	for (i = 0; i < sz; i++)
	{
		//scanf("%d", &arr[i]);//两种方式都可以
		scanf("%d", arr + i);//arr是数组名,加i就是下标为i的元素的地址
	}

	//调整
	//方法一思路:第一次遍历找奇数,第二次遍历找偶数,第三次遍历拷贝进原数组。

	//方法二思路:
	//设置两个指针,left指针从最左开始找,right指针从最右边开始找。
	//当left指针找到偶数,并且right指针找到奇数时交换,
	//left要小于right指针,否则当right移动到left左边时,可能把位置正确的奇数和偶数交换
	move_odd_even(arr, sz);

	//输出
	for (i = 0; i < sz; i++)//调整完之后还是打印这个数组
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

2. 输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

输入描述:
输入包含三行,
第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。
输出描述:输出为一行,输出长度为n + m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
 

int main() {
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int arr1[n];
	int arr2[m];
	int i = 0;
	for (i = 0; i < n; i++) {
		scanf("%d", &arr1[i]);
	}
	for (i = 0; i < m; i++) {
		scanf("%d", &arr2[i]);
	}

	// 思路:
    // 假设第一个数组的下标为j,第二个数组的下标为k。
    // 用arr1[j]和arr2[k]比较,谁小打印谁,打印以后该数组下标+1,依次类推


	int j = 0;//arr1
	int k = 0;//arr2

	while (j < n && k < m) {
		if (arr1[j] < arr2[k]) {
			printf("%d ", arr1[j]);
			j++;
		}
		else {
			printf("%d ", arr2[k]);
			k++;
		}
	}
	// 上方循环不满足,意味着有一个数组已经遍历完了
	// 所以需要判断还有哪个数组有剩余元素,然后打印
	if (j < n) //这里说明arr1数组还有没遍历完
	{
		for (; j < n; j++) {
			printf("%d ", arr1[j]);
		}
	}
	else {
		for (; k < m; k++) {
			printf("%d ", arr2[k]);
		}
	}
	return 0;
}

//合并版本
int main() {
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr1[n];
    int arr2[m];
    int arr3[m + n];
    int i = 0;
    for (i = 0; i < n; i++) {
        scanf("%d", &arr1[i]);
    }
    for (i = 0; i < m; i++) {
        scanf("%d", &arr2[i]);
    }

    // 思路:
    // 假设第一个数组的下标为j,第二个数组的下标为k。创建第三个数组放置前两个数组的元素
    // 用arr1[j]和arr2[k]比较,谁小先放进第三个数组,之后该数组下标+1,依次类推

    int j = 0;//arr1
    int k = 0;//arr2
    int r = 0;//arr3
    while (j < n && k < m) {
        if (arr1[j] < arr2[k]) {
            arr3[r++] = arr1[j];
            j++;
        }
        else {
            arr3[r++] = arr2[k];
            k++;
        }
    }
    // 上方循环不满足,意味着有一个数组已经遍历完了
    // 所以需要判断还有哪个数组有剩余元素,然后打印
    if (j < n) { //这里说明arr1数组还有没遍历完
        for (; j < n; j++) {
            arr3[r++] = arr1[j];
        }
    }
    else {
        for (; k < m; k++) {
            arr3[r++] = arr2[k];
        }
    }
    // 打印
    for (i = 0; i < m + n; i++) {
        printf("%d ", arr3[i]);
    }
    return 0;
}

3. 把一个数的每一位的奇数变成1,偶数变成0

示例1:        输入:222222        输出:0
示例2:        输入:123              输出:101

#include <math.h>
//思路:
//通过%10 得到最后一位
//通过/10 去掉最后一位
//再用每一位%2,确定结果是0或1
//每一位的0或1需要权重,假设结果是101,那么最高位的1就是1*10^2,依次类推,把所有结果加起来
int main() {
    int input = 0;
    scanf("%d", &input);

    int sum = 0;
    int i = 0;
    while (input) {

        int bit = input % 10; //获取最后一位

        // if (bit % 2 == 1) {
        //     sum += 1 * pow(10, i);
        //     i++;
        // } else {
        //     sum += 0 * pow(10, i);
        //     i++;
        // }

        // 简化
        if (bit % 2 == 1) {
            bit = 1;
        }
        else {
            bit = 0;
        }
        sum += bit * pow(10, i++);

        input /= 10; //剥离最后一位
    }
    printf("%d\n", sum);
    return 0;
}

4. 打印直角三角形

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“* ”组成的带空格直角三角形图案。
输入描述:多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“ * ”的数量,也表示输出行数。
输出描述:针对每行输入,输出用“ * ”组成的对应长度的直角三角形,每个“ * ”后面有一个空格。
输入:5
输出:
        * 
      * * 
    * * * 
  * * * * 
* * * * * 

//思路:
// 0 1 2 3 4
//0        *
//1      * *
//2    * * *
//3  * * * *
//4* * * * *
//行和列加起来小于4打印空格,大于等于4打印*空格
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 + j < n - 1) {
                    printf("  ");
                }
                else {
                    printf("* ");
                }
            }
            printf("\n");
        }
    }
    return 0;
}

5. 计算打折后的价格

KiKi非常喜欢网购,在一家店铺他看中了一件衣服,他了解到,如果今天是“双11”(11月11日)则这件衣服打7折,“双12” (12月12日)则这件衣服打8折,如果有优惠券可以额外减50元(优惠券只能在双11或双12使用),求KiKi最终所花的钱数。
输入描述:一行,四个数字,第一个数表示小明看中的衣服价格,第二和第三个整数分别表示当天的月份、当天的日期、第四个整数表示是否有优惠券(有优惠券用1表示,无优惠券用0表示)。
注:输入日期保证只有“双11”和“双12”。
输出描述:一行,小明实际花的钱数(保留两位小数)。(提示:不要指望商家倒找你钱)

int main() {
	double price = 0.0;
	int month = 0;
	int day = 0;
	int discount = 0;

	scanf("%lf %d %d %d", &price, &month, &day, &discount);
	//计算
	if (month == 11)
	{
		price = price * 0.7 - discount * 50;
	}
	else if (month == 12)
	{
		price = price * 0.8 - discount * 50;
	}
	
	//输出
	if (price < 0)
	{
		printf("%.2lf", 0);
	}
	else 
	{
		printf("%.2lf", price);
	}

	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是几个C语言期末大作业项目的介绍: 1. C语言点餐系统 这个项目是一个简单的点餐系统,用户可以通过控制台界面选择菜品并下单。该系统可以实现菜单的展示、菜品的选择、订单的生成等功能。 2. C语言货物管理系统 这个项目是一个简单的货物管理系统,用于管理货物的入库、出库和库存等信息。该系统可以实现货物信息的录入、查询、修改和删除等功能。 3. C语言歌曲信息管理系统 这个项目是一个简单的歌曲信息管理系统,用于管理歌曲的基本信息,如歌曲名称、歌手、专辑等。该系统可以实现歌曲信息的录入、查询、修改和删除等功能。 4. C语言职工信息管理系统 这个项目是一个简单的职工信息管理系统,用于管理公司职工的基本信息,如姓名、年龄、性别等。该系统可以实现职工信息的录入、查询、修改和删除等功能。 5. C语言学生打卡系统 这个项目是一个简单的学生打卡系统,用于记录学生的考勤情况。该系统可以实现学生的签到、签退、请假等功能,并可以生成考勤报表。 6. C语言小学生计算机辅助教学系统 这个项目是一个简单的小学生计算机辅助教学系统,用于帮助小学生学习基础的计算题。该系统可以生成随机的计算题目,并根据学生的答案给出评分和反馈。 7. C语言门禁系统 这个项目是一个简单的门禁系统,用于控制进出门禁区域的人员。该系统可以实现人员的注册、刷卡进出、权限管理等功能。 8. C语言银行管理系统(文件操作) 这个项目是一个简单的银行管理系统,用于管理银行的客户信息和账户信息。该系统可以实现客户信息和账户信息的录入、查询、修改和删除等功能,并可以进行基本的存取款操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值