- 用指针做函数的参数,设计一函数将整型数组各元素的值乘以 10。
//
// Created by imbytecat on 2020/5/30.
// 用指针做函数的参数,设计一函数将整型数组各元素的值乘以 10。
//
#include <cstdio>
int main() {
int numList[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("%d\n", *(numList + i) * 10);
}
return 0;
}
- 用指针做函数的参数。设计一个实现两个浮点型参数交换的函数,并在主函数中测试它,测试参数为:10.1、5.8。
//
// Created by imbytecat on 2020/5/30.
// 用指针做函数的参数。设计一个实现两个浮点型参数交换的函数,并在主函数中测试它,测试参数为:10.1、5.8。
//
#include <cstdio>
void exchange(double *a, double *b) {
double r;
r = *a;
*a = *b;
*b = r;
}
int main() {
double a = 10.1, b = 5.8;
double *p, *q;
p = &a;
q = &b;
exchange(p, q);
printf("%f %f\n", a, b);
return 0;
}
- 有 n 个整数,使前面各数顺序向后移 m 个位置,最后 m 个数变成最前面 m 个数。写一函数实现以上功能,在主函数中输入 n 个整数和输出调整后的 n 个数。用指针做函数的参数。
//
// Created by imbytecat on 2020/5/31.
// 有 n 个整数,使前面各数顺序向后移 m 个位置,最后 m 个数变成最前面 m 个数。
// 写一函数实现以上功能,在主函数中输入 n 个整数和输出调整后的 n 个数。用指针做函数的参数。
//
#include <cstdio>
int main() {
void move(int [20], int, int);
int number[20], n, m, i;
printf("多少个数?");
scanf("%d", &n);
printf(" 输入%d个数 :\n", n);
for (i = 0; i < n; i++)
scanf("%d", &number[i]);
printf("移动多少个位置?");
scanf("%d", &m);
move(number, n, m);
printf("输出:\n");
for (i = 0; i < n; i++)
printf("%d ", number[i]);
printf("\n");
return 0;
}
void move(int array[20], int n, int m) {
int *p, array_end;
array_end = *(array + n - 1);
for (p = array + n - 1; p > array; p--)
*p = *(p - 1);
*array = array_end;
m--;
if (m > 0) move(array, n, m);
}
- 编写约简分数的函数(用分子分母的最大公约数除分子分母),用指针变量做函数的参数。
//
// Created by imbytecat on 2020/5/31.
// 编写约简分数的函数(用分子分母的最大公约数除分子分母),用指针变量做函数的参数。
//
#include<iostream>
void lowterm(int *num, int *den) {
int n, d, r;
n = *num;
d = *den;
while (d != 0) {
// 辗转相除法
r = n % d;
n = d;
d = r;
}
if (n > 1) {
*num = *num / n;
*den = *den / n;
}
}
int main() {
int a = 14, b = 21;
printf("化简前:%d/%d\n", a, b);
lowterm(&a, &b);
printf("化简后:%d/%d", a, b);
return 0;
}
- 在函数中通过指针访问数组元素,实现选择法排序。
//
// Created by imbytecat on 2020/5/30.
// 在函数中通过指针访问数组元素,实现选择法排序。
//
#include <cstdio>
void xz(int *p, int n) {
int i, j, k, t, *p1;
p1 = p;
for (i = 0; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++)
if (*(p + j) < *(p + k)) {
t = *(p + j);
*(p + j) = *(p + k);
*(p + k) = t;
}
}
for (i = 0; i < n; i++)
printf(" %d ", *(p1 + i));
printf("\n");
}
int main() {
int i;
int a[10];;
printf("输入 5 个数:");
for (i = 0; i < 5; i++)
scanf("%d", &a[i]);
printf("\n选择排序");
xz(a, 5);
return 0;
}
- 实现 strcat() 函数功能,要求自行编写代码将字符串 b 的内容追加到字符串 a 的尾部。
//
// Created by imbytecat on 2020/5/30.
// 实现 strcat() 函数功能,要求自行编写代码将字符串 b 的内容追加到字符串 a 的尾部。
//
#include <cstdio>
char *myStrcat(char *dest, const char *src) {
char *p = dest;
while (*p) p++; // 让指针 P 指向 dest 的最后面
while (*src) {
*p = *src;
p++;
src++;
}
*p = '\0'; // 新字符串的终止符
return dest;
}
int main() {
char s[10] = "imbytecat";
char *c = ".com";
myStrcat(s, c);
puts(s);
return 0;
}
- 用行指针变量求4阶矩阵的主对角线元素之和。
//
// Created by imbytecat on 2020/5/30.
// 用行指针变量求4阶矩阵的主对角线元素之和。
//
#include <cstdio>
#define num 3
int main() {
int a[num][num], total1 = 0, total2 = 0;
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
scanf("%d", &a[i][j]);
}
}
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
if (i == j) {
total1 += a[i][j];
}
if (i + j == 2) {
total2 += a[i][j];
}
}
}
printf("主对角线和:%d\n", total1);
printf("副对角线和:%d\n", total2);
return 0;
}
- 编程实现:输入星期几的数字后,输出该数字对应的中文全名,例如输入 2,输出"星期二",1~7以外的数字表示退出。要求用指针数组表示。
//
// Created by imbytecat on 2020/5/31.
// 编程实现:输入星期几的数字后,输出该数字对应的中文全名,例如输入 2,输出"星期二",1~7以外的数字表示退出。要求用指针数组表示。
//
#include <cstdio>
int main() {
int i, week;
char *Week[7] = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
printf("输入数字:\n");
scanf("%d", &week);
for (; week < 1 || week > 7; printf("您的输入有误,请重新输入\n"), scanf("%d", &week));
printf("%d对应的星期为:%s\n", week, *(Week + week - 1));
return 0;
}
- 用函数指针做函数的参数,实现调用加法和乘法。函数原型为 void op(int x, int y, int (*f)(int,int));
//
// Created by imbytecat on 2020/5/31.
// 用函数指针做函数的参数,实现调用加法和乘法。函数原型为 void op(int x, int y, int (*f)(int,int));
//
#include<iostream>
using namespace std;
int Add(int a, int b) {
return a + b;
}
int Mult(int a, int b) {
return a * b;
}
int Op(int x, int y, int(*f)(int, int)) {
return (*f)(x, y);
}
int main() {
int a, b;
printf("请输入两个数:");
scanf("%d%d", a, b);
int (*p)(int a, int b);
p = Add;
cout << "a+b=" << Op(a, b, Add) << endl;
p = Mult;
cout << "a*b=" << Op(a, b, Mult) << endl;
return 0;
}
- 编写函数,计算二维数组 a 中每一行的和,将它存放在一位数组 b 中,在主函数中实现它。
//
// Created by imbytecat on 2020/5/31.
// 编写函数,计算二维数组 a 中每一行的和,将它存放在一位数组 b 中,在主函数中实现它。
//
#include <cstdio>
int main() {
int i, j;
int b[4][5], a[4];
for (i = 0; i < 4; i++)
for (j = 0; j < 5; j++)
scanf("%d", &b[i][j]);
for (i = 0; i < 4; i++) {
a[i] = 0;
for (j = 0; j < 5; j++)
a[i] += b[i][j];
}
printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
return 0;
}
- 函数 char fun(char str, char c) 功能是返回 str 所指字符串中以形参 c 中字符开头的后续字符串的首地址。例如:str 所指字符串为 Hello!,c 中的字符为 e,则函数返回字符串 ello! 的首地址。若 str 所指字符串为空串或不包含 c 中的字符,则函数返回 NULL。请编写实现。
//
// Created by imbytecat on 2020/5/31.
// 函数 char *fun(char *str, char c) 功能是返回 str 所指字符串中以形参 c 中字符开头的后续字符串的首地址。
// 例如:str 所指字符串为 Hello!,c 中的字符为 e,则函数返回字符串 ello! 的首地址。
// 若 str 所指字符串为空串或不包含 c 中的字符,则函数返回 NULL。请编写实现。
//
#include <cstdio>
#include <cstring>
char *fun(char *str, char c) {
int n = 0;
char *p = str;
if (p != NULL)
while (p[n] != c && p[n] != '\0') n++;
if (p[n] == '\0') return NULL;
return (str + n);
}
int main() {
char str[99] = "hello!";
char c = 'e';
printf("%s ", fun(str, c));
return 0;
}
- 函数 char fun(char str) 的功能是检查一个字符串是否是回文。当字符串是回文时,函数返回字符串:yes!,否则函数返回字符串:no!,并在主函数中输出。所谓回文即正向与反向的拼写都一样,例如:abccba。
//
// Created by imbytecat on 2020/5/30.
// 函数 char *fun(char *str) 的功能是检查一个字符串是否是回文。
// 当字符串是回文时,函数返回字符串:yes!,否则函数返回字符串:no!,并在主函数中输出。
// 所谓回文即正向与反向的拼写都一样,例如:abccba。
//
#include <cstdio>
#define N 80
int fun(char *str) {
int i, j;
for (i = 0; str[i] != '\0'; i++);
j = i - 1;
for (i = 0; i < j; i++, j--)
if (str[i] != str[j])
return 0;
return 1;
}
int main() {
char s[N];
printf("输入字符串:");
gets(s);
printf("\n");
puts(s);
if (fun(s)) printf("yes!\n");
else printf("no!\n");
return 0;
}
- 已有 a、b 两个升序链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。
//
// Created by imbytecat on 2020/5/30.
// 已有 a、b 两个升序链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。
//
#include <cstdio>
#include <cstdlib>
#include <cstring>
struct student {
int id;
char name[1024];
int score[3];
struct student *next;
};
typedef struct student stu;
stu *creat(int n) { // 创建链表
stu *s;
stu *head;
stu *p;
s = (stu *) malloc(sizeof(stu));
head = s;
p = head;
for (int i = 0; i < n; ++i) {
s = (stu *) malloc(sizeof(stu));
printf("请输入第%d个学生的信息\n", i + 1);
printf("请输入学号\n");
scanf("%d", &s->id);
printf("请输入姓名\n");
scanf("%s", &s->name);
for (int j = 0; j < 3; ++j) {
printf("请输入第%d门课的成绩\n", j + 1);
scanf("%d", &s->score[j]);
}
s->next = p->next;
p->next = s;
p = p->next;
if (i == n - 1) {
p->next = NULL;
}
}
return head;
}
void print(stu *head) { // 输出
for (stu *p = head->next; p != NULL; p = p->next) {
printf("%d\t%s\t%d\t%d\t%d\n", p->id, p->name, p->score[0], p->score[1], p->score[2]);
}
}
void swap(stu *p, stu *q) { // 交换函数
p->id = p->id ^ q->id;
q->id = p->id ^ q->id;
p->id = p->id ^ q->id;
char temp[1024];
strcpy(temp, p->name);
strcpy(p->name, q->name);
strcpy(q->name, temp);
for (int i = 0; i < 3; ++i) {
p->score[i] = p->score[i] ^ q->score[i];
q->score[i] = p->score[i] ^ q->score[i];
p->score[i] = p->score[i] ^ q->score[i];
}
}
void fun(stu *a, stu *b) { // 合并并排序
stu *p;
for (p = a; p->next != NULL; p = p->next); // 找到a的最后一个指针
p->next = b->next; // 让它指向b
free(b);
for (p = a->next; p != NULL; p = p->next) {
for (stu *q = p->next; q != NULL; q = q->next) {
if (p->id > q->id) {
swap(p, q);
}
}
}
}
int main() {
int n, m;
printf("请输入链表a的长度\n");
scanf("%d", &n);
printf("请输入链表b的长度\n");
scanf("%d", &m);
printf("请输入链表a中的学生信息\n");
stu *a = creat(n);
printf("请输入链表b中的学生信息\n");
stu *b = creat(m);
printf("链表 a 学生信息\n学号\t姓名\t成绩1\t成绩2\t成绩3\n");
print(a);
printf("链表 b 学生信息\n学号\t姓名\t成绩1\t成绩2\t成绩3\n");
print(b);
printf("合并排序后为\n学号\t姓名\t成绩1\t成绩2\t成绩3\n");
fun(a, b);
print(a);
system("pause");
return 0;
}
- 已有 a、b 两个链表。设结点为学号和姓名,从链表 a 中删除与链表 b 中相同学号的那些结点。
//
// Created by imbytecat on 2020/5/30.
// 已有 a、b 两个链表。设结点为学号和姓名,从链表 a 中删除与链表 b 中相同学号的那些结点。
//
#include <cstdio>
#include <cstdlib>
struct Student { // 定义结构体Student
int num;
char name[20];
Student *next;
};
void input(Student *stu, int n); // 定义输入函数
void print(Student *stu); // 定义输出函数
Student *del(Student *stu1, Student *stu2); // 定义删除结点函数,返回删除后a链表首地址
int main() {
Student a[3], b[2]; // 定义结构体变量a和b
input(a, 3); // 调用输入函数,输入a链表
input(b, 2); // 调用输入函数,输入b链表
print(del(a, b)); // 调用输出函数,参数为删除结点函数的返回指针值
system("pause");
return 0;
}
// 输入函数
void input(Student *stu, int n) {
Student *p;
int i;
for (p = stu, i = 0; p < stu + n; p++, i++) {
printf("Please enter No.%d student info: ", i + 1);
scanf("%d %s", &p->num, p->name);
i == n - 1 ? stu[i].next = NULL : stu[i].next = &stu[i + 1];
}
}
// 输出函数
void print(Student *stu) {
Student *p;
for (p = stu; p != NULL; p = p->next) {
printf("%d %s\n", p->num, p->name);
}
}
// 删除结点函数
Student *del(Student *stu1, Student *stu2) {
Student *p, *q, *head;
int i;
for (p = stu1, head = p, i = 1; p != NULL; p = p->next) {
for (q = stu2; q != NULL; q = q->next) {
if (p->num == q->num) { // 判断学号是否相符
if (head == p) { // 判断是否为头指针,如果是头指针指向链表下一个地址
head = p->next;
} else if (p->next == NULL) { // 判断是否为尾指针,如果是尾指针指向链表上一个地址
(p - i)->next = NULL; // i 的作用是判断链表之前是否有删除的结点
} else { // 除以上条件外,链表上一结点指向下一个结点
(p - 1)->next = p->next;
i++;
}
}
}
}
return head;
}
本文由 imbytecat 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: May 31, 2020 at 10:04 am