0612,概述,输入输出

代码1——命名&样式

#include <stdio.h>

#define SCALE_FACTOR 5.0f / 9.0f
#define FREZZING_PT 32.0f

int main(void) {
	
	float fahrenheit , celsius;
	printf("Enter Fahrenheit temperature :");
	scanf_s("%f", &fahrenheit);
	
	celsius = (fahrenheit - FREZZING_PT) * SCALE_FACTOR;  //魔法数字

	printf("Celsius equivalent : %.1f\n",celsius);
	return 0;
}


/*
华氏温度转摄氏温度。程序提示用户输入一个华氏温度,然后输出一个对应的摄氏温
度。公式:Enter Fahrenheit temperature : 212Celsius equivalent : 100.0
*/

//BEFORE

//int main(void) {
//
//	int f_tem; double c_tem;
//
//	printf("Enter Fahrenheit temperature :");
//	scanf_s("%d", &f_tem);
//	c_tem = (f_tem - 32.0) * 5.0 / 9.0;
//	printf("Celsius equivalent : %.1f", c_tem);
//
//	return 0;
//}

 

题目1

  1. 从源代码生成可执行程序包含哪几个步骤,请用自己的话描述每个步骤的作用。
    1. 源代码--预处理--编译--汇编--链接--可执行文件
    2. 预处理:进行文本替换,生成.I的预处理文件
    3. 编译:编译器进行编译,生成汇编代码
    4. 汇编:汇编器将汇编代码转换成机器代码/目标文件
    5. 链接:连接器将各个.c.h文件生成的机器代码链接起来,生成可执行文件
  2. 预处理阶段会执行预处理指令,我们讲过哪几种预处理指令?
    1. #inlcude 头文件引用
    2. #define 宏定义
    3. #define 带参数的宏(宏函数)
  3. 什么是进程?进程的虚拟内存空间包含哪几部分?
    1. 运行中的程序,是一个动态的过程
    2. 包括:内核KERNAL,栈STACK,堆HEAP,数据段DATA,代码段NODE
答案:

已经讲过的预处理指令包括#include#define#include用于包含头文件,#define用于定义宏。

进程是一个程序的运行实例,具有独立的内存空间。进程的虚拟内存空间通常包含:代码段(存放程序代码)、数据段(存放全局和静态变量)、堆区(动态分配内存)、栈段(存放局部变量和函数调用信息)和内核区域等

题目2 

(a) double ans = 10.0 + 2.0 / 3.0 − 2.0 ∗ 2.0;请在适当的位置插入(),使得 ans = 11.0.

答案:

ans = 10.0 + 2.0 / ((3.0 - 2.0) * 2.0);

(b) double ans = 18.0 / SQUARED(2 + 1); 如果宏函数定义如下,请写出对应 ans 的值。

#define SQUARED(x) x*x
#define SQUARED(x) (x*x)
#define SQUARED(x) (x)*(x)
#define SQUARED(x) ((x)*(x))

//x*x  输出12.0
printf("%.1f\n", 18.0 / 2+1*2+1);
//(x*x)  输出3.6
printf("%.1f\n", 18.0 / (2+1*2+1));  
//(x)*(x)  输出18.0
printf("%.1f\n", 18.0 / (2+1)*(2+1));  
//((x)*(x))  输出2.0
printf("%.1f\n", 18.0 / ((2 + 1) * (2 + 1))); 

(c) 请解释下面代码为什么错了,并改正它。

1) #include <stdio.h>;
2) int function(void arg1){        
       return arg1-1;   
   }
3) #define MESSAGE = "Happy new year!"  

    1) #include <stdio.h>

头文件不是函数语句,不加分号
    2) int function(int arg1) {
        return arg1 - 1;
    }

不知道,直觉告诉我不是VOID(函数)
    3) #define MESSAGE "Happy new year!" 

宏定义的格式 

答案:
  1. 形参列表"(int arg1)" void表示空类型,没有值,它不能用在形参的类型上
  2. 宏定义是不用加"="的,否则等号也会成为字符常量的一部分

题目3

(a) printf 的作用是什么?

输出格式串中的内容,并将表达式的值进行转换说明

(b) printf 函数的格式串中可以包含普通字符和转换说明,printf对这两者的处理有何不同?转换说明的作用是什么?

普通字符——输出;转换说明——占位符,替换表达式的值,再

(c) scanf的作用是什么?

将字符进行类型转换,转换成数据类型(int double float……)写入程序中

(d) scanf 函数的格式串中可以包含普通字符、空白字符和转换说明,scanf对这三者的处理有何不同?

从左至右依次精准匹配,如果匹配成功,则继续匹配,如果匹配失败,则返回停止匹配
普通字符——精准匹配;空白字符——匹配任意数量空白字符,包括0个;转换说明——忽略前置的空白字符,匹配,%d匹配十进制整数,%f匹配浮点数

答案

printf 函数是C语言中的一个标准输出函数,用于将格式化的数据输出到标准输出设备,通常是屏幕。它可以输出各种类型的数据,如整数、浮点数、字符、字符串等,并且可以按照用户定义的格式来输出数据。


普通字符: 在printf的格式字符串中,普通字符(不包括 '%')会被原样输出到目标设备。

转换说明: 转换说明是以 '%' 开始的,指示printf如何取得相应的变量,并将其格式化后输出。转换说明决定了如何解释相应的变量(例如作为整数、浮点数、字符等),以及如何格式化(例如宽度、精度、填充字符等)。

scanf 函数是C语言中的一个标准输入函数,用于从标准输入设备读取格式化输入,通常是键盘。它可以读取不同类型的输入数据,并根据格式字符串指定的方式,将读入的数据存储到程序指定的变量中。

普通字符: 对于scanf,格式字符串中的普通字符(不包括空白字符和'%')必须与输入流中的字符严格匹配才能继续执行,否则输入过程中断。 空白字符: 在scanf格式串中,空白字符(如空格、制表符和换行符)可以匹配输入中的任意数量的空白字符。 转换说明: 类似于printf,转换说明告诉scanf如何读取输入并将其转换为相应类型的数据。转换说明还包括如何处理输入字段的宽度、读取特定类型的数据等信息。

(e) 写一个程序,实现分数相加。用户以分子/分母的形式输入分数,程序打印相加后的结果(化为最简分数)。如:

输入:
Enter first fraction: 5/6     
Enter second fraction: 3/4
输出:
The sum is 19/12

(注:利用欧几里得算法求最大公约数,进行分数简化)

代码2——作业(强解)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>

int main(void) {
	int num1, denom1;
	printf("Enter first fraction");
	scanf_s("%d/%d", &num1, &denom1);

	int num2, denom2;
	printf("Enter second fraction");
	scanf_s("%d/%d", &num2, &denom2);

	int after_denom = denom1 * denom2;
	int after_num = num1 * denom2 + denom1 * num2;

	//printf("The sum is %d/%d\n",after_num,after_denom);



	//将结果化为最简分数,如果分母为1,输出整数
	int after_count;
	if (after_num % after_denom == 0) {
		after_count = after_num / after_denom;
		printf("The sum is %d", after_count);
	}
	else {
		int i;
		int min = after_num > after_denom ? after_denom : after_num;
		for (i = 2; i <=sqrt (min)&&min>=i; i++) {
			if ( after_num%i==0&&after_denom%i==0) {
				after_num /= i;
				after_denom /= i;
				min /= i;
				--i;
			}
		}
		printf("The sum is %d/%d\n", after_num, after_denom);
	}
	
	return 0;
}

代码3——答案(欧几里得) 

答案:

辗转相除法求最大公因数,当余数为0的时候,最后的除数就是最大公因数

* 递归求解欧几里得算法
* 递归的出口: b=0时,a的值就是最大公约数
* 递归体:只要b不是0,把b赋值成a,把a%b赋值给b,再次调用函数自身

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 利用欧几里得算法求a和b的最大公约数
int gcd(int a, int b) {
	// 首先确保a>=b
	if (a < b) {
		int tmp = a;
		a = b;
		b = tmp;
	}
	// 当b不为0时,计算a除以b的余数r,将b的值赋给a,r的值赋给b
	while (b != 0) {
		int r = a % b;
		a = b;
		b = r;
	}

	return a;
}

/*
* 递归求解欧几里得算法
* 递归的出口: b=0时,a的值就是最大公约数
* 递归体:只要b不是0,把b赋值成a,把a%b赋值给b,再次调用函数自身
*/
int gcd_recursion(int a, int b) {
	// 递归的出口
	if (b == 0) {
		return a;
	}
	// 递归体
	return gcd_recursion(b, a % b);
}

int main(void) {
	int num1, denom1;	// 第一个分子分母
	int num2, denom2;	// 第二个分子分母

	printf("请输入第一个分数(分子/分母): ");
	scanf("%d/%d", &num1, &denom1);
	printf("请输入第二个分数(分子/分母): ");
	scanf("%d/%d", &num2, &denom2);

	int result_num = num1 * denom2 + num2 * denom1;
	int result_denom = denom1 * denom2;

	// 欧几里得算法求最大公约数
	int result_gcd = gcd(result_num, result_denom);

	// 下面进行结果分数的化简,特殊情况是最大公约数等于结果分母,此时分数可以化简成一个整数
	if (result_gcd == result_denom) {
		printf("两个分数的和是一个整数,即:%d\n", (result_num / result_denom));
	}
	else {
		// 结果是一个分数
		printf("两个分数的和是一个分数,即:%d/%d\n", (result_num / result_gcd), (result_denom / result_gcd));
	}

	return 0;
}

题目4

利用优先级规则,计算下面表达式的值,并确定各个变量的值(不运行代码)。添加括号,显示表示优先级关系。

(a) 假设(x = 0xFF33, MASK = 0xFF00).表达式: c = x & MASK ==0;

x  1111 1111 0011 0011
y  1111 1111 0000 0000
————————————————————————
&  1111 1111 0000 0000

(c = (x & MASK)) == 0 ——(c=0xFF00)==0  ——  0xFF00)==0—— 0

(b) 假设(x = 10, y = 2, z = 2;).表达式: z = y = x++ + ++y ∗ 2;

z = (y = ((x++) + ((++y) ∗ 2)))——z = y = (10) + (3) ∗ 2 ——z = y = 10+6——z = y = 16——z=16

(c) 假设(x = 10, y=4, z=1;).表达式: y >>= x & 0x2 && z;

(y >> = (x & 0x2)) && z——(y >> = 2) && z

答案:

(a)

c = (x & (MASK == 0));

x = 0xFF33, MASK = 0xFF00, c = 0 

(b)

z = (y = ((x++) + ((++y) * 2)))

x = 11, y = 16, z = 16

(c)

y >>= ((x & 0x2) && z)
    
x = 10, y = 2, z = 1

相关推荐

  1. 【笔试】输入输出处理

    2024-06-14 00:56:03       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-14 00:56:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-14 00:56:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-14 00:56:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-14 00:56:03       18 阅读

热门阅读

  1. MySQL CHECK约束

    2024-06-14 00:56:03       7 阅读
  2. Android基础-运行时权限

    2024-06-14 00:56:03       4 阅读
  3. 013-Linux交换分区管理

    2024-06-14 00:56:03       6 阅读
  4. ios CCDelete.m

    2024-06-14 00:56:03       5 阅读
  5. 项目经验:别啥事都跟甲方讲

    2024-06-14 00:56:03       5 阅读
  6. 【设计模式之享元模式 -- C++】

    2024-06-14 00:56:03       6 阅读
  7. 文件已经删除但磁盘空间未释放

    2024-06-14 00:56:03       5 阅读
  8. TikTok限流封号要如何处理

    2024-06-14 00:56:03       7 阅读
  9. 关于自学编程的9点忠告

    2024-06-14 00:56:03       6 阅读