以下代码中的两个sizeof用法有问题吗?
void UpperCase(char str[] ) // 将str 中的小
写字母转换成大写字母
{
for(size_t i=0; i
if('a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout $amp;sizeof(str)/sizeof(str[0]) $amp;UpperCase(str );
cout $amp;
void UpperCase(char str[] ) // 将str 中的小
写字母转换成大写字母
{
for(size_t i=0; i
if('a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout $amp;sizeof(str)/sizeof(str[0]) $amp;UpperCase(str );
cout $amp;
以下代码中的两个sizeof用法有问题吗?
void UpperCase(char str[] ) // 将str 中的小
写字母转换成大写字母
{
for(size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if('a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str 字符长度为: " <<
sizeof(str)/sizeof(str[0]) << endl;
UpperCase(str );
cout << str << endl;
试题二(共15分)
阅读以下说明、C程序代码和问题1至问题3,将解答写在答题纸的对应栏内。
【说明1】
设在某C系统中为每个字符型数据分配1个字节,为每个整型(int)数据分配4个字节,为每个指针分配4个字节,sizeof(x)用于计算为x分配的字节数。
【C代码】
#include <stdio.h>
#include <string.h>
int main()
{ int arr[5]={10,20,30};
char mystr[]="JustAtest\n";
char *ptr= mystr;
printf("%d%d%d\n", sizeof(int),sizeof(unsigned int),sizeof(arr));
printf("%d%d\n",sizeof(char),sizeof(mystr));
printf("%d%d%d\n",sizeof(ptr),sizeof(*ptr),strlen(ptr));
return 0;
}
【问题1】(8分)
请写出以上C代码的运行结果。
【说明2】
const是C语言的一个关键字,可以用来定义“只读”型变量。
【问题2】(4分)
(1)请定义一个“只读”型的整型常量size,并将其值初始化为10;
(2)请定义一个指向整型变量a的指针ptr,使得ptr的值不能修改,而ptr所指向的目标变量的值可以修改(即可以通过ptr间接修改整型变量a的值)。
注:无需给出整型变量a的定义。
【问题3】(3分)
某C程序文件中定义的函数f如下所示,请简要说明其中static的作用,以及形参表“const int arr[]”中const的作用。
static int f(const int arr[])
{
/*函数体内的语句省略*/
}
阅读以下说明和C语言代码,回答问题1至问题5,将解答填入答题纸的对应栏内。
[说明]
在实模式存储管理方案下,嵌入式系统的内存地址空间的布局一般可以分为五个段:代码段(text)、数据段(data)、bss段(bss)、堆(heap)和栈(stack)。
图16-4为一段例程。
1: include
2: unsigned char gvCh;
3: unsigned short gvShort;
4: unsigned int gvInt = 0x12345678;
5: unsigned long gvLong = 0x87654321;
6: void main(void)
7: {
8: unsigned char array[lO],*p;
9: p = malloc(lO*sizeof(char));
10: while (1);
代码段、数据段和bss段的大小是在什么时候确定的?
用传统流程图表示求解以下问题的算法,且用N-S图和伪代码表示算法。
(1)有两个瓶子A和B,分别盛放醋和酱油,要求将它们互换(即A瓶原来盛醋,现改盛酱油,B瓶则相反)。
(2)依次将10个数输入,要求将其中最大的数输出。
(3)有3个数a,b,c,要求按大小顺序把它们输出。
(4)求1+2+3+...+100。
(5)判断一个数n能否同时被3和5整除。
(6)将100~200的素数输出。
(7)求两个数m和n的最大公约数。
(8)求方程式ax2+bx+c=0的根。分别考虑:①有两个不等的实根;②有两个相等的实根。
inciude<stdio.h> inciude<stdlib.h> define MAX 65536 void merge(int arr[],int p,int q,int r) { int *left, *right; int n1,n2,i,j,k; n1=q-p+1; n2=r-q; if((left=(int*)malloc((n1+1)*sizeof(int)))=NULL) { perror("malloc error"); exit(1); } if((right=(int*)malloc((n2+1)*sizeof(int)))=NULL) { perror("malloc error"); exit(1); } for(i=0;i<n1;i++){ left[i]=arr[p+i]; } left[i]=MAX; for(i=0; i<n2; i++){ right[i]=arr[q+i+1] } right[i]=MAX; i=0; j=0; for(k=p; (1) ; k++) { if(left[i]> right[j]) { (2) ; j++; }else { arr[k]=left[i]; i++; } } } void mergeSort(int arr[],int begin,int end){ int mid; if((3) ){ mid=(begin+end)/2; mergeSort(arr,begin,mid); (4) ; merge(arr,begin,mid,end); } }
【问题1】 根据以上说明和C代码,填充1-4。 【问题2】 根据题干说明和以上C代码,算法采用了(5)算法设计策略。 分析时间复杂度时,列出其递归式位(6),解出渐进时间复杂度为(7)(用O符号表示)。空间复杂度为(8)(用O符号表示)。 【问题3】 两个长度分别为n1和n2的已经排好序的子数组进行归并,根据上述C代码,则元素之间比较次数为(9)。
阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。
【说明】
函数diff的功能是:根据两个由整数(都大于-32768)按升序构成的单链表L1和L2(分别由A,B指向)构造一个单链表L3(由*r指向),要求13中的所有整数都是L1,并且不是 L2中的整数,还要求L3中的所有整数都两两不等。
【函数】
include < malloc. h >
typedef struct node {
int d;
struct node * next
} Node;
void diff(Node *A,Node * B,Node * * r)
{
int lastnum;
Node * p;
*r = NULL;
if(! A) return;
while((1))
if(A->d < B ->d)
{
lastnum =A -> d;
p= (Node * ) malloc(sizeof(Node) );
p->d = lastnum;
p->next= *r;(2);
do
A = A -> next;
while((3));
}
else if(A->d > B->d)
B=B- >next;
else {
(4);
lastnum=A -> d;
while (A && A->d = = lastnum) A=A-> next;
}
while(A)
{
lastnum=A->d;
p=(Node * ) malloc(sizeof(Node) );
p-> d = lastnum;
(5);
*r=p;
while (A && A->d = = lastnum) A=A->next;
}
}
阅读以下技术说明和C语言代码,根据要求回答问题1至问题6。
【说明】
有两个进程(编号分别为0和1)需要访问同一个共享资源。为了解决竞争条件(race condition)的问题,需要实现一种互斥机制,使得在任何时刻只能有一个进程访问该共享资源。以下【C代码1】给出了一种实现方法。
【C代码1】
int flag[2]; /+flag数组,初始化为FALSE*/
Enter_Critical_Section(int my_task_id, int other_task_id)
{ while (flag[other_task_id]==TRUE); /*空循环语句*/
flag[my_task_id]=TRUE;
}
Exit_Critical_Section(int my_task_id, int other_task_id)
{ flag[my_task_id]=FALSE;
}
当一个进程要访问临界资源时,就可以调用【C代码1】给出的这两个函数。【C代码2】给出了进程0的一个例子。
【C代码2】
Enter_Critical_Section(0,1);
……使用这个资源……
Exit_Critical_Section(0,1);
……做其他的事情……
什么是临界资源(critical resource)?请用100字以内的文字简要说明。
为了保护您的账号安全,请在“简答题”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!