6-1 调和平均 - C/C++ 指针及引用
函数hmean()用于计算整数x和y的调和平均数,结果应保存在指针r所指向的浮点数对象中。当x+y等于0时,函数返回0表示无法计算,否则返回1。数学上,两个数x和y的调和平均数 z = 2xy/(x+y) 。
- int hmean(const int x, const int y, float* r){
- if(x+y==0)
- return 0;
- else{
- *r=2.0*x*y/(x+y);
- return 1;
- }
- }
函数hmean()用于计算整数x和y的调和平均数,结果应保存在参数r所引用的浮点数对象中。当x+y等于0时,函数返回0表示无法计算,否则返回1。数学上,两个数x和y的调和平均数 z = 2xy/(x+y) 。
- int hmean(const int x, const int y, float& r){
- if(x+y==0)
- return 0;
- else{
- r=2.0*x*y/(x+y);
- return 1;
- }
- }
(地球时间)以第3章微实践-地球时间的代码为基础,实现下述getTime()函数,将当前小时、分钟和秒数写入指针h、m和s指向的整数对象
- void getTime(int* h, int* m, int* s) {
- time_t timer;
- struct tm* tblock;
- timer = time(NULL);
- tblock = localtime(&timer);
- *h = tblock->tm_hour;
- *m = tblock->tm_min;
- *s = tblock->tm_sec;
- }
strLength()函数用于统计指针s所指向的以0结尾的字符串的长度(字符个数),请实现该函数,使得下述程序可以正确运行。注意不能使用原生的strlen()函数。
- unsigned int strLength(const char* s){
- unsigned int len = 0;
- while (*s != '\0') {
- len++;
- s++;
- }
- return len;
- }
函数strAppend(d,s)将以0结尾的字符串s附加到以0结尾的字符串d之后。请实现该函数,使得后续程序可以正确运行。注意不能使用原生的strcat()函数。
示例:指针d所指向的字符串"hello"在附加字符串"world"后变为"helloworld"。
- void strAppend(char *d, char *s) {
- // 找到字符串d的末尾
- while (*d != '\0') {
- d++;
- }
- // 将字符串s复制到字符串d的末尾
- while (*s != '\0') {
- *d = *s;
- d++;
- s++;
- }
- // 在字符串d的末尾添加'\0'
- *d = '\0';
- }
一个IPv4地址可用一个4字节的无符号整数来表示。下述setByte(ip,idx,v)函数负责将指针ip所指向的IP地址的第idx个字节修改为v,其中,idx取值0到3。请实现该函数,使得下述程序可以正常运行。
该程序通过4次调用该函数将一个ip地址设置为192.168.0.1,然后将整个ip地址按通常格式输出。
- void setByte(unsigned char *ip, int idx, unsigned char v) {
- ip[idx] = v;
- }
(地球时间)以第3章微实践-地球时间的代码为基础,实现下述getTime()函数,将当前小时、分钟和秒数写入参数h、m和s所引用的整数对象。
- void getTime(int& h, int& m, int& s) {
- time_t now = time(0);
- tm* currentTime = localtime(&now);
-
- h = currentTime->tm_hour;
- m = currentTime->tm_min;
- s = currentTime->tm_sec;
- }
-
本题要求实现一个拆分实数的整数与小数部分的简单函数。
- void splitfloat( float x, int *intpart, float *fracpart )
- {
- *intpart = (int)x;
- *fracpart = x - *intpart;
- }
首先输入一个正整数N(1≤N≤1000)和一个无重复元素的、从小到大排列的、N个元素的有序表,然后在屏幕上显示以下菜单(编号和选项)。
-
- int insert(int a[ ], int value) {
- int i = 0;
- for (i = 0; i < Count; i++)
- if (a[i] == value)
- return -1;
- i = 0;
- while (i < Count ) {
- if (a[i] > value)
- break;
- i++;
- }
- if (i == Count)
- a[i] = value;
- else {
- int tmp1 = a[i], tmp2;
- a[i] = value;
- while (i < Count) {
- i++;
- tmp2 = a[i];
- a[i] = tmp1;
- tmp1 = tmp2;
- }
- }
- Count++;
- return 1;
- }
-
- int del(int a[ ], int value) {
- int i = 0, j = 0, flag = 1;
- for (i = 0; i < Count; i++) {
- if (a[i] == value) {
- for (j = i; a[j] != '\0'; j++)
- a[j] = a[j + 1];
- flag = 0;
- }
- }
- if (flag)
- return -1;
- Count--;
- return 1;
- }
-
- int modify(int a[ ], int value1, int value2) {
- int i, flag = 1;
- for (i = 0; i < Count; i++) {
- if (a[i] == value2)
- return -1;
- if (a[i] == value1)
- flag = 0;
- }
- if (flag)
- return -1;
- for (i = 0; i < Count; i++)
- if (a[i] == value1) {
- a[i] = value2;
- break;
- }
- for (i = 0; i < Count; i++)
- for (int j = i + 1; j < Count; j++)
- if (a[j] < a[i]) {
- int tmp = a[j];
- a[j] = a[i];
- a[i] = tmp;
- }
- return 1;
- }
-
- int query(int a[ ], int value) {
- int before = 0, after = Count - 1;
- while (before <= after) {
- int mid = (before + after) / 2;
- if (a[mid] > value)
- after = mid - 1;
- else if (a[mid] < value)
- before = mid + 1;
- else
- return mid;
- }
- return -1;
- }
本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:
- struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2){
- struct ListNode *list=(struct ListNode *)malloc(sizeof(struct ListNode ));
- struct ListNode *l=list;
- while(list1!=NULL&&list2!=NULL){
- if(list1->data<list2->data){
- list->next=list1;
- list1=list1->next;
- list=list->next;
- }else{
- list->next=list2;
- list2=list2->next;
- list=list->next;
- }
- }
- while(list1!=NULL){
- list->next=list1;
- list1=list1->next;
- list=list->next;
- }while(list2!=NULL){
- list->next=list2;
- list2=list2->next;
- list=list->next;
- }return l->next;
- }
无符号整数v由4个字节构成。请编程完成下述任务:
- #include<iostream>
- using namespace std;
- int main()
- {
- unsigned int v;
- cin >> v;
- cout << hex;
- cout << v << endl;
- unsigned char* p = (unsigned char*)&v;
- for (int i = 0; i < 4; i++)
- {
- cout << int(p[i]);
- if (i != 3)
- {
- cout << " ";
- }
- }
- return 0;
- }
-