C进阶期末复习题¶
问题B: 四则运算¶
读入一个整数、一个操作符(仅限于+ - * /)、一个整数,求该表达式的值。
若除数为0,输出“The divisor is 0.”; 如过运算符是/,则进行整除(/)运算
例如: 5/3的结果应该是1
代码实现 :
难点:在于如何用C实现整除。当两个操作数都是整数时,C语言中的除法运算符将执行整数除法,即只返回结果的整数部分而舍弃小数部分。当两个操作数都是浮点数的话则返回浮点数结果。如果想要获得整数部分,可以用 类型转化
#include"stdio.h"
#include"stdlib.h"
int main()
{
int a , b;
char c;
int g;
scanf("%d%c%d",&a,&c,&b);
if (b==0)
{
printf("The divisor is 0.");
}else
{
switch (c)
{
case '+':
printf("%d",a+b);
break;
case '-':
printf("%d",a-b);
break;
case '*':
printf("%d",a*b);
break;
case '/':
g = a / b;
printf("%d",g);
break;
default:
break;
}
}
}
问题C: 确定数值的长度¶
任意输入一个整数n(n在1..100000000),统计该数是几位数 提示: 用除10运算 如:123 , (1) 123/10=12 重复以上步骤,直至该数变为0为止
代码实现:
#include"stdio.h"
#include"stdlib.h"
int main()
{
int x;
scanf("%d",&x);
int num=0;
while (x>0)
{
num++;
x/=10;
}
printf("%d",num);
}
问题D: 函数printChar¶
编写程序,设计一个满足以下条件的printchar函数,用于在屏幕上打印若干个指定的字符。该函数的描述如下:
- 该函数不带有返回值
- 该函数带有两个参数:参数一为字符型数据,说明要输出的是哪个字符,参数二为整型数据,说明参数一指定的字符要打印多少个。
输入:
1个字符ch,表示要输出的字符,然后是一个空格,空格后是一个整数n,表示要输出的字符的个数。
输出:
n个字符的ch
t 5
ttttt
---
#include <stdio.h>
@#1
int main()
{ int m;
char c;
scanf("%c%d",&c,&m);
printChar(c,m);
}
@@1
@@1
代码实现:
#include <stdio.h>
void printChar(char c , int m);
int main()
{
int m;
char c;
scanf("%c%d", &c, &m);
printChar(c, m);
}
void printChar(char c , int m){
while (m>0)
{
m--;
printf("%c",c);
}
}
问题E: 【一维数组】求最小值及其下标¶
输入一组数据(最多不超过20个),存入数组中,求出该数组的最小值以及最小值的下标
第一行输入一个整数n
第二行输入n个整数
输出最小值和最小值下标
代码实现:
#include <stdio.h>
int main()
{
int n;
int a[30];
int i;
int min,min_flag;
scanf("%d",&n);
for ( i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
min=a[0];
min_flag=0;
for ( i = 1; i < n; i++)
{
if (min>a[i])
{
min=a[i];
min_flag=i;
}
}
printf("%d %d",min,min_flag);
return 1;
}
问题F: 【C语言】求二维数组周边元素的累加和【二维数组】¶
求一个二维数组周边元素的累加和。 输入一个二维数组的行数m(m<10),列数n(n<10),二维数组的各元素值。输出周边元素之和。
输入的第一行为矩阵的行数和列数,从第二行开始,为矩阵元素的输入。
输出周边元素之和。
代码实现:
#include <stdio.h>
int main()
{
int x, y;
scanf("%d %d", &x, &y);
int a[10][10];
int i, j;
int sum = 0;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
scanf("%d", &a[i][j]);
}
}
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
if (i == 0 || j == 0 || i == 2 || j == 3)
{
sum += a[i][j];
}
}
}
printf("%d", sum);
return 1;
}
问题 G: 【字符串杂题】字符串分隔¶
字符串的合并与分隔,在网页编程中有非常重要。下面请你设计一个字符串分隔函数split,其功能是将一个以#为分隔标志的英文字符串,分隔到多个字符串,并保存到二维数组中。例如将英文字符串"zhangsan#lisi#wangwu#"分隔成3个字符串"zhangsan"、"lisi"、"wangwu"。
输入一个以#为分隔标志的英文字符串
输出:第1行是1个整数n,表示分隔后的字符串个数
接下来n行,表示分隔后的n个字符串,每个字符串1行
分析: 注意strncpy的使用、指针、每个词的长度、字符串结束符'\0'
charGPT:代码实现:
#include <stdio.h>
#include <string.h>
#define MAX_STRINGS 100
#define MAX_LENGTH 100
void splitWithoutStrtok(const char* str, char result[MAX_STRINGS][MAX_LENGTH], int* count) {
// 初始化字符串计数器
*count = 0;
// 初始化分隔位置
int start = 0;
int end = 0;
// 遍历输入字符串
while (str[end] != '\0' && *count < MAX_STRINGS) {
// 找到分隔符的位置
while (str[end] != '#' && str[end] != '\0') {
end++;
}
// 计算分隔字符串的长度
int length = end - start;
// 拷贝分隔后的字符串到结果数组
strncpy(result[*count], &str[start], length);
result[*count][length] = '\0';
(*count)++;
// 跳过分隔符
if (str[end] == '#') {
end++;
}
// 更新下一个分隔字符串的起始位置
start = end;
}
}
int main() {
char str[] = "zhangsan#lisi#wangwu#";
char result[MAX_STRINGS][MAX_LENGTH];
int count = 0;
splitWithoutStrtok(str, result, &count);
printf("分隔后的字符串数量:%d\n", count);
printf("分隔后的字符串为:\n");
for (int i = 0; i < count; i++) {
printf("%s\n", result[i]);
}
return 0;
}
我的实现:
#include <stdio.h>
#include <string.h>
int gc(char x[30],char st[20][20],int num);
int main() {
char st[10][20];
char x[30];
scanf("%s",x);
int num=0;
num=gc(x,st,num);
printf("%d\n",num);
for (int i = 0; i < num; i++)
{
printf("%s\n",st[i]);
}
return 0;
}
int gc(char x[30],char st[20][20],int num){
// zhangsan#lisi#wangwu#
int length=0;
int wb;
int start=0;
int cursor=0;
while (x[cursor]!='\0')
{
while (x[cursor]!='#'&x[cursor]!='\0')
{
cursor++;
// 当前第9个是#,cursor=9
}
length=cursor-start;
strncpy(st[num],&x[start],length);
wb=length++;
st[num][wb]='\0';
cursor++;
start=cursor;
num++;
}
return num;
}
问题 H: 【函数 数组 指针】 【1】利用函数在数组中找最大最小值(一)¶
输入一组数据,将该批数据存入数组中,并找出其中的最大值,最小值
第一行输入一个整数n
第二行输入n个整数
输出:
最大值和最小值
代码实现:
#include"stdio.h"
void inputarray(int a[],int n);
void maxmin(int a[],int n,int *max,int *min );
int main()
{
int b[100];
int m,n,k;
scanf("%d",&k);
inputarray(b,k);
maxmin(b,k,&m,&n);
printf("max=%d,min=%d\n",m,n);
return 1;
}
void inputarray(int a[],int n){
int i;
for ( i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
}
void maxmin(int a[],int n,int *max,int *min ){
int i;
*max=a[0];
*min=a[0];
for ( i = 1; i < n; i++)
{
if (*max<a[i])
{
*max=a[i];
}
if (*min>a[i])
{
*min=a[i];
}
}
}
问题 I: 【C语言】【结构体】【函数】计算两个复数之和¶
本题要求实现一个计算复数之和的简单函数。
说明:任意两个复数的和是 (a+bi)+(c+di)=(a+c)+(b+d)i.
3 4 5 6
(3+4i) + (5+6i) = 8 + 10i
----
#include <stdio.h>
struct complex{
int real;
int imag;
};
struct complex multiply(struct complex x, struct complex y);
int main()
{
struct complex c, x, y;
scanf("%d%d%d%d", &x.real, &x.imag, &y.real, &y.imag);
c= multiply(x, y);
printf("(%d+%di) + (%d+%di) = %d + %di\n",
x.real, x.imag, y.real, y.imag, c.real, c.imag);
return 0;
}
@@1
/* 你的代码将被嵌在这里 */
@@1
struct complex multiply(struct complex x, struct complex y){
struct complex p;
p.imag=x.imag+y.imag;
p.real=x.real+y.real;
return p;
}
问题 J: 【链表初步】动态链表(头插法)¶
利用头插法,创建类似下图所示的动态链表,其中结点数据域由键盘输入而确定。要创建下图的链表,输入的依次是DCBA。
创建好链表后,还需要依次访问各个结点,输出各个结点的数据域。
输入
1行,4个字符
输出
4个字符,次序与输入相反,中间用空格分隔。
分析: 节点p每次使用都是malloc一下、malloc的使用、销毁节点时候创建一个新节点再用free
XYUW
W U Y X
--
#include <stdio.h>
#include <stdlib.h>
struct node //结点数据类型
{
char data;
struct node *next;
};
void traverse(struct node* head);
void destroy(struct node* head);
struct node* headinsert(struct node* head);//该函数按照头插法,创建4个结点的动态链表,并返回第1个结点的地址
int main()
{
struct node *head=NULL;
head=headinsert(NULL); //用头插法创建链表
//遍历链表
traverse(head);
//释放资源,销毁链表中所有结点
destroy(head);
}
void traverse(struct node* head){
while (head)
{
printf("%c ",head->data);
head=head->next;
}
}
void destroy(struct node* head){
struct node *p=head;
while (head)
{
p=head;
head=head->next;
free(p);
}
}
struct node* headinsert(struct node* head){
struct node *p;
for (int i = 0; i < 4; i++)
{
p = (struct node*)malloc(sizeof(struct node));
scanf("%c",&p->data);
if (head==NULL)
{
p->next=NULL;
}else
{
p->next=head;
}
head=p;
}
return head;
}
问题 K: 【链表初步】最大结点¶
已知head指向一个单链表,链表的结点的数据域是整型,设计函数求出链表中数据域值最大的结点。请完成下面的函数设计(二选一)。
struct node * largestnode1(struct node head);
void largestnode2(struct node head,struct node **ppmax);
找到最大结点后,如何将其传递给主调函数,有二种方法:
1. 通过返回值,return回来。
2. 通过指针的指针。主调函数传递指针变量的地址,函数将最大结点的地址,保存到这个传递过来的地址中,这样,主调函数中的指针变量,就获得了最大结点的地址。
输入:
1行,共6个整数,表示链表中的6个结点的数据域的值,这6个结点,按照头插法,插入到链表中
输出:
一个整数,表示最大结点的数据域的值。
9 2 17 8 11 13
17
--
#include <stdio.h>
#include <stdlib.h>
struct node //结点数据类型
{
int data;
struct node *next;
};
//实现以下二个函数中的一个。
struct node * largestnode1(struct node *head);
void largestnode2(struct node *head,struct node **ppmax);
void destroy(struct node* head);
struct node* headinsert(struct node* head);
main()
{
struct node *head=NULL;
struct node * pmax;
head=headinsert(NULL); //用前插法创建链表
//找到最大结点,将其地址传给pmax
// pmax=largestnode1(head);
//largestnode2(head,&pmax);
@#1 //选择上面二个被注释掉的语句中1个,并实现相应的函数。建议有的同学,可以二种都尝试一下,并提交二次
printf("%d",pmax->data);
//释放资源
destroy(head);
}
struct node* headinsert(struct node* head)
{ struct node *p;
int n=0;
//采用相同的方式创建6个结点,并且前插
while(n<6)
{
//申请结点空间,创建新结点,并让p指向新结点
p = (struct node *)malloc(sizeof(struct node));
//初始化结点数据域
scanf("%d",&(p->data));
//挂链
p->next=head; //新结点的指针域,指向原来的第1个结点
head=p; //让新结点成为第1个结点
n++;
}
return head; //返回第1个结点的地址
}
struct node * largestnode1(struct node* head)
{ struct node *pmax=head; //先假定第1个结点最大
struct node *p=head->next; //p指向第2个结点
@@1
如何找到最大结点,并让pmax指向最大结点?
@@1
return pmax;
}
void largestnode2(struct node *head,struct node **ppmax)
{
*ppmax=head; //先假定第1个结点最大
struct node *p=head->next; //p指向第2个结点
@@2
如何找到最大结点,并让ppmax指向最大结点?
由于是函数是void类型,如何把ppmax,传回给主调函数?
@@2
}
void destroy(struct node* head)
{ struct node *p;
while(head!=NULL)
{
p = head; //p指向要销毁的结点
head = head ->next; //head指向再下一个要销毁的结点
free(p); //销毁p指向的结点
}
}
问题 L: 【C语言】【一维数组】组最小数¶
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入:
输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出:
在一行中输出能够组成的最小的数。
代码实现:
#include <stdio.h>
#include <stdlib.h>
int main()
{
// 放到数组中,第一步 先找到首位(不能是0,且最小)用完之后该位设置为-1
int a[10];
int i, j;
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
int min = 10;
int min_flag = -1;
for (i = 0; i < 10; i++)
{
if (min > a[i] && a[i] != 0)
{
min = a[i];
min_flag = i;
}
}
a[min_flag] = -1;
printf("%d", min);
min = 100;
min_flag = -1;
for (i = 0; i < 9; i++)
{
for (j = 0; j < 10; j++)
{
if (min >= a[j] && a[j] >= 0)
{
min = a[j];
min_flag = j;
}
}
a[min_flag] = -1;
printf("%d", min);
min = 100;
min_flag = -1;
}
return 1;
}