问题描述
- 求大侠帮忙:C语言程序设计---编程题(以下所有题目程序应是非递归的)
-
- 编写一个函数insert(s1,s2,ch),实现在字符串s1中的指定字符ch位置处插入字符串s2.
- 学校工会组织活动,要求有8名教师参加,这8名教师将分别从A学院3名教师、B学院5名教师、C学院6名教师中任意抽取,且其中必须有B学院的教师参加,请编程输出所有可能的方案
- 已知在C盘根目录下存有文本文件“file1.txt”,编程统计文件“file1.txt”中每个字母字符和每个数字字符出现的频率,在屏幕上显示统计结果,并将统计结果写入磁盘文件“file2.txt”中
- 输入一个字符串,内有数字和非数字字符,如:AS234fgh456d 17968x7654,将其中连续的数字作为一个整体,依次存放到一数组a中,例如234存入a[0],456存入a[1],…,编程统计其共有多少个整数,并输出这些数。要求:
1) 编写函数完成将字符串中连续的数字作为一个整体,依次存放到一数组a中
2) 在主函数中完成数据的输入与结果的输出 - 按由大到小的顺序对一个含有N个整型数据的数组A[N]进行排序,利用如下改进的选择排序方法:第一次选出最大者存入A[1],第二次选出最小者存入A[N],第三次选出次大者存入A[2],第四次选出次小者存入A[N-1],如此大小交替地选择,直到排序完成。要求:
1) 编写函数sort完成排序
2) 在主函数中完成数据的输入与结果的输出 - 已知用两个单链表分别存储的两个字符串,均按递增次序排列。编程实现将这两个单链表归并为一个按数据域值递减次序排列的单链表。要求:
1) 单链表中每个结点只存放一个字符
2) 利用原链表中的结点空间存储归并后的单链表,不另外生成新链表
3) 单链表的建立写一函数create实现
4) 两个链表归并过程写一函数sub实现
5) 输出结果写一函数output实现
6) 主函数调用这三个函数完成程序功能
解决方案
#include "string.h"
#include
int main()
{
//VC++
FILE *fp = NULL;
try
{
fopen_s(&fp,"c:\file1.txt","r");
}
catch (...)
{
if (NULL != fp)
{
fclose(fp);
printf("打开文件失败!n");
getchar();
return -1;
}
}
if (NULL == fp)
{
fclose(fp);
printf("打开文件失败!n");
getchar();
return -1;
}
fseek(fp,0,SEEK_END);
long lFileSize = ftell(fp);
fseek(fp,0,SEEK_SET);
unsigned char *pFileBuff = (unsigned char *)malloc(lFileSize + 1);
if (NULL == pFileBuff)
{
fclose(fp);
printf("申请内存失败!n");
getchar();
return -1;
}
memset(pFileBuff,0x00,lFileSize + 1);
fread(pFileBuff,lFileSize,1,fp);
fclose(fp);
unsigned char arr[256] = {0};
int size = 0;
for (;pFileBuff[size];)
{
if (('0' <= pFileBuff[size] && pFileBuff[size] <= '9') || ('A' <= pFileBuff[size] && pFileBuff[size] <= 'Z')
|| ('a' <= pFileBuff[size] && pFileBuff[size] <= 'z'))
{
arr[pFileBuff[size]]++;
}
size++;
}
if (NULL != pFileBuff)
{
free(pFileBuff);
pFileBuff = NULL;
}
//创建文件
try
{
fopen_s(&fp,"c:\file2.txt","w+");
}
catch (...)
{
if (NULL != fp)
{
fclose(fp);
printf("创建文件失败!n");
getchar();
return -1;
}
}
if (NULL == fp)
{
fclose(fp);
printf("创建文件失败!n");
getchar();
return -1;
}
char buff[1024];
for (unsigned char c = '0'; c<= '9';c++)
{
sprintf_s(buff,"%c出现的频率为%d/%d",c,arr[c],size);
fwrite(buff,strlen(buff),1,fp);
fwrite("n",1,1,fp);
fseek(fp,0,SEEK_END);
printf("%c出现的频率为%d/%dn",c,arr[c],size);
}
for (unsigned char c = 'A'; c<= 'Z';c++)
{
sprintf_s(buff,"%c出现的频率为%d/%d",c,arr[c],size);
fwrite(buff,strlen(buff),1,fp);
fwrite("n",1,1,fp);
fseek(fp,0,SEEK_END);
printf("%c出现的频率为%d/%dn",c,arr[c],size);
}
for (unsigned char c = 'a'; c<= 'z';c++)
{
sprintf_s(buff,"%c出现的频率为%d/%d",c,arr[c],size);
fwrite(buff,strlen(buff),1,fp);
fwrite("n",1,1,fp);
fseek(fp,0,SEEK_END);
printf("%c出现的频率为%d/%dn",c,arr[c],size);
}
fclose(fp);
getchar();
return 0;
}
解决方案二:
#include
#include "string.h"
bool isNumber(char c)
{
return '0' <= c && c <= '9';
}
int foo(char *pStr,int **pOutput,int &iLen)
{
if (NULL == pStr || NULL == pOutput)
{
return -1;
}
char *pTemp = pStr;
iLen = 0;
while (*pTemp)
{
while (*pTemp && !isNumber(*pTemp))
{
pTemp++;
}
iLen++;
while (*pTemp && isNumber(*pTemp))
{
pTemp++;
}
}
*pOutput = (int *)malloc(iLen * sizeof(int));
int i = 0;
pTemp = pStr;
while (*pTemp)
{
while (*pTemp && !isNumber(*pTemp))
{
pTemp++;
}
int n = 0;
bool bFlag = false;
while (*pTemp && isNumber(*pTemp))
{
n *= 10;
n += (*pTemp - '0');
pTemp++;
bFlag = true;
}
if (bFlag)
{
(*pOutput)[i++] = n;
}
}
return 0;
}
int main()
{
int *arr;
int iLen;
if (0 == foo("AS234fgh456d 17968x7654",&arr,iLen))
{
printf("总共有%d个数n",iLen);
for (int i = 0;i < iLen;i++)
{
printf("第%d个为%dn",i + 1,arr[i]);
}
if (iLen > 0)
{
free(arr);
arr = NULL;
}
}
;
getchar();
return 0;
};
解决方案三:
(1)
#include
#include
#define N 100
char* insert(char* s1,char* s2,int ch){
int a1 = strlen(s1);
int a2 = strlen(s2);
for(int i = ch, j = 0; i< a1+a2-ch; i++,j++){
s1[i+a2] = s1[i];
s1[i] = s2[j];
}
return s1;
}
int main(void)
{
char ss1[N*2] = {0};
char ss2[N*2] = {0};
scanf("%s", &ss1);
scanf("%s", &ss2);
insert(ss1, ss2, 5);
printf("%s ", ss1);
return 0;
}
解决方案五:
#include "string.h"
#include
/************************************************************************/
/* 函数功能:实现在字符串s1中的指定字符ch位置处插入字符串s2
/* 输入参数:s1 源字符串
/* s2 插入的字符串
/* ch 指定字符
/* 输出参数:无
/* 返回值:新的字符串的地址,外部记得释放
/************************************************************************/
char *insert(const char *s1,const char *s2,char ch)
{
//我的理解是s1是不可变的,因此我申请了一个堆
if (NULL == s1 && NULL == s2)
{
return NULL;
}
int iCount = 0;//看有多少个ch
int iS1Len = 0;//s1长度
for (;'' != s1[iS1Len];)
{
if (ch == s1[iS1Len])
{
iCount++;
}
iS1Len++;
}
if (0 == iCount || 0 == iS1Len)//如果没有ch,或者s1长度为0
{
return NULL;
}
int iS2Len = strlen(s2);//s2长度
if (0 == iS2Len)
{
return NULL;
}
char *pRet = (char*)malloc(iS1Len + iCount * (iS2Len - 1) + 1);//开辟一个内存
char *pDst = pRet;
//遍历s1,遇到ch换成s2
while ('' != *s1)
{
if (ch == *s1)
{
for (int i = 0;i < iS2Len;i++)
{
*pDst++ = s2[i];
}
s1++;
}
else
{
*pDst++ = *s1++;
}
}
*pDst = '';
return pRet;
}
int main()
{
char *pRet = insert("a1234a1","bb",'a');
if (NULL != pRet)
{
printf("%s",pRet);
free(pRet);
pRet = NULL;
}
getchar();
return 0;
}
解决方案六:
int main()
{
int i = 0;
int iCount = 1;
for (;i <= 3;i++)
{
int j = 1;
for (;j <= 5;j++)
{
int k = 0;
for (;k <= 6;k++)
{
if (8 == (i + j + k ))
{
printf("第%d种方案:A学院%d名,B学院%d名,C学院%d名n",iCount++,i,j,k);
}
}
}
}
getchar();
return 0;
}
解决方案七:
第五个,网上随便找个排序方法(冒泡,选择,插入,希尔,堆,快排,归并)就行了
解决方案八:
#include
#include "string.h"
struct ListNode
{
ListNode *pNext;
char cValue;
};
int create(ListNode *&pHead,const char *pStr)
{
if (NULL == pStr || '' == *pStr)
{
return -1;
}
pHead = (ListNode *)malloc(sizeof(ListNode));
pHead->pNext = NULL;
pHead->cValue = *pStr;
pStr++;
while (*pStr)
{
ListNode *pTemp = pHead;
ListNode *pTemp2 = pHead;
while (NULL != pTemp)
{
if (pTemp->cValue >= *pStr)
{
break;
}
pTemp2 = pTemp;
pTemp = pTemp->pNext;
}
ListNode *pNew = (ListNode *)malloc(sizeof(ListNode));
pNew->cValue = *pStr;
if (pHead == pTemp)
{
pNew->pNext = pHead;
pHead = pNew;
if (pHead->cValue > pHead->pNext->cValue)
{
pHead->cValue = pHead->pNext->cValue;
pHead->pNext->cValue = *pStr;
}
}
else if (NULL == pTemp2->pNext)
{
pTemp2->pNext = pNew;
pNew->pNext = NULL;
}
else
{
pNew->pNext = pTemp2->pNext;
pTemp2->pNext = pNew;
}
pStr++;
}
return 0;
}
void output(ListNode *pHead)
{
if (NULL == pHead)
{
return;
}
while (NULL != pHead)
{
printf("%c",pHead->cValue);
pHead = pHead->pNext;
}
printf("n");
}
int sub(ListNode *pHead1,ListNode *pHead2,ListNode *&pHead)
{
if (NULL == pHead1 || NULL == pHead2)
{
return -1;
}
ListNode *pTail = NULL;
if (pHead1->cValue < pHead2->cValue)
{
pHead = pHead1;
pHead1 = pHead1->pNext;
pTail = pHead;
}
else
{
pHead = pHead2;
pHead2 = pHead2->pNext;
pTail = pHead;
}
while (NULL != pHead1 && NULL != pHead2)
{
if (pHead1->cValue < pHead2->cValue)
{
pTail->pNext = pHead1;
pTail = pHead1;
pHead1 = pHead1->pNext;
}
else
{
pTail->pNext = pHead2;
pTail = pHead2;
pHead2 = pHead2->pNext;
}
}
while (NULL != pHead1)
{
pTail->pNext = pHead1;
pTail = pHead1;
pHead1 = pHead1->pNext;
}
while (NULL != pHead2)
{
pTail->pNext = pHead2;
pTail = pHead2;
pHead2 = pHead2->pNext;
}
pHead1 = pHead->pNext;
pHead2 = pHead;
while (NULL != pHead1)
{
ListNode *pTemp = pHead1->pNext;
pHead1->pNext = pHead;
pHead = pHead1;
pHead1 = pTemp;
}
pHead2->pNext = NULL;
return 0;
}
int main()
{
const int MAX_SIZE = 1024;
printf("请输入链表1(字符串长度不超过%d):n",MAX_SIZE);
char szBuff[MAX_SIZE] = {0};
if (0 == scanf_s("%s",&szBuff,sizeof (szBuff)))
{
printf("输入的字符串不对n");
getchar();
return -1;
}
ListNode *pHead1 = NULL;
create(pHead1,szBuff);
printf("链表1为:");
output(pHead1);
printf("请输入链表2(字符串长度不超过%d):n",MAX_SIZE);
if (0 == scanf_s("%s",&szBuff,sizeof (szBuff)))
{
printf("输入的字符串不对n");
getchar();
return -1;
}
ListNode *pHead2 = NULL;
create(pHead2,szBuff);
printf("链表2为:");
output(pHead2);
ListNode *pHead = NULL;
sub(pHead1,pHead2,pHead);
printf("n新链表为:");
output(pHead);
while (NULL != pHead)
{
ListNode *pTemp = pHead->pNext;
free(pHead);
pHead = pTemp;
}
while (1);
return 0;
};