c语言程序中输入的问题

c语言程序中输入的问题,第1张

假设有10个数据需要输入,你可以:

-设一个循环输入这10个数据:int a[10],i; for ( i=0;i<10;i++ ) scanf("%d",&a[i]);

-在写程序时写入数值初值:int a[10]={ 1,2,3,4,5,6,7,8,9,10 };

-将数据保存在文件中,程序读出:这个程序稍微复杂,这里就不写了,如有兴趣可追问

-在程序中赋值:int a[10],i; for ( i=0;i<10;i++ ) a[i]=i;

这种行为最好不要用组合电路写,而且start还是高电平有效,任何一点噪音都会容易使低电平变成高电平,如果一定是用组合电路建议默认值用高电平,低电平start有效。其次因为总是会start,所以先要查data的变化情况,如果data是稳定的应该不会出现上面的情况;最后是按键防抖动问题

#include <stdioh>

void fun(int s[], int p1, int p2, int n);

int main()

{

  void fun(int s[], int p1, int p2, int n);

  int a[3], i, max, min;

  for (i = 0; i < 3; i++)

      scanf("%d", &a[i]);

  fun(a, &max, &min, 3);

  printf("max=%d,min=%d\n", max, min);

}

void fun(int s[], int p1, int p2, int n)

{

  int i;

  p1 = s[0], p2 = s[0];

  for (i = 1; i < n; i++)

  {

      if (p1 < s[i])

          p1 = s[i];

      if (p2 > s[i])

          p2 = s[i];

  }

}

第一,你手残或眼残,scanf里面,输入项是地址,应该是&a而不是a

第二,依旧你眼残或手残,那两个if里面,自己看去看看应该是=还是==。你丫敲的是=,赋值!

赋值表达式返回值是赋进去的值,而if判断的是逻辑真假。只要不是0都认为是真

第三,终于不是眼残手残了,是逻辑思维神经发育程度低下。

明显是不是1也不是2才说不是1或2,你逻辑结构怎么做的?

if(a==1)

说是1

if9a==2)

说是2;

else

//这个else是对哪个if的否定?代表的是什么含义?

说不是1或2;

if(a==1)

说是1

else

if(a==2)

说是2

else

说不是1或2

这样的的结构才对

或者

ifa==1)

……

if(a==2)

……

if(a<1||a>2)

……

还有,你说进入2次循环?你哪只眼看到代码里有循环的?

程序本身没有问题,是包导入的问题,就是说你的类库里面没有Scanner这个类,所以导的时候会报不能解析的错。还有关于lz的“类不是自己定义的吗?”这个问题,的确有许多类是自己定义的,但是有许多常用的类或比较底层的类java类库里已经定义好了,直接用就可以,就比如说你导用的这个Scanner类,用于控制台数据的输入,就不用自己在写了。其实java的几个版本的更新也貌似多是更新类库。具体解决办法按照6楼的方法试一试,看可以不可以。

getdata调用,传入变量a的地址

p保存主程序中变量a地址

p->s即as,p->t即at,在getdata中用scanf输入并存放到变量a的结构中

然后输出a结果中的两个变量的值(getdata函数中输入的)

如果不用getdata调用可以替换成:scanf("%s %d",as,&at);

multiplication()函数的最后一句last = i - 1;应改为arr[0] = i - 1;

因为last是临时变量,改动它没有意义,赋值到arr[0]上才能真正保存结果

不过虽然你的程序实现了一个大数与一个整数n相乘

但是最后两个大数a[]和b[]相乘的实现逻辑是有问题的

根据竖式乘法的过程,a[]和b[]相乘的流程应为:

a[]b[1]+a[]b[2]10+a[]b[3]100+

而你的实现是:a[]b[1]b[2]b[3],显然是不对的

因此改动如下:新定义shiftBits()函数实现a[]10^k,即将数组[]右移k位

新定义add()函数实现a[]和b[]相加~最终的代码为:

运行结果为:

可见成功输出了两个大数相乘的结果~

附修改后的源码:

#include <stdioh>

#include <stringh>

#define MAXSIZE 100

void preserve(int arr[], long long num) { // 大数转为数组

  int i = 1;

  do {

      arr[i++] = num % 10;

      num /= 10;

  } while (num > 0);

  arr[0] = i - 1;

}

void processCarry(int arr[]) { // 进位处理

  int i;

  for (i = 1; i <= arr[0] || arr[i] != 0; i++) {

      arr[i + 1] += arr[i] / 10;

      arr[i] %= 10;

  }

  arr[0] = i - 1; // 可能进位,更新位数

}

void shiftBits(int arr[], int res[], int k) { // arr[]依次右移k位

  int i;  

  for (i = 1; i <= arr[0]; i++)

      res[i + k] = arr[i];

  res[0] = arr[0] + k;

}

void add(int a[], int b[]) { // 两个大数相加,结果保存在a[]中

  int i;

  a[0] = a[0] > b[0] a[0] : b[0];

  for (i = 1; i <= a[0]; i++)

      a[i] += b[i];

  processCarry(a);

}

void multiplication(int a[], int b[]) { // 两个大数相乘,结果保存在a[]中

  int i, j;

  int tmp[MAXSIZE] = {0}, res[MAXSIZE] = {0}; // tmp为每位乘积结果,res为加和结果

  for (i = 1; i <= b[0]; i++) { // b[i]逐位与a[]相乘

      memset(tmp, 0, MAXSIZE);

      shiftBits(a, tmp, i - 1); // 先将a[]右移i-1位到tmp[]

      for (j = 1; j <= tmp[0]; j++) // 再逐位乘以b[i]

          tmp[j] = b[i];

      add(res, tmp);

  }

  for (i = 0; i <= res[0]; i++) // 最后将res[]复制到a[]

      a[i] = res[i];

}

int main() {

  long long i, a, b;

  int m[MAXSIZE] = {0}, n[MAXSIZE] = {0};

  printf("请输入两个大数: ");

  scanf("%lld %lld", &a, &b);

  preserve(m, a);

  preserve(n, b);

  multiplication(m, n);

  for (i = m[0]; i >= 1; i--)

      printf("%d", m[i]);

  return 0;

}

以上就是关于c语言程序中输入的问题全部的内容,包括:c语言程序中输入的问题、Verilog程序中碰到的问题、求教大佬帮忙看一下我写的C语言程序中问题在哪里等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9296649.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存